python - 我应该怎么做才能获得较低的平均损失?
问题描述
我是一名水利工程专业的学生,在实习期间研究神经网络,所以这对我来说是新事物。我创建了我的神经网络,但它给了我很大的损失,我不知道是什么问题......你可以看到代码:
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
谁能帮帮我?我该怎么做才能降低损失?
解决方案
有几个问题,无论是你的问题还是你的代码......
首先,通常我们不能说 X 值的 MSE 损失是低还是高。与定义中分类问题的准确性不同[0, 1]
,损失没有类似的界限,因此没有一般的方式可以说特定值是低还是高,正如您在此处暗示的那样(它始终取决于特定问题)。
澄清了这一点,让我们转到您的代码。
首先,从您的 来看,您loss='mean_squared_error'
似乎处于回归设置中,其中准确性毫无意义;请参阅当损失为均方误差 (MSE) 时,Keras 中的什么函数定义了准确性?. 您没有在这里分享您要解决的确切问题,但如果它确实是回归问题(即预测某个数值),您应该metrics=['accuracy']
在模型编译中去掉,并可能将最后一层更改为单个单位,即model.add(Dense(1))
。
其次,正如您当前的代码一样,您实际上并没有在每个 CV 折叠中从头开始拟合独立模型(这是 CV 的本质);在 Keras 中,累积model.fit
工作,即它不会在每次调用时“重置”模型,但它会继续从前一次调用中拟合。这就是为什么如果你看到你的,很明显模型在后面的折叠中明显更好(这已经给出了改进的提示:添加更多的时期)。要像为正确的 CV 所做的那样拟合独立模型,您应该在循环内移动。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))
推荐阅读
- html - 在这种情况下可以使用 !important 吗?
- python - Tkinter create_oval 方法不改变颜色
- javascript - 数组中有两个变量的for循环
- sql - SQL:如何在查询中根据值获取值
- c++ - 我无法在链表类中分配结构节点的变量。当我将它们分配给任何东西时,它都会产生未定义的行为
- mapbox - Mapbox-gl-js“嵌套”内部多边形不显示
- javascript - 检查 JS 是否支持 Google Pay
- java - Java Tower Of Hanoi 将数字转换为字符串
- android - Dagger/MissingBinding 但模块存在
- python - Python 执行简单代码的时间过长……可能进入了无限循环