我正在训练使用CNN的服装分类算法。我有大约60000张图像用于10个课程的训练(以80:20的比例进行训练和验证)。分离10000张图像进行测试。
训练准确性会随着时间的推移而提高,但验证准确性却保持不变。训练损失也减少,但验证损失保持不变。
img_width, img_height = 28, 28
batch_size = 32
samples_per_epoch = 20000
validation_steps = 300
nb_filters1 = 32
nb_filters2 = 64
nb_filters3 = 128
conv1_size = 3
conv2_size = 2
pool_size = 2
classes_num = 10
epochs = 300
#learning_rate = 0.001
learning_rate = 0.01
decay_rate = learning_rate / epochs
momentum = 0.8
sgd = SGD(lr=learning_rate, momentum=momentum, decay=decay_rate,
nesterov=True)
model = Sequential()
model.add(
Convolution2D(nb_filters1, conv1_size, conv1_size, border_mode="same",
input_shape=(img_width, img_height, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(pool_size, pool_size)))
model.add(Convolution2D(nb_filters2, conv2_size, conv2_size,
border_mode="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(pool_size, pool_size), dim_ordering='th'))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(classes_num, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
train_datagen = ImageDataGenerator(
rescale=1. / 255,
horizontal_flip=True
)
达到的训练精度:约96% 验证准确性达到:约92% 测试精度:大约87%
我的问题:我该怎么做才能提高验证准确性或最大程度地减少验证损失?可以进行哪些更改来改进它?
答案 0 :(得分:3)
您遇到的事物称为Overfitting。 您可以添加更多正则化。最简单的方法是添加另一个Dropout层。
from keras.layers import Dropout
***
model = Sequential()
model.add(
Convolution2D(nb_filters1, conv1_size, conv1_size, border_mode="same",
input_shape=(img_width, img_height, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(pool_size, pool_size)))
model.add(Dropout(0.3) # <- THIS IS ADDED
model.add(Flatten())
***
0.3是将乘以0的神经元数量,因此其值将不包含在后续计算中。您可以尝试添加其他Dropout层并更改其值。您还可以在图层上添加一些偏差,请参见https://keras.io/regularizers/。