Нейронная сеть с Tensorflow не обновляет вес / смещение - PullRequest
0 голосов
/ 18 марта 2019

Задача

Я пытаюсь классифицировать некоторые 64x64 изображения как упражнение черного ящика. NN, который я написал, не меняет моего веса. В первый раз пишу что-то вроде этого, тот же код, но на MNIST ввод букв работает просто отлично, но на этом коде он работает не так, как должен:

import tensorflow as tf
import numpy as np


path = ""

# x is a holder for the 64x64 image
x = tf.placeholder(tf.float32, shape=[None, 4096])

# y_ is a 1 element vector, containing the predicted probability of the label
y_ = tf.placeholder(tf.float32, [None, 1])

# define weights and balances
W = tf.Variable(tf.zeros([4096, 1]))
b = tf.Variable(tf.zeros([1]))

# define our model
y = tf.nn.softmax(tf.matmul(x, W) + b)

# loss is cross entropy
cross_entropy = tf.reduce_mean(
                tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

# each training step in gradient decent we want to minimize cross entropy
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

train_labels = np.reshape(np.genfromtxt(path + "train_labels.csv", delimiter=',', skip_header=1), (14999, 1))
train_data = np.genfromtxt(path + "train_samples.csv", delimiter=',', skip_header=1)

# perform 150 training steps with each taking 100 train data
for i in range(0, 15000, 100):
    sess.run(train_step, feed_dict={x: train_data[i:i+100], y_: train_labels[i:i+100]})
    if i % 500 == 0:
        print(sess.run(cross_entropy, feed_dict={x: train_data[i:i+100], y_: train_labels[i:i+100]}))
        print(sess.run(b), sess.run(W))

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


sess.close()

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Ключ к проблеме в том, что номер класса, который вы выводите 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 голосов
/ 18 марта 2019

Все ваши начальные веса являются нулями.Когда вы так поступаете, NN плохо учится.Вам нужно инициализировать все начальные веса случайными значениями.

См. Почему веса нейронных сетей должны быть инициализированы случайными числами?

" Почему не установленоВеса до нуля? Мы можем использовать один и тот же набор весов каждый раз, когда мы тренируем сеть, например, вы можете использовать значения 0,0 для всех весов.

В этом случае уравненияАлгоритм обучения не сможет изменить вес сети, и модель будет зависать. Важно отметить, что вес смещения в каждом нейроне по умолчанию установлен равным нулю, а не малому случайному значению. "

См. https://machinelearningmastery.com/why-initialize-a-neural-network-with-random-weights/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...