Keras 损失函数不会因均方误差而减少

Posted

技术标签:

【中文标题】Keras 损失函数不会因均方误差而减少【英文标题】:Keras loss function does not decrease on mean squared error 【发布时间】:2019-05-23 14:58:43 【问题描述】:

我使用 Keras 实现了一个神经网络来预测项目的评分。我将每个评分视为一个类,所以这是我的代码(outputY 是分类的):

inputLayerU = Input(shape=(features,))
inputLayerM = Input(shape=(features,))
dense1 = Dense(features, activation='relu')
denseU = dense1(inputLayerU)         
denseM = dense1(inputLayerM)    
concatLayer = concatenate([denseU, denseM], axis = 1)
denseLayer = Dense(features*2, activation='relu')(concatLayer)
outputLayer = Dense(5, activation='softmax')(denseLayer)

model = Model(inputs=[inputLayerU, inputLayerM], outputs=outputLayer)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.01), metrics=['accuracy'])

model.fit([inputU, inputM],outputY , epochs=10, steps_per_epoch=10)

当我训练这个网络时,我得到以下结果,这很好:

10/10 [==============================] - 2s 187ms/step - loss: 1.4778 - acc: 0.3209
Epoch 2/10
10/10 [==============================] - 0s 49ms/step - loss: 1.4058 - acc: 0.3625
Epoch 3/10
10/10 [==============================] - 1s 54ms/step - loss: 1.3825 - acc: 0.3824
Epoch 4/10
10/10 [==============================] - 0s 47ms/step - loss: 1.3614 - acc: 0.3923
Epoch 5/10
10/10 [==============================] - 0s 48ms/step - loss: 1.3372 - acc: 0.4060
Epoch 6/10
10/10 [==============================] - 0s 45ms/step - loss: 1.3138 - acc: 0.4202
Epoch 7/10
10/10 [==============================] - 0s 46ms/step - loss: 1.2976 - acc: 0.4266
Epoch 8/10
10/10 [==============================] - 0s 48ms/step - loss: 1.2842 - acc: 0.4325
Epoch 9/10
10/10 [==============================] - 1s 62ms/step - loss: 1.2729 - acc: 0.4402
Epoch 10/10
10/10 [==============================] - 1s 54ms/step - loss: 1.2631 - acc: 0.4464

然后我将问题视为回归并尝试预测用户评分的值(我需要计算两种方式的误差)。所以这是我的代码:

inputLayerU = Input(shape=(features,))
inputLayerM = Input(shape=(features,))
dense1 = Dense(features, activation='relu')
denseU = dense1(inputLayerU)         
denseM = dense1(inputLayerM)    
concatLayer = concatenate([denseU, denseM], axis = 1)
denseLayer = Dense(features*2, activation='relu')(concatLayer)
outputLayer = Dense(1, activation='softmax')(denseLayer)

model = Model(inputs=[inputLayerU, inputLayerM], outputs=outputLayer)
model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.01), metrics=['accuracy'])

model.fit([inputU, inputM],outputY , epochs=10, steps_per_epoch=10)

我得到了这个结果:

Epoch 1/10
10/10 [==============================] - 9s 894ms/step - loss: 7.9451 - acc: 0.0563
Epoch 2/10
10/10 [==============================] - 7s 711ms/step - loss: 7.9447 - acc: 0.0563
Epoch 3/10
10/10 [==============================] - 7s 709ms/step - loss: 7.9446 - acc: 0.0563
Epoch 4/10
10/10 [==============================] - 7s 710ms/step - loss: 7.9446 - acc: 0.0563
Epoch 5/10
10/10 [==============================] - 7s 702ms/step - loss: 7.9446 - acc: 0.0563
Epoch 6/10
10/10 [==============================] - 7s 706ms/step - loss: 7.9446 - acc: 0.0563
Epoch 7/10
10/10 [==============================] - 7s 701ms/step - loss: 7.9446 - acc: 0.0563
Epoch 8/10
10/10 [==============================] - 7s 702ms/step - loss: 7.9446 - acc: 0.0563
Epoch 9/10
10/10 [==============================] - 7s 717ms/step - loss: 7.9446 - acc: 0.0563
Epoch 10/10
10/10 [==============================] - 7s 700ms/step - loss: 7.9446 - acc: 0.0563

如您所见,它会稍微减少,但有时它根本不会改变。

那么我的回归有什么问题?

【问题讨论】:

【参考方案1】:

首先,我不确定我们是否应该将 softmax 函数应用于回归问题,其次尝试使用带有默认参数的 Adam 优化器。

【讨论】:

你是对的,问题是激活函数。我删除它以获得确切的输出值,问题就解决了。

以上是关于Keras 损失函数不会因均方误差而减少的主要内容,如果未能解决你的问题,请参考以下文章

keras中的加权mse自定义损失函数

tf.keras中度量和损失MSE之间的差异[重复]

多输出 Keras 的回归损失函数

Keras深度学习实战——深度学习中常用激活函数和损失函数详解

Keras 自定义损失(chi2)线性回归

Tensorflow 均方误差损失函数