python - 简单的 TensorFlow 神经网络最小化成本函数,但所有结果都接近 1

标签 python machine-learning neural-network tensorflow

所以我尝试从以下位置实现神经网络:

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/

相关文章:

machine-learning - Biggram 中包含 weka 中的停用词?

machine-learning - 用于音乐的 LSTM 自动编码器 - Keras [序列到序列]

python - Keras深度学习网络参数数量

c++ - tensorflow C++ 批量推理

python - 如果涉及 Inf,为什么稀疏矩阵的矩阵乘法与密集矩阵的乘法不同?

python - 安装包后出现 'module not found' 错误

python - 产量和产量——你能把它们结合起来吗?

Python Pandas 用相反的符号替换值

matlab - 在 MATLAB 中实现朴素贝叶斯算法——需要一些指导

r - 了解随机起始权重对神经网络性能的影响