2016-03-13 3 views
2

У меня возникает проблема, когда я пытаюсь создать глубокую сеть 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, поэтому мне интересно, что это касается моей настройки здесь, что приводит к тому, что процедура оптимизации останавливается.

+1

Одна проблема с' Y_ * tf.log (у) 'подход является то, что он склонен к численной неустойчивости если 'y' может быть близок к 0. Однако, я ожидаю, что вы увидите результаты« NaN », а не точность застревания. Производятся ли градиенты на каждом этапе? – mrry

+0

Можете ли вы попробовать tf.reduce_mean() в своем ручная кросс-энтропийная оптимизация. Не уверен, что это так, но большие значения потерь могут вызвать большие шаги градиента, заставляя ваши веса двигаться вперед и назад - хотя я бы предположил, что обновление Адама со временем не должно зависеть от этого. – shekkizh

+0

Я просто попытался посмотреть на градиентах, расширяя линию для opti mizer с этим: 'optimizer = tf.train.AdamOptimizer (.01).минимизировать (стоимость) grads_and_vars = optimizer.compute_gradients (стоимость) optimizer.apply_gradients (grads_and_vars) ' и столкнулся с большим количеством ошибок. Это немного странно и не совсем понятно, что здесь происходит. Что касается tf.reduce_mean(), я пробовал это и не добился успеха. Спасибо за предложения, хотя. –

ответ

0

Я думаю, что вам не хватает нескольких шагов, чтобы точно вычислить стоимость. Посмотрите на исходный код в nn_ops.py, чтобы посмотреть, что еще softmax_cross_entropy_with_logits делает.

0

Update:

Наконец, я могу решить эту проблему с помощью реализации внутри softmax_cross_entropy_with_logits() функции самостоятельно, вы можете найти код here на моем GitHub. Это в двух версиях для нормальных и многоэлементных проблем.


Предыдущий ответ:

Родом из tensorflow API:

«(Обратите внимание, что в исходном коде, мы не используем эту формулировку,

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

, потому что он численно неустойчив. Вместо этого мы применяем tf.nn.softmax_cross_entropy_with_logi ts на ненормализованных логитах (например, мы называем softmax_cross_entropy_with_logits на tf.matmul (x, W) + b), поскольку эта более численно стабильная функция внутренне вычисляет активацию softmax. В своем коде, рассмотреть возможность использования tf.nn. (sparse_) softmax_cross_entropy_with_logits вместо)»

Источник: https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/

Смежные вопросы