我在使用带有 Theano 后端的 Keras 时遇到了我的 CNN 问题。基本上,我需要将 340x340 灰度图像分为 6 个类别。问题是我的 CNN 给出了太“硬”的概率,例如它很少给出带有一些不确定性的预测,并且总是试图为一个类争取 90%+。问题是,对于我的课程作业,对于完全未命中分类所使用的惩罚非常苛刻,并且更倾向于不确定性。(所以有一个像 [0.6, 0.3, 0.2, ...] 的预测比有 [0.9,0.03,0.02,..] 好得多。
我不确定为什么会这样。我的数据集包含 2400 张来自不同闭路电视的图像,任务是识别可能的对象。只有 800 个样本实际上来自数据,其他 1600 个样本是通过数据增强生成的。请注意,因此极有可能某些图片相同或极其相似(例如,同一场景,一秒钟后)
model = Sequential()
#1
# Few filter to take big stuff out
# Also, first layer is not conv so that I can reuse that layer separately
model.add(Dropout(0.1, input_shape=(1,340,340)))
model.add(Convolution2D(64, 4, 4, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
#2
model.add(Dropout(0.1))
model.add(Convolution2D(128, 4, 4, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
#3
model.add(Dropout(0.1))
model.add(Convolution2D(256, 4, 4, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
#4
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
#5
model.add(Dense(512))
model.add(Activation('relu'))
#6
model.add(Dense(6))
model.add(Activation('softmax'))
opt = SGD(lr=0.001)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
print "Training.."
filepath = "log/weights-improvement-{epoch:02d}---{val_acc:.2f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
model.fit(X_t, y_t, validation_split=0.1, nb_epoch=500, batch_size=32, callbacks=callbacks_list)
你建议我如何解决这个问题?先感谢您!