为什么训练和误差损失相似?

问题描述

我正在运行一个代码来对手势进行分类。模型代码如下:

model_d = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=X_train.shape[1:]),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(units=25,activation='relu',kernel_initializer=tf.keras.initializers.Glorotnormal(seed=1)),tf.keras.layers.Dense(units=12,tf.keras.layers.Dense(units=6,activation='softmax',kernel_initializer=tf.keras.initializers.Glorotnormal(seed=1))
])

print(model_d.summary())

为了编译,我写了以下几行:

opt = tf.keras.optimizers.Adam(learning_rate=0.0001)
model_d.compile(optimizer=opt,loss = 'categorical_crossentropy',metrics=['accuracy'])

当我使用以下代码训练模型时:

history_d = model_d.fit(x=X_train,y=y_train,epochs=1500,batch_size=32,verbose=0)
plt.figure(figsize=(10,7))
plt.plot(history_d.history['loss'])
plt.plot
(history_d.history['accuracy'])
plt.legend(['Loss','Accuracy'])
plt.title('Loss and Accuracy Plot for Learning Rate 0.001',size=14,weight='bold')
plt.grid('major')
plt.grid('minor')
plt.show()

我得到以下误差和准确度图:

enter image description here

当我评估模型时,使用以下代码行:

print('The print accuracy is {:.3f}%'.format(model_d.evaluate(x=X_train,verbose=0)[1]*100))
print('The print accuracy is {:.3f}%'.format(model_d.evaluate(x=X_test,y=y_test,verbose=0)[1]*100))

我对训练和测试数据获得了相同的准确率;即 16.667%。

请注意,当我在不使用 dropout 层的情况下运行相同的代码时,我得到了 83% 的训练和 68% 的测试准确率。我是深度学习领域的新手;因此,请原谅我的无知。

解决方法

Dropout 用于泛化(或降低过拟合),但我猜你的网络很弱(它只有几层,每层只有几个神经元,你的问题有点难以解决)所以它应该努力工作,用尽全力去取得好成绩。在这种情况下,Dropout 会关闭 20% 的神经元,并使网络更难做它想做的事。

我不确定这是否是原因,所以通过增加复杂性(增加神经元数量)来测试它,看看有 dropout 的网络是否可以获得一些好的结果(请告诉我)。

当您的网络足够复杂并且过度拟合时,我建议使用 Dropout