我正在尝试建立一个分类器来区分3个类别(手掌,拳头和其他)。我有一个小数据集,所以我使用扩充。没有增加的收集数据集分别具有(914,887,983)样本。增强后(5481,4752,4081)样品。我使用image-aug来获取增强图像。
我跟着" Building powerful image classification models using very little data"来自Keras的教程,但模型过于贴合,我该如何解决这个问题呢?
我正在使用学习率较低的Adam优化器(lr = 1e-5)。并且只冻结前15层而不是25层。
- 编辑 -
逐渐退出的小型模特。
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(img_height, img_width,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(Dropout(0.2))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nClasses, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
结果并不好。尽管测试和验证集来自同一分布,但该模型在97%的测试集上表现非常出色。
我在较小的网络上尝试了学习率较低的亚当
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(img_height, img_width,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Dropout(0.3))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nClasses, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=1e-6),#optimizer='rmsprop',
metrics=['accuracy'])