为什么我的训练和验证损失没有改变?

数据挖掘 机器学习 深度学习 自动编码器
2021-10-10 10:27:54

我使用了 MSE 损失函数,SGD 优化:

xtrain = data.reshape(21168, 21, 21, 21,1)    
inp = Input(shape=(21, 21, 21,1))
x = Conv3D(filters=512, kernel_size=(3, 3, 3), activation='relu',padding='same')(inp)
x = MaxPool3D(pool_size=(3, 3, 3),padding='same')(x)
x = Conv3D(filters=512, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)
x = Conv3D(filters=256, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)
encoded = Conv3D(filters=128, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)

print ("shape of decoded", K.int_shape(encoded))

x = Conv3D(filters=512, kernel_size=(3, 3, 3), activation='relu',padding='same')(encoded)
x = Conv3D(filters=256, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)
x = Conv3D(filters=512, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)
x = Conv3D(filters=512, kernel_size=(3, 3, 3), activation='relu',padding='same')(x)
x = UpSampling3D((3, 3, 3))(x)

decoded = Conv3D(filters=1, kernel_size=(3, 3, 3), activation='relu', 
padding='same')(x)

print ("shape of decoded", K.int_shape(decoded))

autoencoder = Model(inp, decoded)
autoencoder.compile(optimizer='sgd', loss='mse')
autoencoder.fit(xtrain, xtrain,
                epochs=30,
                batch_size=32,
                shuffle=True,
                validation_split=0.2
                )  

Epoch 1/30
16934/16934 [==============================] - 446s - loss: 34552663732314849715                                                                                                                     15904.0000 - val_loss: 1893.9425
Epoch 2/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 3/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 4/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 5/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 6/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 7/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 8/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 9/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 10/30
16934/16934 [==============================] - 444s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 11/30
16934/16934 [==============================] - 445s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 12/30
16934/16934 [==============================] - 445s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 13/30
16934/16934 [==============================] - 445s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 14/30
16934/16934 [==============================] - 445s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
Epoch 15/30
16934/16934 [==============================] - 445s - loss: 1896.7580 - val_loss                                                                                                                     : 1893.9425
2个回答

你的权重在训练过程中发生了分歧,结果网络基本上被破坏了。由于它由 ReLU 组成,我预计第一个 epoch 的巨大损失会导致更新将大部分 ReLU 激活归零。这被称为Dying ReLU 问题,虽然这里的问题不一定是 ReLU 的选择,但您可能会在隐藏层中的其他激活中遇到类似的问题。

您需要调低一些可能导致如此大的初始损失的数字,并且可能还使权重更新更小:

  • 规范化您的输入数据。自动编码器试图匹配输入,如果这里的数字很大,这会乘以很大的损失。如果输入可以具有负值(自然或由于归一化),那么您不应该在输出层中激活 ReLU,否则自动编码器无法匹配输入和输出值 - 在这种情况下,只有线性输出层。

  • 降低学习率——在 Keras SGD 中有默认值lr=0.01,尝试降低例如lr=0.0001还要考虑一个比普通 SGD 更复杂的优化器,可能是 Adam、Adagrad 或 RMSProp。

  • 添加一些保守的权重初始化。在 Keras 中,您可以设置权重初始化器 - 请参阅https://keras.io/initializers/ - 但是,在您的情况下,默认值glorot_uniform应该已经可以了,所以也许您不需要这样做。

我还想添加一个额外的细节:检查你的模型没有产生 NaN 或无穷大。这在最小值和最大值都等于 0 的 minmax 归一化过程中很容易发生,或者如果数据只是简单地包含 inf/NaN。

这尤其令人讨厌,因为通常如果这种情况发生在 CPU 上,您的损失将简单地读取“NaN”,提醒您有问题。但是,如果您在 GPU 上进行训练,则不会显示为 NaN