所以我尝试从以下位置实现神经网络:
http://iamtrask.github.io/2015/07/12/basic-python-network/
但使用 TensorFlow 代替。我在训练期间打印了两次成本函数,误差似乎越来越小,但输出层中的所有值都接近 1,而实际上只有其中两个值应该接近 1。我想我的数学可能有问题,但我不确定。当我尝试使用隐藏层或使用误差平方作为成本函数时,没有区别。这是我的代码:
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
最佳答案
首先:你没有隐藏层。据我记得基本感知器可能可以模拟异或问题,但它需要一些调整。然而,人工智能只是生物学发明的,但它并没有精确地模拟真实的神经网络。因此,您至少必须构建一个 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
,以便真正描述输出层上每个类的概率。
关于python - 简单的 TensorFlow 神经网络最小化成本函数,但所有结果都接近 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38939221/