tf 调试记录

1、使用tf.estimator时出现: ERROR:tensorflow:Model diverged with loss = NaN

基本可以判断就是版本导致的问题,我是从tf 1.4切换到1.12出现该问题的,网上给出的解决方法有很多,我最终通过以下配置完成解决的:

Windows SET CUDA_VISIBLE_DEVICES=0

Linux export CUDA_VISIBLE_DEVICES=0

参考链接: https://github.com/tensorflow/models/issues/4881

其它 NaN Loss的原因及解决方法 参考: https://zhuanlan.zhihu.com/p/114150904

  • 梯度爆炸
原因:学习的过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹。
症状:观察每次迭代的loss值,会发现loss明显增长,最后因为loss值太大以至于不能用浮点去表示,所以变成了Nan。
可采取的措施:1 降低学习速率,2 如果模型中有多个loss层,就需要找到梯度爆炸的层,然后降低该层的loss weight。
  • 学习率过高
原因:过高的学习率乘上所有的梯度使得所有参数变成无效的值。
症状:观察输出日志,会发现学习率变成nan
可采取的措施:设置合适的学习速率
  • 损失函数有误
原因:损失函数的计算,如交叉熵损失函数的计算可能出现log(0),所以就会出现loss为Nan的情况
症状: loss逐渐下降,突然出现Nan
可采取的措施: 尝试重现该错误,打印损失层的值进行调试.
  • 输入数据有误
原因: 你的输入中存在Nan
症状: loss逐渐下降,突然出现Nan
可采取的措施: 逐步去定位错误数据,然后删掉这部分数据. 可以使用一个简单的网络去读取输入,如果有一个数据是错误的,这个网络的loss值也会出现Nan
  • Pooling层的步长大于核的尺寸
  • 设置远距离的Label会得到NAN

2、训练过程出现 "ValueError: setting an array element with a sequence" , 且debug定位到sess.run() 处报错?
目前遇到的都是feed 数据时给的数据格式有问题。
比如 “setting an array element with a sequence. TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'” : 原因feed数据时对int类型赋值了list数据,示例:

 padding_prod_title_ids = []
 for item_feat in prod_feats:
        tem_title_id_list = item_feat # 错误
        item_title_id_list = item_feat[0] # 正确
        padding_title_id = pad_data_1(item_title_id_list, tf_config.config["prod_title_seq_length"])
        padding_prod_title_ids.append(padding_title_id)
posted @ 2020-08-28 17:13  chease  阅读(973)  评论(0)    收藏  举报