【问题标题】:Simple TensorFlow Neural Network minimizes cost function yet all results are close to 1简单的 TensorFlow 神经网络最小化成本函数,但所有结果都接近 1
【发布时间】:2016-12-20 17:20:35
【问题描述】:

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

http://iamtrask.github.io/2015/07/12/basic-python-network/

但改用 TensorFlow。我在训练期间两次打印了成本函数,并且错误似乎越来越小,但输出层中的所有值都接近 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

【问题讨论】:

    标签: python machine-learning neural-network tensorflow


    【解决方案1】:

    首先:你没有隐藏层。据我所知,基本感知器可能可以模拟 XOR 问题,但需要一些调整。然而,人工智能只是生物学发明的,它并不能准确地模拟真实的神经网络。因此,您至少必须构建一个 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,以便真正描述输出层上每个类的概率。

    【讨论】:

    • 这是成本函数。我使用了完整的,它就像一个魅力。非常感谢。我想我现在对它有了更好的理解:)
    猜你喜欢
    • 2020-02-29
    • 2021-05-20
    • 2014-02-03
    • 2018-06-28
    • 2016-08-18
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多