我是水工专业的学生,在我的实习中致力于神经网络的研究,因此对我来说是新事物。 我创建了神经网络,但它给我带来了很大的损失,我不知道这是什么问题...您可以看到代码:
def create_model():
model = Sequential()
# Adding the input layer
model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
# Adding the hidden layer
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
# Adding the output layer
model.add(Dense(2))
# Compiling the RNN
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
return model
kf = KFold(n_splits = 5, shuffle = True)
model = create_model()
scores = []
for i in range(5):
result = next(kf.split(data_input), None)
input_train = data_input[result[0]]
input_test = data_input[result[1]]
output_train = data_output[result[0]]
output_test = data_output[result[1]]
# Fitting the RNN to the Training set
model.fit(input_train, output_train, epochs=5000, batch_size=200 ,verbose=2)
predictions = model.predict(input_test)
scores.append(model.evaluate(input_test, output_test))
print('Scores from each Iteration: ', scores)
print('Average K-Fold Score :' , np.mean(scores))
当我执行代码时,结果就像:
Scores from each Iteration: [[93.90406122928908, 0.8907562990148529], [89.5892979597845, 0.8907563030218878], [81.26530176050522, 0.9327731132507324], [56.46526102659081, 0.9495798339362905], [54.314151876112994, 0.9579831877676379]]
Average K-Fold Score : 38.0159922589274
有人可以帮我吗?我该如何降低损失呢?
答案 0 :(得分:0)
您的问题和代码都有几个问题...
首先,我们通常不能说X的MSE损失是低还是高。与[0, 1]
中定义的分类问题的准确性不同,损失没有类似的界限,因此,没有 general 可以说特定值是低还是高暗示在这里(它总是取决于特定的问题)。
我们已经澄清了这一点,让我们看一下代码。
首先,从您的loss='mean_squared_error'
来看,您似乎处在回归设置中,其中准确性没有意义;参见What function defines accuracy in Keras when the loss is mean squared error (MSE)?。您尚未在此处分享要解决的确切问题,但是,如果确实是一个回归问题(即对某个数值的预测),则应在模型编译中摆脱metrics=['accuracy']
,并可能更改您的模型最后一层到一个单位,即model.add(Dense(1))
。
第二,正如您当前的代码一样,您实际上并没有在每个CV折叠中完全从头开始安装独立模型(这是CV的非常本质) ;在Keras中,model.fit
是累积地起作用的,即,它不会在每次调用时“重置”模型,但会从上一次调用中继续拟合。这就是为什么如果您看到scores
的原因,很明显该模型在以后的折叠中明显更好(这已经为改进提供了提示:添加更多的纪元)。为了适合独立模型,就像您为适当的简历所做的那样,应在create_model()
循环内for
内移动。
第三,这里使用np.mean()
也是没有意义的,因为您将损失和的准确度(即苹果和橙子)平均在一起;从54到94之间的5个损失值中,您最终得到“平均值” 38的事实应该已经使您警觉到您正在尝试某些错误。事实是,如果您不理会上述准确性指标,那么这里就不会出现此问题。
总而言之,这似乎是您的代码原则上的样子(但同样,对于您要解决的确切问题,我丝毫没有丝毫想法,因此有些细节可能会有所不同):
def create_model():
model = Sequential()
# Adding the input layer
model.add(Dense(26,activation='relu',input_shape=(n_cols,)))
# Adding the hidden layer
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
model.add(Dense(60,activation='relu'))
# Adding the output layer
model.add(Dense(1)) # change to 1 unit
# Compiling the RNN
model.compile(optimizer='adam', loss='mean_squared_error') # dismiss accuracy
return model
kf = KFold(n_splits = 5, shuffle = True)
scores = []
for i in range(5):
result = next(kf.split(data_input), None)
input_train = data_input[result[0]]
input_test = data_input[result[1]]
output_train = data_output[result[0]]
output_test = data_output[result[1]]
# Fitting the RNN to the Training set
model = create_model() # move create_model here
model.fit(input_train, output_train, epochs=10000, batch_size=200 ,verbose=2) # increase the epochs
predictions = model.predict(input_test)
scores.append(model.evaluate(input_test, output_test))
print('Loss from each Iteration: ', scores)
print('Average K-Fold Loss :' , np.mean(scores))