Keras XOR 未训练

原文标题Keras XOR not training

我们已经尝试了一段时间来让它工作。这可能是最容易创建的例子,所以现在我们需要帮助。我们一直在改变 fit 函数中的时期数,这给了我们不同的结果,但从来没有任何好东西,当我们将它们增加太多时,它们总是会收敛到 0.5。

#%%

inputValues = numpy.array([[0,0],[0,1],[1,0],[1,1]])
inputResults = numpy.array([[0],[1],[1],[0]])

print(inputValues)
print(inputResults)
#%%

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(2,)),
    keras.layers.Dense(units=2, activation=("relu")),
    keras.layers.Dense(units=2, activation=("softmax"))
    ])

model.compile(loss = keras.losses.SparseCategoricalCrossentropy(), optimizer = tensorflow.optimizers.Adam(), metrics=['accuracy'])

model.fit(inputValues, inputResults, epochs=2500)
model.summary()

print(model.weights)
#%%

print(model.predict_proba(inputValues))

print("End of file.")

根据我对 ANN 的理解,我们应该在第一层有 2 个输入,特别是对于 XOR 示例。以及输出的两个输出(0 或 1)。我假设由于不需要说出这些输出是什么(0 或 1),张量流通过比较 fit 函数中的结果来自动处理这个问题?最后,我们尝试了隐藏层(2 个)和没有隐藏层,但似乎仍然没有得到更好的结果。

有人可以让我们知道我们做错了什么吗?

原文链接:https://stackoverflow.com//questions/71457401/keras-xor-not-training

回复

我来回复
  • Schnitte的头像
    Schnitte 评论

    您的问题本质上是一个二元分类问题,因为输出可以是 0 或 1。为此,您不需要两个输出神经元;可以使用 sigmoid 函数,该函数将返回 0 或 1 作为输出(sigmoid 通常适用于二进制分类,因为它的特征 S 形将使您的值接近 0 或接近 1)。

    您需要进行的另一个调整是将损失函数设置为二元交叉熵;您的选择,稀疏分类交叉熵,适用于分类为 2 个以上的类别。

    所以我尝试的代码是:

    model = keras.Sequential([
    keras.layers.Flatten(input_shape=(2,)),
    keras.layers.Dense(units=4, activation=("sigmoid")),
    keras.layers.Dense(units=1, activation=("sigmoid"))
    ])
    
    model.compile(loss = keras.losses.BinaryCrossentropy(from_logits=False), optimizer = optimizers.Adam(), metrics=['accuracy'])
    
    model.fit(inputValues, inputResults, epochs=2500)
    

    通过这些设置,我将训练准确度提高到 1.0000。花了一段时间才到达那里,我想可以通过调整学习率来加快速度,但这应该足以完成工作。

    2年前 0条评论