我是ML的新手,我正在尝试为某些图像拟合模型以进行二进制分类。我为这两个类别中的每个类别都有550张图像的数据集,并且我使用每个类别的100张图像进行验证我使用数据和张量板的增强来可视化准确度和损失。我的损失函数是'binary_crossentropy'并且我使用'rmsprop'作为优化器。我在此处编写代码的图像是我的精度仍然在49到52之间前3个时期上升到第5个时期的95%,但在第8个时期下降到50%,这个上升和下降也发生在下一个时期。我也提供了张量板直到第8个时期的图像。 kaggle猫和狗的分类效果很好,准确度超过86%。我认为我的问题出在我的数据上,因为每个类别中的图像都非常不同,但有时同一类别中的我不能说两个图像是否不相同(虽然不是,但是非常相似)。如果有人可以回答我该怎么办,我将不胜感激。
https://i.imgur.com/jLJwnWN.png
https://i.imgur.com/94odStK.png
https://i.imgur.com/xUE9K4a.png
https://i.imgur.com/gGy3hO7.png
我尝试添加和删除一些图层,但是没有用
我试图更改批量大小,但我认为这并不重要,但仍然会发生相同的事情。
我也尝试更改输入尺寸。我的图像实际上是720 * 500 bu,我在这里尝试了不同的输入。它不起作用:
model = Sequential()
model.add(Conv2D(32, (3, 3),input_shape=(300,300,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (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(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
batch_size = 10
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator =
train_datagen.flow_from_directory('castData/train-set',
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(,
target_size=(300, 300),
batch_size=batch_size,
class_mode='binary')
model.fit_generator(
train_generator,
steps_per_epoch=1075 ,
epochs=50,
validation_data=validation_generator,validation_steps=200,
callbacks=[tensorboard_cb])
答案 0 :(得分:2)
确实是奇怪的行为。
我不会使用平坦层,而是使用GlobalAveragePooling2D或GlobalMaxPooling2D
from keras.layers import GlobalAveragePooling2D
model = Sequential()
model.add(Conv2D(32, (3, 3),input_shape=(300,300,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (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(GlobalAveragePooling2D())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
如果这行不通,请尝试降低学习率
from keras.optimizers import RMSprop
model.compile(loss='binary_crossentropy',optimizer=RMSprop(lr=0.0001),metrics=['accuracy'])