2016-12-15 20 views
2

コードはTensorflow tutorialから抜粋しています。この機能は、0-9の手書き画像のデータセットであるMNISTデータセットで操作を実行します。なぜint64にラベルをキャストすると、私はint32と思った。なぜテンソルフローから損失関数のMNISTラベルに `int64`が必要ですか?

def loss(logits,labels): 
    labels = tf.to_int64(labels) 
    cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
     logits,labels,name='xentropy') 
    loss = tf.reduce_mean(cross_entropy,name='xentropy_mean') 
    return loss 
+1

これらの変換の中には、データがnumpy配列として供給されるときにnumpyと同じ型を使用するようにするものがあります(numpy整数はデフォルトでint64です)。 –

+0

その場合、変換は自動的に行われます。 'dtype'を指定せずに配列を定義するときはnumpyでテストしました。デフォルトでは' int64'になります。それでは、なぜ前もってキャスティングを気にかけていますか? – kmario23

+0

'int32'のTensorFlow' labels'ノードに 'int64'を送ると、それぞれの実行時にダウンキャストを経由しなければなりません。 IEの場合、摂取された値int64が 'int32'空間に収まるかどうかを調べるロジックを実行する必要があります –

答えて

2

これdocumentationは、それがint32またはint64のいずれかになりますと言います。だから、それらの1つを選択するのはあなた次第です。ここでは、彼らはint64を選択することを好みました。

labels:形状[d_0, d_1, ..., d_{r-2}]とDTYPE int32又はint64のテンソル文書を引用

labelsの各エントリは、[0, num_classes)のインデックスでなければなりません。このオペレーションがCPU上で実行されるとき、他の値は例外を発生させ、GPU上の対応する対応する損失およびグラジェント行に対してNaNを返します。

関連する問題