我正在使用 Keras 中的 CNN 在 tensorflow 后端处理街景门牌号码数据集。我对为什么网络损失没有减少有疑问,我怀疑我是否使用了正确的损失函数。首先我预处理数据集,所以我的训练和测试数据集形状是:
('Training set and labels', (26721,32,32,1), (26721, 6) )
('Validation set and labels ', (6680,32,32,1), (6680,6) )
('Test set and labels', (13068,32,32,1), (13068,6) )
标签数组有 6 列的原因,因为一张图像中的最大位数为 6。假设图像有 2 个数字“1 和 2”,则标签数组被认为是 [1,2,10,10,10,10] ,其中 10 表示没有数字。
现在这是我的模型定义:
def modelCNN(input_shape, num_classes):
model = Sequential()
model.add(Convolution2D(16, 7, 4, border_mode='same',
input_shape=input_shape))
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), border_mode='same'))
model.add(BatchNormalization())
model.add(Convolution2D(32, 5, 3, border_mode='same'))
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), border_mode='same'))
model.add(BatchNormalization())
model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(PReLU())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode='same'))
model.add(Flatten())
model.add(Dense(512))
model.add(PReLU())
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
return model
我尝试了不同的海关模式,但似乎没有任何效果。我像这样进行编译、丢失和优化:
model.compile(optimizer='adam', loss='categorical_crossentropy',
metrics=['accuracy'])
print(model.summary())
csv_logger = CSVLogger('training.log')
early_stop = EarlyStopping('val_acc', patience=200, verbose=1)
model_checkpoint = ModelCheckpoint(model_save_path,
'val_acc', verbose=0,
save_best_only=True)
model_callbacks = [early_stop, model_checkpoint, csv_logger]
K.get_session().run(tf.global_variables_initializer())
model.fit_generator(train,
samples_per_epoch=np.ceil(len(train_dataset)/batch_size),
epochs=num_epochs,
verbose=1,
validation_data=valid,
validation_steps=batch_size,
callbacks=model_callbacks)
现在,我认为categorical_crossentropy损失需要一个热向量表示,但我不确定我应该如何转换我的标签数组。因为与 Mnist 数据集不同,我在每个图像中有多个标签。
我可以使用任何损失函数吗?或者有什么建议可以让事情顺利进行吗?
注意:我使用 CNN 仅用于分类,而不用于检测。
首先十分感谢