Tensorflow - softmax, возвращающий только 0 и 1 - PullRequest
0 голосов
/ 04 мая 2018

Я тренирую CNN по тензорному потоку, но у меня проблемы с потерей, которая не улучшается; Я заметил, что tf.nn.softmax() возвращает тензор только с 0 и 1, а не распределение, как я ожидал. Вот репо , я думаю, что это причина моей неспособности обучить сеть, но я не знаю, как ее решить.

1 Ответ

0 голосов
/ 04 мая 2018

Глядя на 2-й блок под Нейронная сеть :

# output layer
with tf.variable_scope('output_lay') as scope:
    weights = weight_variable([4096, CLASSES])
    bias = bias_variable([CLASSES], 0.)
    activation = tf.nn.relu(tf.matmul(out, weights)+bias, name=scope.name)
    out = tf.nn.softmax(activation)
return tf.reshape(out, [-1, CLASSES])

Примечание: ReLu активация используется только для скрытых слоев, а не для выходного слоя.

Затем вы подаете это к перекрестной энтропии в вашей train функции

logits=AlexNet(x_tr)

# loss function
cross_entropy = -tf.reduce_sum(tf.squeeze(y_tr)*tf.log(tf.clip_by_value(tf.squeeze(logits),1e-10,1.0)))
loss = tf.reduce_mean(cross_entropy)

Повторное посещение Перекрестная энтропия :

C= −1/n * (∑[y*ln(a)+(1−y)*ln(1−a)])

где a = sigmoid(W(x)+b), поэтому предлагаю:

with tf.variable_scope('output_lay') as scope:
    weights = weight_variable([4096, CLASSES])
    bias = bias_variable([CLASSES], 0.)
    return tf.matmul(out, weights)+bias

, а для простоты просто используйте встроенную функцию softmax:

logits=AlexNet(x_tr)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=ground_truth_input, logits=logits)
loss = tf.reduce_mean(cross_entropy)

tf.nn.softmax_cross_entropy_with_logits принимает W(x)+b и эффективно вычисляет перекрестную энтропию.

...