回到有关XOR问题的基础知识-基本面感到困惑

时间:2019-06-08 13:00:34

标签: machine-learning scikit-learn neural-network perceptron mlp

这对于XOR和MLP一直困扰着我一段时间;它可能是基本的(如果是这样,请提前使用apoligie),但是我想知道。

有许多方法可以解决使用MLP的XOR,但是通常看起来像这样:

from sklearn.neural_network import MLPClassifier

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [0, 1, 1, 0]

model = MLPClassifier(
    activation='relu', max_iter=1000, hidden_layer_sizes=(4,2))

现在适合模型:

model.fit(X, y)

那你猜怎么着?

print('score:', model.score(X, y)) 

输出完美

  

得分:1.0

但是预测和评分是什么?对于XOR,我们有一个数据集,根据定义(!),该数据集具有四行,两个特征和一个二进制标签。没有可使用的标准X_train, y_train, X_test, y_test。再次,根据定义,没有未知的数据可供模型消化。

预测的形式为

model.predict(X)

与执行训练的X完全相同。

那么,模型不是只吐出训练过的y吗?我们怎么知道该模型“学习”了什么?

编辑:只是为了弄清楚什么让我感到困惑-这些功能只有2个,只有2个唯一值; 2个唯一值具有4个,只有4个可能的组合。每个可能的组合的正确标签已经存在于标签列中。那么,调用fit()时模型可以“学习”什么呢?以及这种“学习”是如何进行的?当模型可以为每种可能的输入组合访问“正确”答案时,如何将模型“错误”?

再次,很抱歉,这可能是一个非常基本的问题。

1 个答案:

答案 0 :(得分:1)

关键是提出了XOR问题,以演示某些模型如何学习非线性问题而某些模型不能学习非线性问题。

因此,当模型在您提到的数据集上达到1.0精度时,这是值得注意的,因为它已经学会了非线性问题。它已经学会了训练数据这一事实足以让我们知道它可以(潜在地)学习非线性模型。请注意,如果不是这种情况,您的模型将获得非常低的精度(如0.25),因为它会将2D空间通过一条线划分为两个子空间。

为了更好地理解这一点,让我们看一个在相同情况下模型无法学习数据的情况:

import tensorflow as tf
import numpy as np

X = np.array(X)
y = np.array(y)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(1, activation='relu'))
model.add(tf.keras.layers.Dense(2, activation='relu'))


tb_callback = tf.keras.callbacks.TensorBoard(log_dir='./test/', write_graph=True)

model.compile(optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.1), loss='categorical_crossentropy', metrics=['categorical_accuracy'])
model.fit(X, y, epochs=5, callbacks=[tb_callback, ])
acc = model.evaluate(X, y)
print('acc = ' + str(acc))

给出:

  

acc = 0.5

如您所见,此模型无法对已经看到的数据进行分类。原因是,这是一个非线性数据,我们的模型只能对线性数据进行分类。(here是一个链接,可以更好地理解XOR问题的非线性性)。一旦我们在网络中添加了另一层,便可以解决此问题:

import numpy as np
import matplotlib.pyplot as plt

x1 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])
y1 =np.concatenate([np.random.uniform(-100, 0, 100), np.random.uniform(0, 100, 100)])

x2 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])
y2 =np.concatenate([np.random.uniform(0, 100, 100), np.random.uniform(-100, 0, 100)])

plt.scatter(x1, y1, c='red')
plt.scatter(x2, y2, c='blue')
plt.show()

给出:

  

acc = 1.0

通过仅添加一个神经元,我们的模型学会了在1个层的100个时间段内完成其无法学习的操作(即使它已经看到了数据)。

总而言之,我们的数据集非常小,以至于网络可以轻松地存储,但XOR问题很重要,因为这意味着有些网络无法存储此数据,这是正确的无论如何。

但是,正确的训练和测试集会带来各种XOR问题。这是一个(情节略有不同):

<html>
    <body>
        <form action="includes/parts-cat/zip-download.php" method="post" enctype="multipart/form-data" >
            <div class="col-md-3 col-sm-3">
                <label for="">Upload File:</label>
                <div class="input-group">
                    <input type="file" name="myfile">
                </div>
            </div>
            <div class="col-sm-2">
                <label></label>
                <input id="dngr" class="btn btn-danger" type="submit" name="save" style="margin-top:15px;" value="Upload">
            </div>
        </form>
    </body>
</html>

xor data

希望有帮助;))