首页 > 解决方案 > 我应该怎么做才能获得较低的平均损失?

问题描述

我是一名水利工程专业的学生,​​在实习期间研究神经网络,所以这对我来说是新事物。我创建了我的神经网络,但它给了我很大的损失,我不知道是什么问题......你可以看到代码:

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

谁能帮帮我?我该怎么做才能降低损失?

标签: pythonmachine-learningkerasdeep-learningneural-network

解决方案


有几个问题,无论是你的问题还是你的代码......

首先,通常我们不能说 X 值的 MSE 损失是低还是高。与定义中分类问题的准确性不同[0, 1],损失没有类似的界限,因此没有一般的方式可以说特定值是低还是高,正如您在此处暗示的那样(它始终取决于特定问题)。

澄清了这一点,让我们转到您的代码。

首先,从您的 来看,您loss='mean_squared_error'似乎处于回归设置中,其中准确性毫无意义;请参阅当损失为均方误差 (MSE) 时,Keras 中的什么函数定义了准确性?. 您没有在这里分享您要解决的确切问题,但如果它确实是回归问题(即预测某个数值),您应该metrics=['accuracy']在模型编译中去掉,并可能将最后一层更改为单个单位,即model.add(Dense(1))

其次,正如您当前的代码一样,您实际上并没有在每个 CV 折叠中从头开始拟合独立模型(这是 CV 的本质);在 Keras 中,累积model.fit工作,即它不会在每次调用时“重置”模型,但它会继续从前一次调用中拟合。这就是为什么如果你看到你的,很明显模型在后面的折叠中明显更好(这已经给出了改进的提示:添加更多的时期)。要像为正确的 CV 所做的那样拟合独立模型,您应该在循环内移动。scorescreate_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))

推荐阅读