Ключ к проблеме в том, что номер класса, который вы выводите y_
и y
, равен 1
. Вам следует использовать режим one-hot
, когда вы используете tf.nn.softmax_cross_entropy_with_logits
для задач классификации в тензорном потоке. tf.nn.softmax_cross_entropy_with_logits
сначала вычислит tf.nn.softmax
. Когда ваш номер класса 1
, ваши результаты одинаковы. Например:
import tensorflow as tf
y = tf.constant([[1],[0],[1]],dtype=tf.float32)
y_ = tf.constant([[1],[2],[3]],dtype=tf.float32)
softmax_var = tf.nn.softmax(logits=y_)
cross_entropy = tf.multiply(y, tf.log(softmax_var))
errors = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
with tf.Session() as sess:
print(sess.run(softmax_var))
print(sess.run(cross_entropy))
print(sess.run(errors))
[[1.]
[1.]
[1.]]
[[0.]
[0.]
[0.]]
[0. 0. 0.]
Это означает, что независимо от того, что вы выводите y_
, ваша потеря будет равна нулю. То есть ваши weights
и bias
не были обновлены.
Решение состоит в том, чтобы изменить номер класса y_
и y
.
Полагаю, ваш номер класса n
.
Первый подход: вы можете изменить данные на one-hot
перед подачей данных. Затем используйте следующий код.
y_ = tf.placeholder(tf.float32, [None, n])
W = tf.Variable(tf.zeros([4096, n]))
b = tf.Variable(tf.zeros([n]))
Второй подход: изменить данные на one-hot
после данных подачи.
y_ = tf.placeholder(tf.int32, [None, 1])
y_ = tf.one_hot(y_,n) # your dtype of y_ need to be tf.int32
W = tf.Variable(tf.zeros([4096, n]))
b = tf.Variable(tf.zeros([n]))