代码之家  ›  专栏  ›  技术社区  ›  Austin

为什么我的XOR-tensorflow网络学习不成功?

  •  4
  • Austin  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  3
  •   cs95 abhishek58g    6 年前

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

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

    ...
    mse: 0.0002, accuracy: 1.00