我正在对Keras的Resnet进行微调,使其经过imagenet数据的预训练,以便与其他图像数据集进行特定的分类。我的模型结构如下:Resnet接受输入,在Resnet的顶部,我添加了自己的分类器。在我尝试过的所有实验中,模型要么拟合不足,要么拟合过度。
我主要尝试了两种方法:
将一定数量的app.post('/movielist/addMovie',(req, res) => {
mysqlConnection.query("INSERT INTO movielist (`idmovielist`,`name`,`thumnail_path`,`description`,`language_released`,`year_released`) VALUES ('64','DudeLove','wfburfr.jpg','silly','2019','english')",
req.body,
(err,rows) => {
if (!err) {
res.send("Movie is added");
} else {
console.log(err);
}
});
});
层阻止为输入,而不是在训练过程中对其进行更新。尤其是Resnet有175层,我尝试使用n
= 0、10、30、50、80、175。在所有这些情况下,模型都不适合,在训练集上获得的精度最多等于0.75,而验证值最高为0.51。
阻塞所有批处理归一化层,并在开始时像以前一样阻塞一些n
层,n
= 0、10、30、50。在这些情况下,模型过拟合,在训练集上获得的准确度超过0.95,但在验证上获得的准确度约为0.5。
请注意,从Resnet更改为InceptionV3,并阻塞了50层,我在验证集和测试集上的准确性都超过0.95。
这是我代码的主要部分:
n
任何人都可以建议如何找到一个稳定的解决方案,该解决方案可以学到一些东西但又不会过度拟合吗?
编辑: 训练阶段的输出是这样的:
inc_model = ResNet50(weights='imagenet',
include_top=False,
input_shape=(IMG_HEIGHT, IMG_WIDTH, 3))
print("number of layers:", len(inc_model.layers)) #175
#Adding custom Layers
x = inc_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.5)(x)
x = Dense(512, activation="relu")(x)
predictions = Dense(2, activation="softmax")(x)
model_ = Model(inputs=inc_model.input, outputs=predictions)
# fine tuning 1
for layer in inc_model.layers[:30]:
layer.trainable = False
# fine tuning 2
for layer in inc_model.layers:
if 'bn' in layer.name:
layer.trainable = False
# compile the model
model_.compile(optimizer=SGD(lr=0.0001, momentum=0.9)
, loss='categorical_crossentropy'
, metrics=['accuracy'])
checkpointer = ModelCheckpoint(filepath='weights.best.inc.male.resnet.hdf5',
verbose=1, save_best_only=True)
hist = model_.fit_generator(train_generator
, validation_data = (x_valid, y_valid)
, steps_per_epoch= TRAINING_SAMPLES/BATCH_SIZE
, epochs= NUM_EPOCHS
, callbacks=[checkpointer]
, verbose=1
)
等等。每次验证都没有改进