为啥我的 acc 总是更高但我的 val_acc 很小?
Posted
技术标签:
【中文标题】为啥我的 acc 总是更高但我的 val_acc 很小?【英文标题】:Why my acc always higher but my val_acc is very small?为什么我的 acc 总是更高但我的 val_acc 很小? 【发布时间】:2019-12-29 07:56:37 【问题描述】:我尝试训练 14000 个训练数据集和 3500 个验证数据集,但是为什么每次训练我总是得到高精度结果而验证部分非常小
所以如果我希望验证的结果接近训练的准确度该怎么办 并为每个时代提供重要的补充
一定要加减什么吗? [抱歉英语不好]
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
classifier = Sequential()
classifier.add(Conv2D(16, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
`classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))`
classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
from keras.callbacks import TensorBoard
# Use TensorBoard
callbacks = TensorBoard(log_dir='./Graph')
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
classifier.fit_generator(training_set,
steps_per_epoch = 100,
epochs = 200,
validation_data = test_set,
validation_steps = 200)
classifier.save('model.h5')
我得到了这个结果(对不起,我不知道如何把图片放在这里)
198/200 纪元 100/100 [===============================] - 114s 1s/step - loss: 0.1032 - acc: 0.9619 - val_loss : 1.1953 - val_acc: 0.7160
199/200 纪元 100/100 [==============================] - 115s 1s/步 - 损失:0.1107 - acc: 0.9591 - val_loss : 1.4148 - val_acc: 0.6702
200/200 纪元 100/100 [===============================] - 112s 1s/step - loss: 0.1229 - acc: 0.9528 - val_loss : 1.2995 - val_acc: 0.6928
【问题讨论】:
检查简化模型的架构是否有帮助。 【参考方案1】:当你的训练准确率很高,但你的验证准确率很低时,你有overfitted你的模型。简单地说,您的模型已经了解了训练数据的结构,但无法对其进行概括。为了减少过拟合,可以尝试
简化您的模型, 在一些层引入dropout, 使用更大的训练批次。【讨论】:
如何简化我的模型?是不是像减少卷积量一样? 是的,要么删除一些隐藏层,要么减少其中的神经元数量。以上是关于为啥我的 acc 总是更高但我的 val_acc 很小?的主要内容,如果未能解决你的问题,请参考以下文章
如何理解 Keras 模型拟合中的 loss acc val_loss val_acc