gpt4 book ai didi

tensorflow - 模型似乎过度拟合 Optimizer.minimize() 但不是 tf.contrib.layers.optimize_loss()

转载 作者:行者123 更新时间:2023-11-30 09:34:06 25 4
gpt4 key购买 nike

当我像这样创建train_op时:

train_op = tf.contrib.layers.optimize_loss(
loss=loss,
global_step=tf.contrib.framework.get_global_step(),
learning_rate=params['learning_rate'],
optimizer='Adam'
)

我得到了一个在验证和测试集上表现良好的工作网络。

如果我只是使用这样的 minimize() 方法:

optimizer = tf.train.AdamOptimizer(learning_rate=params['learning_rate'])
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step()
)

即使在 1000 步后的第一次验证中,我也得到了更糟糕的结果(精度、召回率、损失),一段时间后,它似乎完全过度拟合(验证损失或多或少是恒定的,是 100 倍的训练损失,但是准确率和召回率崩溃)

我创建了一个函数,它是 contrib one 的清理版本,它在两个标记的地方与直接 Optimizer.minimize() 不同:

def make_train_op(loss, optimizer, global_step):
with tf.variable_scope(None, "OptimizeLoss", [loss, global_step]):

# ==========================================
# this part is extra comparing to minimize()
update_ops = set(tf.get_collection(tf.GraphKeys.UPDATE_OPS))
if update_ops:
with tf.control_dependencies([update_ops]):
loss = tf.identity(loss)
# ==========================================

gradients = optimizer.calculate_gradients(
loss,
tf.trainable_variables()
)

grad_updates = optimizer.apply_gradients(
gradients,
global_step=global_step,
name="train")

# ==========================================
# so is this one
with tf.control_dependencies([grad_updates]):
train_op = tf.identity(loss)
# ==========================================
return train_op

验证再次表现良好。所有情况下的训练看起来都或多或少相同(并且健康)。网络是相对简单的 CNN/batchnorm/dropout/maxpool 与交叉熵损失的混合。

我理解这一点的方式是,有一些操作是图形的一部分,它们不会显示为损失的依赖项,但需要计算梯度。这怎么可能呢?如果这是正常情况,为什么这两个片段不是核心的一部分?我应该在构建模型时做一些不同的事情来避免这种依赖强制的需要吗?

最佳答案

问题出在批量标准化更新操作上,实际上是 documented :

Note: when training, the moving_mean and moving_variance need to be updated. By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op. For example:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
train_op = optimizer.minimize(loss)

关于tensorflow - 模型似乎过度拟合 Optimizer.minimize() 但不是 tf.contrib.layers.optimize_loss(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com