我正在加载一个预先训练的模型,然后根据我的自定义损失仅提取我想要优化(基本上更改或微调)的可训练变量。问题是我将一小批数据传递给它的那一刻,它只是挂起并且没有任何进展。我使用 Tensorboard 进行可视化,但在没有可用日志信息时不知道如何调试。我在它周围放了一些基本的打印语句,但没有得到任何有用的信息。
只是给出一个想法,这是顺序的一段代码
# Load and build the model
model = skip_thoughts_model.SkipThoughtsModel(model_config, mode="train")
with tf.variable_scope("SkipThoughts"):
model.build()
theta = [v for v in tf.get_collection(tf.GraphKeys.MODEL_VARIABLES, scope='SkipThoughts') if "SkipThoughts" in v.name]
# F Representation using Skip-Thoughts model
opt_F = tf.train.AdamOptimizer(learning_rate).minimize(model.total_loss, var_list=[theta])
# Training
sess.run([opt_F], feed_dict = {idx: idxTensor})
模型来自这个存储库:问题在于训练,即最后一步。我验证了 theta 列表不是空的,它有 26 个元素,比如 ... SkipThoughts/decoder_pre/gru_cell/candidate/layer_norm/w/beta:0 SkipThoughts/decoder_pre/gru_cell/candidate/layer_norm/w/gamma:0 SkipThoughts/logits/weights:0 SkipThoughts/logits/biases:0 SkipThoughts/decoder_post/gru_cell/gates/layer_norm/w_h/beta:0 ...
此外,即使在使用tf.debug之后,问题仍然存在。也许它真的需要很多时间或者被困在等待其他一些过程?所以,我也尝试分解
tf.train.AdamOptimizer(learning_rate).minimize(model.total_loss, var_list=[theta])
踏入
gvs = tf.train.AdamOptimizer(learning_rate).compute_gradients(model.total_loss, var_list=theta)
opt_F = opt.apply_gradients(gvs)
...
g = sess.run(gvs, feed_dict = {idx: idxTensor})
这样我就可以检查是否首先计算了梯度,它卡在了同一点上。除此之外,我还尝试使用tf.gradients仅对其中一个变量以及一维变量计算梯度,但问题仍然存在。
我在带有 1 个 GPU Tesla K80 的 Azure 集群上的 IPython 笔记本上运行这段代码。GPU 使用率在整个执行过程中保持不变,并且没有内存不足错误。
内核中断不起作用,停止它的唯一方法是重新启动笔记本电脑。此外,如果我将此代码编译成 Python 文件,那么我也需要显式终止该进程。但是,在任何这种情况下,我都无法通过堆栈跟踪来知道它被卡住的确切位置!应该如何调试这样的问题?
在这方面的任何帮助和指示将不胜感激。