【发布时间】:2016-11-29 06:10:56
【问题描述】:
我正在尝试在 TensorFlow(Python 3 版本)中实现一个简单的全连接前馈神经网络。该网络有 2 个输入和 1 个输出,我正在尝试训练它输出两个输入的 XOR。我的代码如下:
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
inputs = tf.placeholder(tf.float32, shape = [None, 2])
desired_outputs = tf.placeholder(tf.float32, shape = [None, 1])
weights_1 = tf.Variable(tf.zeros([2, 3]))
biases_1 = tf.Variable(tf.zeros([1, 3]))
layer_1_outputs = tf.nn.sigmoid(tf.matmul(inputs, weights_1) + biases_1)
weights_2 = tf.Variable(tf.zeros([3, 1]))
biases_2 = tf.Variable(tf.zeros([1, 1]))
layer_2_outputs = tf.nn.sigmoid(tf.matmul(layer_1_outputs, weights_2) + biases_2)
error_function = -tf.reduce_sum(desired_outputs * tf.log(layer_2_outputs))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(error_function)
sess.run(tf.initialize_all_variables())
training_inputs = [[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]]
training_outputs = [[0.0], [1.0], [1.0], [0.0]]
for i in range(10000):
train_step.run(feed_dict = {inputs: np.array(training_inputs), desired_outputs: np.array(training_outputs)})
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[0.0, 0.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[0.0, 1.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[1.0, 0.0]])}))
print(sess.run(layer_2_outputs, feed_dict = {inputs: np.array([[1.0, 1.0]])}))
看起来很简单,但最后的打印语句表明,无论训练迭代次数或学习率如何,神经网络都远未达到所需的输出。谁能看到我做错了什么?
谢谢。
编辑: 我还尝试了以下替代错误函数:
error_function = 0.5 * tf.reduce_sum(tf.sub(layer_2_outputs, desired_outputs) * tf.sub(layer_2_outputs, desired_outputs))
那个误差函数是误差的平方和。它总是导致网络输出正好为 0.5 的值——这表明我的代码中某处有错误。
编辑 2: 我发现我的代码适用于 AND 和 OR,但不适用于 XOR。我现在非常困惑。
【问题讨论】:
标签: python machine-learning neural-network tensorflow