我不熟悉使用tensorflow 2
我熟悉在tensorflow 1中使用keras
。我通常使用fit
方法API来训练模型。但最近在tensorflow 2中,他们引入了渴望执行。因此,我在CiFAR-10数据集上实现并比较了一个简单的图像分类器,分别在fit
和tf.GradientTape
上进行了20个时期的训练
经过几次运行,结果如下
fit
API训练的模型
tf.GradientTape
训练的模型
我不知道为什么模型表现出不同的行为。我想我可能执行了一些错误的操作。我觉得奇怪的是,在tf.GradientTape
中,模型开始更快地过度拟合训练数据集
下面是一些片段
fit
APImodel = SimpleClassifier(10)
model.compile(
optimizer=Adam(),
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=[tf.keras.metrics.CategoricalAccuracy()]
)
model.fit(X[:split_idx, :, :, :], y[:split_idx, :], batch_size=256, epochs=20, validation_data=(X[split_idx:, :, :, :], y[split_idx:, :]))
tf.GradientTape
with tf.GradientTape() as tape:
y_pred = model(tf.stop_gradient(train_X))
loss = loss_fn(train_y, y_pred)
gradients = tape.gradient(loss, model.trainable_weights)
model.optimizer.apply_gradients(zip(gradients, model.trainable_weights))
完整的代码可以在here in Colab中找到
参考资料
在
tf.GradientTape
代码中几乎没有可以修复的东西:1)
trainable_variables
不是trainable_weights
。您希望对所有可训练变量应用梯度,而不仅仅是模型权重2)从输入张量中删除
tf.stop_gradient
注意,我还添加了培训参数。它还应该包括在模型定义中,以包括依赖于
phase
(如BatchNormalization和Dropout)的层:通过这几项改变,我获得了略好的分数,与
keras.fit
结果更具可比性:答案是: 区别可能在于
Keras.fit
在幕后做了这些事情最后,为了清晰和再现性,我使用了部分培训/评估代码:
评价之一:
相关问题 更多 >
编程相关推荐