为啥我的 XOR tensorflow 网络没有学习?

Posted

技术标签:

【中文标题】为啥我的 XOR tensorflow 网络没有学习?【英文标题】:Why isn't my XOR tensorflow network learning?为什么我的 XOR tensorflow 网络没有学习? 【发布时间】:2019-01-19 16:48:32 【问题描述】:

我无法弄清楚我在使用这个 XOR 神经网络时做错了什么。也许我没有正确计算损失?损失开始时略有改善,然后准确率很快收敛到 50%。有人可以指出我做错了什么吗?

这是一个最小的自包含示例:

import numpy as np
import tensorflow as tf

n_inputs = 2
n_hidden = 3
n_outputs = 1

X = tf.placeholder(tf.float32, shape=(None, n_inputs), name='X')
y = tf.placeholder(tf.float32, shape=(None), name='y')

def neuron_layer(X, n_neurons, name, activation=None):
    with tf.name_scope(name):
        n_inputs = int(X.get_shape()[1])
        stddev = 2 / np.sqrt(n_inputs)
        init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)
        W = tf.Variable(init, name="weights")
        b = tf.Variable(tf.zeros([n_neurons]), name="bias")
        Z = tf.matmul(X, W) + b
        if activation is not None:
            return activation(Z)
        else: return Z

with tf.name_scope('nn'):
    hidden = neuron_layer(X, n_hidden, name='hidden', activation=tf.nn.sigmoid)
    prediction_probabilities = neuron_layer(hidden, n_outputs, name='outputs', activation=tf.nn.sigmoid)

with tf.name_scope('loss'):
    mse_loss = tf.reduce_mean(tf.squared_difference(y, prediction_probabilities), name='loss')    

learning_rate = 0.1

with tf.name_scope('train'):
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
    training_op = optimizer.minimize(mse_loss)

with tf.name_scope('eval'):
    correct = tf.equal(tf.greater_equal(prediction_probabilities,0.5), tf.cast(y,tf.bool))
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

init = tf.global_variables_initializer()

X_train = [
    (0, 0),
    (0, 1),
    (1, 0),
    (1, 1)
]
y_train = [0,1,1,0]

with tf.Session() as sess:
    init.run()
    for epoch in range(500):
        _, mse, acc = sess.run([training_op, mse_loss, accuracy], 
                               feed_dict=X: np.array(X_train), y: np.array(y_train))
        print("mse: %.4f, accuracy: %.2f" % (mse, acc))

【问题讨论】:

【参考方案1】:

您的代码非常好。问题在于您的输入。您需要传递 2D 列表,而不是 1D。每个内部列表都是一个单维输入,这就是 tensorflow 解析它们的方式。

y_train = [[0],[1],[1],[0]]

之后您的代码运行良好。

...
mse: 0.0002, accuracy: 1.00

【讨论】:

啊!!谢谢!我会永远意识到这一点,因为我以前实际上是这样的,并且由于之前的错误而错误地更改了它。

以上是关于为啥我的 XOR tensorflow 网络没有学习?的主要内容,如果未能解决你的问题,请参考以下文章

不怕学不会 | 使用TensorFlow从零开始构建卷积神经网络

深度学习之 TensorFlow:卷积神经网络

深度学习之基于Tensorflow2.0实现VGG16网络

tensorflow学习之搭建最简单的神经网络

深度学习之TensorFlow安装与初体验

tensorflow 全连接神经网络识别mnist数据