关键是异或问题的提出是为了证明一些模型可以学习非线性问题而一些模型不能。
因此,当模型在您提到的数据集上获得 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(2, activation='relu'))
model.compile(optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.1), loss='categorical_crossentropy', metrics=['categorical_accuracy'])
model.fit(X, y, epochs=100)
_, acc = model.evaluate(X, y)
print('acc = ' + str(acc))
这使:
累积 = 0.5
如您所见,该模型无法对已经看到的数据进行分类。原因是,这是一个非线性数据,我们的模型只能对线性数据进行分类。(这里有一个链接可以更好地理解 XOR 问题的非线性)。只要我们在网络中添加另一层,它就能够解决这个问题:
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))
这使:
累积 = 1.0
通过只添加一个神经元,我们的模型学会了做它在 100 个 epoch 中无法学习的事情(即使它已经看到了数据)。
总而言之,我们的数据集非常小,网络可以轻松记住它是正确的,但 XOR 问题很重要,因为这意味着有些网络无论如何都无法记住这些数据。
话虽如此,但在适当的训练和测试集上存在各种 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()
希望有所帮助;))