【发布时间】:2019-12-07 16:06:43
【问题描述】:
我想用 keras 的预训练模型进行迁移学习
import tensorflow as tf
from tensorflow import keras
base_model = keras.applications.MobileNetV2(input_shape=(96, 96, 3), include_top=False, pooling='avg')
x = base_model.outputs[0]
outputs = layers.Dense(10, activation=tf.nn.softmax)(x)
model = keras.Model(inputs=base_model.inputs, outputs=outputs)
用 keras 编译/拟合函数训练可以收敛
model.compile(optimizer=keras.optimizers.Adam(), loss=keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])
history = model.fit(train_data, epochs=1)
结果是:损失:0.4402 - 准确度:0.8548
我想用 tf.GradientTape 训练,但它不能收敛
optimizer = keras.optimizers.Adam()
train_loss = keras.metrics.Mean()
train_acc = keras.metrics.SparseCategoricalAccuracy()
def train_step(data, labels):
with tf.GradientTape() as gt:
pred = model(data)
loss = keras.losses.SparseCategoricalCrossentropy()(labels, pred)
grads = gt.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
train_loss(loss)
train_acc(labels, pred)
for xs, ys in train_data:
train_step(xs, ys)
print('train_loss = {:.3f}, train_acc = {:.3f}'.format(train_loss.result(), train_acc.result()))
但结果是:train_loss = 7.576, train_acc = 0.101
如果我只通过设置训练最后一层
base_model.trainable = False
收敛,结果为:train_loss = 0.525, train_acc = 0.823
代码有什么问题?我应该如何修改它?谢谢
【问题讨论】:
-
你有没有试过降低学习率看看它是否收敛?
-
@StatisticDean,我试过 lr=0.0001(默认为 0.001),它变成了 train_loss = 0.377,train_acc = 0.874,它确实收敛了,但为什么呢?设置应与 Keras 相同。 keras compile/fit 函数里面有什么魔法吗?如果我想编写自己的训练代码,我应该如何获得与 Keras 相同的设置的结果?谢谢
标签: python keras tensorflow2.0 transfer-learning