我所知道的是,当这个分支被执行并且它的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问题是为什么。在此上下文中对global_step具有依赖关系可能是无效的,因为weights参数是sample_from_datasets的。
然而,在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)发布于 2019-09-13 12:34:16
好的,问题是不是直接使用tensorflow -实际上一点也不。
问题在于const_task_weights和pretrain_task_weights没有相同的形状。我没有验证输入,而是在其他地方有一个bug。
请注意,如果形状不匹配,您可能会遇到这样的错误。
我想这不能由tensorflow检查或确定,所以这将是用户必须处理的事情(引用需要)。
https://stackoverflow.com/questions/57919530
复制相似问题