У меня возникает проблема, когда я пытаюсь создать глубокую сеть ReLU, используя тензорный поток для набора данных MNIST. Он работает нормально, когда я использую свою потерю как встроенный в tf.nn.softmax_cross_entropy_with_logits(), но вычисление термина энтропии вручную не работает.расчет кросс-энтропии вручную с использованием softmax_cross_entropy_with_logits в тензорном потоке
Вот что сеть выглядит следующим образом:
train_subset = 200
num_features = 784
num_labels = 10
num_units = 200
bias1 = tf.Variable(tf.constant(0.1, shape=[num_units]), name="bias1")
bias2= tf.Variable(tf.constant(0.1, shape=[num_units]), name="bias2")
bias3= tf.Variable(tf.constant(0.1, shape=[num_units]), name="bias3")
bias_out = tf.Variable(tf.constant(0.1, shape=[num_labels]), name="bias_out")
weights1 = tf.Variable(tf.random_normal([num_features, num_units]), name="weights_layer1")
weights2 = tf.Variable(tf.random_normal([num_units, num_units]), name="weights_layer2")
weights3 = tf.Variable(tf.random_normal([num_units, num_units]), name="weights_layer3")
weights_out = tf.Variable(tf.random_normal([num_units, num_labels]), name="weights_out")
# The deep ReLU network
h_relu1 = tf.nn.relu(tf.add(tf.matmul(x, weights1), bias1))
h_relu2 = tf.nn.relu(tf.add(tf.matmul(h_relu1, weights2), bias2))
h_relu3 = tf.nn.relu(tf.add(tf.matmul(h_relu2, weights3), bias3))
logits = tf.matmul(h_relu3, weights_out) + bias_out
Другими словами, это работает отлично:
# Assume that y_ is fed a batch of output labels for MNIST
y_ = tf.placeholder(tf.float32, [None, num_labels], name='y-input')
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, y_))
optimizer = tf.train.AdamOptimizer(1e-3).minimize(cost)
, но не это:
y = tf.nn.softmax(logits)
cost = -tf.reduce_sum(y_ * tf.log(y))
optimizer = tf.train.AdamOptimizer(1e-3).minimize(cost)
Последние работает нормально, но точность застревает после начального шага. Первый, использующий функцию softmax_cross_entropy_with_logits, действительно что-то узнает. Я видел, как настройка последнего использовалась для глубокого примера MNIST, поэтому мне интересно, что это касается моей настройки здесь, что приводит к тому, что процедура оптимизации останавливается.
Одна проблема с' Y_ * tf.log (у) 'подход является то, что он склонен к численной неустойчивости если 'y' может быть близок к 0. Однако, я ожидаю, что вы увидите результаты« NaN », а не точность застревания. Производятся ли градиенты на каждом этапе? – mrry
Можете ли вы попробовать tf.reduce_mean() в своем ручная кросс-энтропийная оптимизация. Не уверен, что это так, но большие значения потерь могут вызвать большие шаги градиента, заставляя ваши веса двигаться вперед и назад - хотя я бы предположил, что обновление Адама со временем не должно зависеть от этого. – shekkizh
Я просто попытался посмотреть на градиентах, расширяя линию для opti mizer с этим: 'optimizer = tf.train.AdamOptimizer (.01).минимизировать (стоимость) grads_and_vars = optimizer.compute_gradients (стоимость) optimizer.apply_gradients (grads_and_vars) ' и столкнулся с большим количеством ошибок. Это немного странно и не совсем понятно, что здесь происходит. Что касается tf.reduce_mean(), я пробовал это и не добился успеха. Спасибо за предложения, хотя. –