所以我尝试从以下方面实现神经网络:
http://iamtrask.github.io/2015/07/12/basic-python-network/
但改为使用TensorFlow。我在训练期间打印出两次成本函数,并且当出现两个数据时,输出层中的所有值都接近1时,错误似乎越来越小。我想我的数学可能有问题,但我不确定。当我尝试使用隐藏层或使用Error Squared作为成本函数时没有区别。这是我的代码:
import tensorflow as tf
import numpy as np
input_layer_size = 3
output_layer_size = 1
x = tf.placeholder(tf.float32, [None, input_layer_size]) #holds input values
y = tf.placeholder(tf.float32, [None, output_layer_size]) # holds true y values
tf.set_random_seed(1)
input_weights = tf.Variable(tf.random_normal([input_layer_size, output_layer_size]))
input_bias = tf.Variable(tf.random_normal([1, output_layer_size]))
output_layer_vals = tf.nn.sigmoid(tf.matmul(x, input_weights) + input_bias)
cross_entropy = -tf.reduce_sum(y * tf.log(output_layer_vals))
training = tf.train.AdamOptimizer(0.1).minimize(cross_entropy)
x_data = np.array(
[[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
y_data = np.reshape(np.array([0,0,1,1]).T, (4, 1))
with tf.Session() as ses:
init = tf.initialize_all_variables()
ses.run(init)
for _ in range(1000):
ses.run(training, feed_dict={x: x_data, y:y_data})
if _ % 500 == 0:
print(ses.run(output_layer_vals, feed_dict={x: x_data}))
print(ses.run(cross_entropy, feed_dict={x: x_data, y:y_data}))
print('\n\n')
这就是它的输出:
[[ 0.82036656]
[ 0.96750367]
[ 0.87607527]
[ 0.97876281]]
0.21947 #first cross_entropy error
[[ 0.99937409]
[ 0.99998224]
[ 0.99992537]
[ 0.99999785]]
0.00062825 #second cross_entropy error, as you can see, it's smaller
答案 0 :(得分:1)
首先:你没有隐藏层。据我所知,基本的感知器可以模拟XOR问题,但需要进行一些调整。然而,AI只是由生物学发明的,但它并不能准确地模拟真实的神经网络。因此,您必须至少构建一个MLP(Multilayer perceptron),其中包含至少一个输入,一个隐藏和一个输出层。 XOR问题需要至少两个神经元+隐藏层中的偏差才能正确解决(高精度)。
此外,您的学习率太高。 0.1
是一个非常高的学习率。简而言之:它基本上意味着您将当前状态更新/调整为单个学习步骤的10%。这可以让您的网络快速忘记已经学过的不变量。通常学习率介于1e-2到1e-6之间,具体取决于您的问题,网络规模和一般架构。
此外,您实施了"简化/简短"交叉熵的版本。有关完整版本,请参阅维基百科:cross-entropy。但是,为了避免一些边缘情况,TensorFlow已经有了自己的交叉熵版本:例如tf.nn.softmax_cross_entropy_with_logits
。
最后你应该记住,交叉熵错误是一个逻辑损失函数,它对你的类的概率进行操作。虽然你的sigmoid函数会将输出层压缩到[0, 1]
的区间,但这只适用于你的情况,因为你只有一个输出神经元。只要您有多个输出神经元,您还需要输出层的总和精确1,0
,以便真正描述输出层上每个类的概率。