我想在TensorFlow(Python 3版本)中实现一个简单的完全连接的前馈神经网络。网络有2个输入和1个输出,我试图训练它输出两个输入的XOR。我的代码如下:TensorFlow:2层前馈神经网络
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。我现在非常困惑。
非常感谢您的彻底解答。我了解您所做的更改。但是,我试图执行XOR操作,而不是OR操作。所以我的目标产出实际上没有错误;目标输出是[[0.0],[1.0],[1.0],[0.0]]。使用你的代码,我仍然无法让神经网络执行XOR。你能提供任何帮助吗? – CircuitScholar
我更新了我的答案。 – nessuno
谢谢。我实际上只能通过2层完成目标。您将权重初始化为非零值的想法是我的代码工作的原因。 – CircuitScholar