Нейронная сеть с Tensorflow не обновляет вес / смещение

На основании ответа Марио Фернандес , я подумал, почему бы не использовать его в своем инструменте как удобный метод расширения, не ограничиваясь типом данных, поэтому я надеюсь, что это нормально, чтобы поделиться им здесь:

/// 
/// Returns whether the bit at the specified position is set.
/// 
/// Any integer type.
/// The value to check.
/// 
/// The position of the bit to check, 0 refers to the least significant bit.
/// 
/// true if the specified bit is on, otherwise false.
public static bool IsBitSet(this T t, int pos) where T : struct, IConvertible
{
 var value = t.ToInt64(CultureInfo.CurrentCulture);
 return (value & (1 << pos)) != 0;
}

0
задан Emma 18 March 2019 в 05:21
поделиться

1 ответ

Ключом к этой проблеме является то, что номер класса, который вы выводите 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]))
0
ответ дан giser_yugang 18 March 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: