我应该怎么做才能降低平均损失?

时间:2019-03-19 16:16:14

标签: python-3.x machine-learning keras neural-network

我是水工专业的学生,​​在我的实习中致力于神经网络的研究,因此对我来说是新事物。 我创建了神经网络,但它给我带来了很大的损失,我不知道这是什么问题...您可以看到代码:

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

有人可以帮我吗?我该如何降低损失呢?

1 个答案:

答案 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))