2016-12-15 7 views
2

코드는 Tensorflow tutorial에서 발췌되었습니다. 이 함수는 0-9의 손으로 쓴 사진의 데이터 세트 인 MNIST 데이터 세트에서 작업을 실행합니다. 왜 레이블을 int64으로 변환했는지, 나는 int32으로 충분하다고 생각했다.왜 우리는 tensorflow로부터 손실 함수의 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에서, 그것은 fed 값 int64가'int32' 공간에 들어 맞는지 확인하기 위해 로직을 실행해야합니다 –

답변

2

documentationint32 또는 int64이 될 수 있다고 말한다. 그래서 그것들 중 하나를 선택하는 것은 당신에게 달려 있습니다. 여기에서 그들은 int64을 선택하기를 원했습니다. 모양 [d_0, d_1, ..., d_{r-2}]의 텐서 및 int32 또는 int64을 D- 타입 :

labels :

문서에서 인용. labels의 각 항목은 [0, num_classes)의 색인이어야합니다. 이 연산이 CPU에서 실행될 때 다른 값은 예외를 발생시키고 GPU에서는 상응하는 해당 손실 및 그래디언트 행에 대해 NaN을 반환합니다.