import tensorflow as tfimport tensorflow.kerasfrom tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2Dimport pickleimport numpy as npfrom keras.models import model_from_jsonfrom keras.models import load_modelimport matplotlib.pyplot as plt# 打开数据文件X = pickle.load(open("X.pickle", "rb"))y = pickle.load(open("y.pickle", "rb"))# 归一化数据(像素值从0到255)X = X/255.0# 构建模型model = Sequential()# 3个卷积层model.add(Conv2D(32, (3, 3), input_shape = X.shape[1:]))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3, 3)))model.add(Activation("relu"))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Dropout(0.9))# 5个隐藏层model.add(Flatten())model.add(Dense(128))model.add(Activation("relu"))model.add(Dense(128))model.add(Activation("relu"))model.add(Dense(128))model.add(Activation("relu"))model.add(Dense(128))model.add(Activation("relu"))model.add(Dense(128))model.add(Activation("relu"))# 输出层有7个神经元,对应7个类别model.add(Dense(13))model.add(Activation("softmax"))# 使用一些基本参数编译模型model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])# 训练模型,迭代40次# validation_split 对应于用于验证阶段的图像百分比与所有图像的比率print("X = " + str(len(X)))print("y = " + str(len(y)))history = model.fit(X, y, batch_size=32, epochs=1000, validation_split=0.1)# 保存模型model_json = model.to_json()with open("model.json", "w") as json_file : json_file.write(model_json)model.save_weights("model.h5")print("模型已保存到磁盘")model.save('CNN.model')# 打印展示训练过程中准确率变化的图表print(history.history.keys())plt.show()plt.plot(history.history['accuracy'])plt.plot(history.history['loss'])plt.title('模型准确率')plt.ylabel('准确率')plt.xlabel('轮次')plt.legend(['训练', '验证'], loc='upper left')plt.show()
问题是,我的训练损失较低,但验证准确率非常高,验证准确率也极低。我该如何解决这个问题?我已经尝试将drop值增加到0.9,但损失仍然很高。我还尝试使用线性函数作为激活函数,但没有效果。
请帮助我。
回答:
正如已经提到的,如果没有看到数据,很难给出好的建议。
我会尝试以下方法: – 移除最大池化层后的Dropout – 移除一些密集层 – 在密集层之间添加Dropout
如果仍然过拟合,可以在密集层之间添加Dropout
编辑:在我看到损失和准确率图表后,我建议如下:
- 最优先考虑的是,获取更多的数据。
- 然后使用数据增强来进一步扩大你的数据集
- 如果增加数据没有帮助,再进一步降低神经网络的复杂度(但我认为随着数据的增加,训练速度会变慢,验证损失也会在一段较长的轮次中减少)