2017-02-06 7 views
1

最近TFでfloat16を使用してCNNをトレーニングしようとしました。 TFがしばらくそれをサポートしていると主張しているにもかかわらず、私の驚きには、それは様々な方法で壊れています。たとえば、float16の最適化では、ネットワークに関係なく、2番目のステップでNaNの損失が発生します。私の理解へTensorFlow float16サポートが壊れています

import tensorflow as tf 
import numpy as np 

slim = tf.contrib.slim 

dtype = tf.float16 
shape = (4, 16, 16, 3) 

inpt = tf.placeholder(dtype, shape, name='input') 
net = slim.conv2d(inpt, 16, [3, 3], scope='conv', 
     weights_initializer=tf.zeros_initializer(), 
     # normalizer_fn=slim.batch_norm 
     ) 
loss = tf.reduce_mean(net) 
opt = tf.train.AdamOptimizer(1e-3) 
train_op = slim.learning.create_train_op(loss, opt) 

val = np.zeros(shape) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(2): 
     print(sess.run(train_op, feed_dict={inpt: val})) 

それは明らかにバグです:私は、ゼロ入力にゼロコンボリューションを適用し、私はゼロの損失を変更しないゼロ勾配を取得する必要があります。それはちょうど発散することはできません。 dtypeがfloat32の場合は動作します。 NaNの損失はCPUとGPUの両方で発生します。 BNが想定しているので、あなたがBNとの行のコメントを解除した場合https://github.com/tensorflow/tensorflow/issues/7226

、それはグラフ構築時に、すでに解除されます:

しかし、私はGHの問題で解雇された、ランダムな男は、それが動作を意図していることを言って、この問題を閉じました移動平均(およびベータ、ガンマ)は常に浮動小数点32であり、正しくキャストしません。この問題もクローズされ、明らかに無視されました。https://github.com/tensorflow/tensorflow/issues/7164

私はISPのITサポートの最初の話をしているようです。

このような単純な「ネットワーク」が恐ろしく失敗したとき、どのように私がfloat16で訓練するべきか説明できる人は誰ですか?そして今、バグを報告するための推奨される方法は何ですか?

答えて

7

AdamOptimizerで数値が不安定になるのを防ぐには、少し大きめのイプシロンが必要です(デフォルトは1e-8)。これは、float16で私の作品:

opt = tf.train.AdamOptimizer(1e-3, epsilon=1e-4) 

イプシロンはDTYPE(そしておそらくそのような要求、またはいっそのプル要求に基づいて設定することを要求するのが妥当だろう、上でより多くの肯定的な反応と会談したことになりますGitHub)。 GradientDescentOptimizerにはこのような問題はありません。

関連する問題