인프런 커뮤니티 질문&답변

­imLim님의 프로필 이미지
­imLim

작성한 질문수

TensorFlow 2.0으로 배우는 딥러닝 입문

tf.nn.softmax_cross_entropy_with_logits 질문..

작성

·

411

0

ANN 강의 중 cross_entropy 정의를 

class ANN_model(tf.keras.Model):

    

    def __init__(self):

        super(ANN_model, self).__init__()

        self.hidden_layer_1 = tf.keras.layers.Dense(hidden1_size, activation = 'relu',

                                                   kernel_initializer = random_normal_initializer(),

                                                   bias_initializer = random_normal_initializer())

        

        self.hidden_layer_2 = tf.keras.layers.Dense(hidden2_size, activation = 'relu',

                                                   kernel_initializer = random_normal_initializer(),

                                                   bias_initializer = random_normal_initializer())

        

        self.output_layer = tf.keras.layers.Dense(output_size, activation = None,

                                                   kernel_initializer = random_normal_initializer(),

                                                   bias_initializer = random_normal_initializer())

        

    def call(self, x):

        

        H1_output = self.hidden_layer_1(x)

        H2_output = self.hidden_layer_2(H1_output)

        logits = self.output_layer(H2_output)

        

        return logits

    

@tf.function

def cross_entropy(logits, y):

    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = y))

     

하시더라구요. 저도 이 코드를 따라서 실행하니 잘 수행되었습니다.

그런데 이전 강의와 같이

def call(self, x):

        

        H1_output = self.hidden_layer_1(x)

        H2_output = self.hidden_layer_2(H1_output)

        logits = self.output_layer(H2_output)

        

        return tf.nn.softmax(logits)

    

@tf.function

def cross_entropy(y_pred, y):

   reutrn  tf.reduce_mean(-tf.reduce_sum(y * tf.math.log(y_pred), axis = [1]))

으로 수행하니 loss가 nan이 뜨더라구요.

 tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = y))

와  tf.reduce_mean(-tf.reduce_sum(y * tf.math.log(y_pred), axis = [1]))는 같은 코드가 아닌가요?

답변 1

0

AISchool님의 프로필 이미지
AISchool
지식공유자

안녕하세요~. 반갑습니다.

tf.nn.softmax_cross_entropy_with_logits API가 좀더 최적화 되어 있어서 완전 동일한 코드라고 할순없지만 두 코드가 의미하는 바는 동일한데요.
(tf.nn.softmax_cross_entropy_with_logits의 정확한 구현은 아래 코드를 참조하세요~.)

https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/nn_ops.py#L3851

loss가 NaN이 뜨는 것은 조금 이상한것 같네요. 직접 cross entropy를 계산하는 코드에서 learning_rate를 좀더 낮춰서 진행해보시겠어요?

감사합니다.

­imLim님의 프로필 이미지
­imLim

작성한 질문수

질문하기