keras 使用迁移学习时准确度非常低(~0.01)

j13ufse2  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(226)

bounty还有4天到期。回答此问题可获得+50声望奖励。vivian.ai正在寻找来自信誉良好来源的答案:迁移学习:精度非常低并且没有增加。

Dog Breed Classification . kaggle notebook上工作。模型的精度非常非常低(小于0.01)并且没有增加。

base_model = keras.applications.Xception(
    weights="imagenet",
    include_top=False
)

inputs = tf.keras.Input(shape=(224, 224, 3))
x = data_augmentation(inputs)
x = preprocess_input(x)
x = base_model(x) # non-trainable
x = global_avg(x)
x = tf.keras.layers.Dropout(0.3)(x)
outputs = prediction_layer(x) #120 classes so 120 units
model = tf.keras.Model(inputs, outputs)

model.compile(optimizer=keras.optimizers.SGD(learning_rate=1, momentum=0.9),
              loss="sparse_categorical_crossentropy",
              metrics=['accuracy'])

history = model.fit(
    train_ds,
    epochs=50,
    validation_data=valid_ds,
    class_weight=class_weight
)

我看了keras github所以尝试

for layer in base_model.layers:
    if "batch_norm" not in str(layer):
        layer.trainable = False

但没有改善。

oogrdqng

oogrdqng1#

先尝试无dropout
特别是当你的模型看起来没有学习的时候,没有很好的解释在你的模型架构中已经有了dropout。正则化排在第二位,然后从更小的dropout率开始。
重新配置优化程序
学习率为1的SGD可能会对你的体重造成很大的影响。尝试使用ADAM及其默认学习率
可训练假
一定要让base_model的权重trainable=False,这是迁移学习的要点。Trainable true可以在其他一切正常并且数据集足够大,可以合理地训练imagenet的所有权重时设置(我怀疑-不知道你的数据集)。
验证数据
检查你的验证数据是什么样子的,并确保那里的样本是合理的,没有标签切换或类似的错误发生。

ve7v8dk2

ve7v8dk22#

除了上面提到的,你可以尝试以下方法,看看是否有改善:
1.使用回调函数'ReduceLROnPlateau'来根据需要增加或减少学习率:
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1,patience=5, min_lr=0.00001, mode='auto')
1.在训练模型之前设置这些设置(根据变量名称和批量大小值进行替换):
STEPS_PER_EPOCHS = training_set.n//training_set.batch_size
VALIDATION_STEPS = validation_set.n//validation_set.batch_size
1.修改拟合函数以适应回调函数:

history = model.fit(
           train_ds,
           epochs=50,
           validation_data=valid_ds,
           class_weight=class_weight,
           steps_per_epoch=STEPS_PER_EPOCHS,
           validation_steps=VALIDATION_STEPS,
           callbacks=[reduce_lr],
 )

相关问题