我想知道如何stop_gradient在tensorflow中使用,文档对我来说并不清楚.
我目前正在使用stop_gradientCBOW word2vec模型中的单词嵌入来生成损失函数的梯度.我想获得价值,而不是反向传播(因为我正在生成对抗性的例子).
目前,我正在使用代码:
lossGrad = gradients.gradients(loss, embed)[0]
real_grad = lossGrad.eval(feed_dict)
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,无论如何它都会进行反向传播!我做错了什么,同样重要的是,我该如何解决这个问题呢?
澄清:通过"反向传播"来澄清我的意思是"计算值并更新模型参数".
如果我在第一个训练步骤之后运行上面的两行,那么在100次训练步骤之后,我得到的损失与我不运行这两行时相同.我可能从根本上误解了关于Tensorflow的一些事情.
我已经尝试set_random_seed在图形声明的开头和每个训练步骤之前使用它们.多次运行之间的总损失是一致的,但不包括/排除这两条线之间.因此,如果不是导致差异的RNG,并且在训练步骤之间没有意外更新模型参数,您是否知道会导致这种行为的原因是什么?
Welp,这有点晚了,但这就是我解决它的方式.我只想优化一些但不是全部的变量.我认为防止优化某些变量的方法是使用stop_grad- 但我从来没有找到一种方法来实现这一点.也许有一种方法,但对我有用的是调整我optimizer只对一组变量进行优化.所以代替:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss)
Run Code Online (Sandbox Code Playgroud)
我用了:
opt = tf.train.GradientDescentOptimizer(learning_rate=eta)
train_op = opt.minimize(loss, var_list=[variables to optimize over])
Run Code Online (Sandbox Code Playgroud)
这阻止opt了更新不在的变量var_list.希望它也适合你!
我正在尝试实现一些不同的模型并在CIFAR-10上训练它们,我想用TF-slim来做到这一点.看起来TF-slim有两个在训练期间有用的主循环:train_loop和evaluation_loop.
我的问题是:使用这些循环的规范方法是什么?作为后续:是否可以使用train_loop提前停止?
目前我有一个模型和训练文件train.py看起来像这样
import ...
train_log_dir = ...
with tf.device("/cpu:0"):
images, labels, dataset = set_up_input_pipeline_with_fancy_prefetching(
subset='train', ... )
logits, end_points = set_up_model( images ) // Possibly using many GPUs
total_loss = set_up_loss( logits, labels, dataset )
optimizer, global_step = set_up_optimizer( dataset )
train_tensor = slim.learning.create_train_op(
total_loss,
optimizer,
global_step=global_step,
clip_gradient_norm=FLAGS.clip_gradient_norm,
summarize_gradients=True)
slim.learning.train(train_tensor,
logdir=train_log_dir,
local_init_op=tf.initialize_local_variables(),
save_summaries_secs=FLAGS.save_summaries_secs,
save_interval_secs=FLAGS.save_interval_secs)
Run Code Online (Sandbox Code Playgroud)
到目前为止哪个很棒 - 我的模型都很好地训练和收敛.我可以从train_log_dir所有指标朝着正确方向前进的事件中看到这一点.朝着正确的方向前进让我感到高兴.
但我想检查验证集上的指标是否有所改善.我不知道TF-slim的任何方式与训练循环很好地配合,所以我创建了第二个文件eval.py,其中包含我的评估循环.
import ...
train_log_dir = ...
with tf.device("/cpu:0"):
images, labels, dataset = set_up_input_pipeline_with_fancy_prefetching(
subset='validation', ... )
logits, end_points …Run Code Online (Sandbox Code Playgroud)