【问题标题】:TensorFlow XOR implementation, fail to achieve 100% accuracyTensorFlow XOR 实现,无法达到 100% 的准确率
【发布时间】:2018-06-11 15:13:45
【问题描述】:

我是machine learningtensorflow 的新手。我正在尝试在张量流中实现异或门,我想出了这段代码。

import numpy as np
import tensorflow as tf

tf.reset_default_graph()

learning_rate = 0.01
n_epochs = 1000
n_inputs = 2
n_hidden1 = 2
n_outputs = 2

arr1, target = [[0, 0], [0, 1], [1, 0], [1,1]], [0, 1, 1, 0]

X_data = np.array(arr1).astype(np.float32)
y_data = np.array(target).astype(np.int)


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


with tf.name_scope("dnn_tf"):
    hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1", activation=tf.nn.relu)
    logits = tf.layers.dense(hidden1, n_outputs, name="outputs")

with tf.name_scope("loss"):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
    loss = tf.reduce_mean(xentropy, name="loss")

with tf.name_scope("train"):
    optimizer = tf.train.MomentumOptimizer(learning_rate, momentum=0.9)
    training_op = optimizer.minimize(loss)

with tf.name_scope("eval"):
    correct = tf.nn.in_top_k(logits, y, 1)
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    init.run()
    for epoch in range(n_epochs):
        if epoch % 100 == 0:
            print("Epoch: ", epoch, " Train Accuracy: ", acc_train)

        sess.run(training_op, feed_dict={X:X_data, y:y_data})    
        acc_train = accuracy.eval(feed_dict={X:X_data, y:y_data})

代码运行良好,但每次运行我得到不同的输出

运行-1

Epoch:  0  Train Accuracy:  0.75
Epoch:  100  Train Accuracy:  1.0
Epoch:  200  Train Accuracy:  1.0
Epoch:  300  Train Accuracy:  1.0
Epoch:  400  Train Accuracy:  1.0
Epoch:  500  Train Accuracy:  1.0
Epoch:  600  Train Accuracy:  1.0
Epoch:  700  Train Accuracy:  1.0
Epoch:  800  Train Accuracy:  1.0
Epoch:  900  Train Accuracy:  1.0

运行-2

Epoch:  0  Train Accuracy:  1.0
Epoch:  100  Train Accuracy:  0.75
Epoch:  200  Train Accuracy:  0.75
Epoch:  300  Train Accuracy:  0.75
Epoch:  400  Train Accuracy:  0.75
Epoch:  500  Train Accuracy:  0.75
Epoch:  600  Train Accuracy:  0.75
Epoch:  700  Train Accuracy:  0.75
Epoch:  800  Train Accuracy:  0.75
Epoch:  900  Train Accuracy:  0.75

运行3-

Epoch:  0  Train Accuracy:  1.0
Epoch:  100  Train Accuracy:  0.5
Epoch:  200  Train Accuracy:  0.5
Epoch:  300  Train Accuracy:  0.5
Epoch:  400  Train Accuracy:  0.5
Epoch:  500  Train Accuracy:  0.5
Epoch:  600  Train Accuracy:  0.5
Epoch:  700  Train Accuracy:  0.5
Epoch:  800  Train Accuracy:  0.5
Epoch:  900  Train Accuracy:  0.5

我无法理解我在这里做错了什么以及为什么我的解决方案没有收敛。

【问题讨论】:

  • 在尽可能小的数据集上增加隐藏层大小和 1000 个 epoch 是不必要的。你也想在最后有一个神经元,对吧?
  • 但是训练样例的数量只有 4 个。我认为 1000 个 epoch 就足以收敛。如果我的假设不正确,请道歉。
  • 可能是网络太小了,你试过更高的n_hidden吗?
  • 是的,n_hidden=5 收敛速度更快

标签: tensorflow neural-network tensor


【解决方案1】:

理论上,可以使用一个隐藏层和两个具有 ReLU 激活的单元来解决 XOR,就像您在代码中所做的那样。但是,网络能够表示解决方案与能够学习解决方案之间始终存在关键区别。我会假设由于网络规模较小,您会遇到“dead ReLU”问题,由于不幸的随机初始化,您的隐藏单元中的一个(或两个)不会为任何输入激活。不幸的是,ReLU 在零激活时也具有零梯度,因此从不激活的单元也无法学习任何东西。

增加隐藏单元的数量会降低发生这种情况的可能性(即,您可以拥有三个死单元,而另外两个仍然足以解决问题),这可以解释为什么使用五个隐藏单元会更成功.

【讨论】:

    【解决方案2】:

    您可能想查看互动式TensorFlow Playground。他们有一个 XOR 数据集可用。您可以使用隐藏层的数量、大小、激活函数等,并可视化分类器通过 epohcs 的数量学习的决策边界。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2016-02-19
      • 2020-03-25
      • 1970-01-01
      相关资源
      最近更新 更多