几天来,我一直在尝试在大数据上训练CNN模型以进行火灾探测...
但是,尽管它提供了不错的验证性能,但测试成绩还是很遗憾的。今天,我决定只用10张图片,第1类4个,第2类3个和第3类3个模型训练模型,而没有验证数据。我认为它会很快收敛,但不会收敛。我启动了300个纪元,需要等待154个纪元才能看到> 0.9的准确性值。但是,只有(299,299,3)
大小的10张图像,而Xception是由数百万个参数组成的,因此我期望它很快过拟合,但不会...
我正在使用交叉熵损失函数和rmsprop优化器,学习速率为10^-4
。实际上,我在imagenet
数据集上使用了预训练模型,然后应用fit_transform。
这是代码的一部分:
base_model_xception = Xception(include_top=False, weights='imagenet', input_shape=(299,299,3)) # Xception
x = base_model_xception.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(num_classes, activation='softmax')(x)
model_xception = Model(inputs=base_model_xception.inputs, outputs=predictions)
然后:
for layer in model.layers:
layer.trainable = True
# recompiler
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
mcp_save = ModelCheckpoint('result/'+model_name+'.hdf5', save_best_only=True, monitor='loss', mode='min',verbose=1)
hist = model.fit_generator(
generator=generate_from_paths_and_labels(
input_paths=train_input_paths,
labels=train_labels,
batch_size=batch_size_fine,
input_size=input_size_model, fct=function),
steps_per_epoch=math.ceil(len(train_input_paths) / batch_size_fine),
epochs=epochs_fine,
# validation_data=generate_from_paths_and_labels(
# input_paths=val_input_paths,
# labels=val_labels,
# batch_size=batch_size_fine,
# input_size=input_size_model,fct=function),
# validation_steps=math.ceil(len(val_input_paths) / batch_size_fine),
verbose=1,
callbacks=[
# EarlyStopping(monitor='acc',min_delta=0.001,patience=3,verbose=1,mode='auto'),
mcp_save
],
)
为什么收敛这么慢?是否因为我在不同的图像上使用了预训练模型? 确实,在这里我只训练了10张图像,但是如果我训练大量的数据,我将无法承受如此缓慢的收敛速度...