【发布时间】:2020-01-15 02:06:51
【问题描述】:
我所知道的是,当这个分支被执行并且来自它的weights 被传递给tf.data.experimental.sample_from_datasets 时会发生错误:
# ...
elif pretrain_cfg.schedule == PretrainSchedule.CONVERGE_LINEARLY:
logger.info('[%s] - Pretrain: Using CONVERGE_LINEARLY schedule' % self.name)
a = tf.minimum(tf.constant(1.0, dtype=tf.float64, shape=(1,)), global_step / max_pretrain_steps)
b = tf.maximum(tf.constant(0.0, dtype=tf.float64, shape=(1,)), 1 - global_step / max_pretrain_steps)
weights = a * const_task_weights + b * pretrain_task_weights
return tf.data.experimental.sample_from_datasets(datasets, weights=weights)
以下作品:
weights = tf.cond(
tf.greater(global_step, max_pretrain_steps),
true_fn=lambda: const_task_weights,
false_fn=lambda: pretrain_task_weights
)
但由于某种原因,这会导致SIGSEGV:
a = tf.minimum(tf.constant(1.0, dtype=tf.float64, shape=(1,)), global_step / max_pretrain_steps)
b = tf.maximum(tf.constant(0.0, dtype=tf.float64, shape=(1,)), 1 - global_step / max_pretrain_steps)
weights = a * const_task_weights + b * pretrain_task_weights
我真的不明白问题出在哪里,但问题肯定来自这一行:
weights = a * const_task_weights + b * pretrain_task_weights
问题是为什么。由于sample_from_datasets 的weights 参数,在这种情况下依赖global_step 可能无效。
但是,在sample_from_datasets 中我没有看到任何可疑之处,因为在sample_from_datasets 中发生的第一件事是
weights = ops.convert_to_tensor(weights, name="weights")
所以将张量传递给它应该没问题。
有什么想法吗?
错误输出:
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 0 into /data/translation/multi-problem/hi2en/model/512-3-1-1024/de2en.hi2en/c19cfad259cad911/model.ckpt.
bash: line 1: 4153 Segmentation fault (core dumped) env "CUDA_VISIBLE_DEVICES"="0" "LIBRARY_ROOTS"="/Users/username/Library/Caches/PyCharm2018.2/remote_sou...
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
【问题讨论】:
-
尝试保存检查点时的段错误是 IMO 打开错误报告问题的原因。即使假设您做错了什么,也应该进行检查以防止这种情况发生。不能多说,我真的不知道错误的来源可能是什么,因为我不知道当 TF 保存检查点时会发生什么,以及这如何影响你处理权重的方式。
-
@GPhilo 听起来很合理。我将在 github 上打开一个问题 :)
-
@GPhilo 这实际上是我自己的错(见答案)。 :D
标签: tensorflow