python - 异或神经网络,损失不下降

标签 python machine-learning neural-network perceptron mxnet

我正在使用 Mxnet 训练 XOR 神经网络,但损失并没有下降,它们始终高于 0.5。

下面是我在 Mxnet 1.1.0 中的代码; Python 3.6; OS X El Capitan 10.11.6

我尝试了 2 个损失函数 - 平方损失和 softmax 损失,都没有用。

from mxnet import ndarray as nd
from mxnet import autograd
from mxnet import gluon
import matplotlib.pyplot as plt

X = nd.array([[0,0],[0,1],[1,0],[1,1]])
y = nd.array([0,1,1,0])
batch_size = 1
dataset = gluon.data.ArrayDataset(X, y)
data_iter = gluon.data.DataLoader(dataset, batch_size, shuffle=True)

plt.scatter(X[:, 1].asnumpy(),y.asnumpy())
plt.show()

net = gluon.nn.Sequential()
with net.name_scope():
    net.add(gluon.nn.Dense(2, activation="tanh"))
    net.add(gluon.nn.Dense(1, activation="tanh"))
net.initialize()

softmax_cross_entropy = gluon.loss.SigmoidBCELoss()#SigmoidBinaryCrossEntropyLoss()
square_loss = gluon.loss.L2Loss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.3})

train_losses = []

for epoch in range(100):
    train_loss = 0
    for data, label in data_iter:
        with autograd.record():
            output = net(data)
            loss = square_loss(output, label)
        loss.backward()
        trainer.step(batch_size)

        train_loss += nd.mean(loss).asscalar()
    train_losses.append(train_loss)

plt.plot(train_losses)
plt.show()

最佳答案

我在其他地方弄明白了这个问题,所以我要把答案贴在这里。

基本上,我的原始代码中的问题是多维的。

  1. 权重初始化。请注意,我使用了默认初始化

net.initialize()

实际上是这样

net.initialize(initializer.Uniform(scale=0.07))

显然这些初始权重太小,网络永远无法跳出它们。所以解决方法是

net.initialize(mx.init.Uniform(1))

这样做之后,网络可以使用 sigmoid/tanh 收敛作为激活,并使用L2Loss作为损失函数。它与 sigmoid 一起工作和 SigmoidBCELoss .但是,它仍然不适用于 tanhSigmoidBCELoss , 可以通过下面的第二项修复。

  1. SigmoidBCELoss必须在输出层的这2个场景中使用。

    2.1。 线性激活SigmoidBCELoss(from_sigmoid=False) ;

    2.2。 非线性激活SigmoidBCELoss(from_sigmoid=True) , 其中非线性函数的输出落在 (0, 1) 中。

在我的原始代码中,当我使用 SigmoidBCELoss 时, 我正在使用所有 sigmoid , 或全部 tanh .所以只需要将输出层中的激活从tanh更改为至 sigmoid ,网络可以收敛。我仍然可以拥有 tanh在隐藏层中。

希望这对您有所帮助!

关于python - 异或神经网络,损失不下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601077/

相关文章:

python - 提交表单以从就业委员会抓取数据

Python 实践 : arguments passed by "reference"

Python msn hook - 可能吗?

machine-learning - 使用循环神经网络进行字符串匹配

python - 如果我们可以直接使用变量而无需初始化,为什么我们在tensorflow中使用tf.Variable?

python - 如何使用 pySerial 从 serialException 中恢复

python - Scikit-Learn/Pandas : make a prediction using a saved model based on user input

matlab - 多步预测神经网络

arrays - 不知道批量大小的 3-D 批量矩阵乘法

c - C 语言的非收敛神经网络