简单的TensorFlow神经网络可以最大限度地降低成本函数,但所有结果都接近1

时间:2016-08-14 04:48:07

标签: python machine-learning neural-network tensorflow

所以我尝试从以下方面实现神经网络:

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

1 个答案:

答案 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,以便真正描述输出层上每个类的概率。