작성
·
417
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
안녕하세요~. 반갑습니다.
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를 좀더 낮춰서 진행해보시겠어요?
감사합니다.