Я построил MLP с помощью библиотеки TensorFlow Google. Сеть работает, но почему-то отказывается учиться должным образом. Он всегда сходится к выходу около 1.0, независимо от того, что на самом деле представляет собой вход.TensorFlow MLP не тренируется XOR
полный код вид here.
Любые идеи?
вход и выход (размер партии 4) следующим образом:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]] # XOR input
output_data = [[0.], [1.], [1.], [0.]] # XOR output
n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input")
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output")
конфигурации Скрытый слой:
# hidden layer's bias neuron
b_hidden = tf.Variable(0.1, name="hidden_bias")
# hidden layer's weight matrix initialized with a uniform distribution
W_hidden = tf.Variable(tf.random_uniform([2, hidden_nodes], -1.0, 1.0), name="hidden_weights")
# calc hidden layer's activation
hidden = tf.sigmoid(tf.matmul(n_input, W_hidden) + b_hidden)
конфигурации Выходной слой:
W_output = tf.Variable(tf.random_uniform([hidden_nodes, 1], -1.0, 1.0), name="output_weights") # output layer's weight matrix
output = tf.sigmoid(tf.matmul(hidden, W_output)) # calc output layer's activation
Мои обучения методы выглядеть следующим образом:
loss = tf.reduce_mean(cross_entropy) # mean the cross_entropy
optimizer = tf.train.GradientDescentOptimizer(0.01) # take a gradient descent for optimizing
train = optimizer.minimize(loss) # let the optimizer train
Я попробовал обе установки для перекрестной энтропии:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
и
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
, где n_output
оригинальный выход, как описано в output_data
и output
предсказанное/вычисленные значения моей сети.
обучение внутри для цикла (для русских эпох) выглядит следующим образом:
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
feed_dict={n_input: input_data, n_output: output_data})
Я спасаю результат в cvalues для отладки printig из loss
, W_hidden
...
Независимо от того, что я пробовал, когда я тестирую свою сеть, пытаясь проверить выход, он всегда производит что-то похожее е это:
(...)
step: 2000
loss: 0.0137040186673
b_hidden: 1.3272010088
W_hidden: [[ 0.23195425 0.53248233 -0.21644847 -0.54775208 0.52298909]
[ 0.73933059 0.51440752 -0.08397482 -0.62724304 -0.53347367]]
W_output: [[ 1.65939867]
[ 0.78912479]
[ 1.4831928 ]
[ 1.28612828]
[ 1.12486529]]
(--- finished with 2000 epochs ---)
(Test input for validation:)
input: [0.0, 0.0] | output: [[ 0.99339396]]
input: [0.0, 1.0] | output: [[ 0.99289012]]
input: [1.0, 0.0] | output: [[ 0.99346077]]
input: [1.0, 1.0] | output: [[ 0.99261558]]
Так не обучения должным образом, но всегда сходящихся почти 1,0 независимо от того, который подается входной.
Ваш 'b_hidden' переменная является скаляром - это то, что намеренно? Я думаю, вы должны создать его как 'b_hidden = tf.Variable (tf.constant (0.1, shape = [hidden_nodes]), name =" hidden_bias ")', что может помочь. Еще одна вещь, которую нужно попробовать, заключается в добавлении выражения смещения 'b_output' к вашему уровню вывода. – mrry
Благодарим вас за комментарий. В самом деле, я просто не заметил, что «b_hidden» также должен быть вектором, а не скаляром ... однако сеть все еще сходится почти до 1.0 для каждого входа, с или без скрытого смещения, как скаляр или вектор и с или без смещения для выходного слоя. Я действительно думаю, что мне недостает некоторой ошибки в методе обучения или сетевой архитектуре:/ – daniel451