Keras的Resnet调整不合身或过度合身:如何平衡训练?

时间:2019-04-17 14:12:23

标签: tensorflow keras deep-learning resnet finetunning

我正在对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
                    )

等等。每次验证都没有改进

1 个答案:

答案 0 :(得分:0)

您有很多选择,但是确实尝试过early stopping?,或者可以尝试做一些data augmentation,或者使用更简单的模型进行测试。