我使用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()
答案 0 :(得分:1)
我在其他地方发现了这个问题,所以我将在这里发布答案。
基本上,我原始代码中的问题是多维的。
net.initialize()
实际上
net.initialize(initializer.Uniform(标度= 0.07))
显然这些初始权重太小,网络永远不会跳出来。所以修复是
net.initialize(mx.init.Uniform(1))
执行此操作后,网络可以使用sigmoid/tanh
作为激活进行收敛,并使用L2Loss
作为丢失功能。它适用于sigmoid
和SigmoidBCELoss
。但是,它仍无法与tanh
和SigmoidBCELoss
一起使用,可以通过下面的第二项修复。
SigmoidBCELoss
必须在输出层的这两种情况中使用。
2.1。 线性激活和SigmoidBCELoss(from_sigmoid=False)
;
2.2。 非线性激活和SigmoidBCELoss(from_sigmoid=True)
,其中非线性函数的输出属于(0,1)。
在我的原始代码中,当我使用SigmoidBCELoss
时,我使用的是全部sigmoid
或全部tanh
。因此,只需将输出层中的激活从tanh
更改为sigmoid
,网络就可以收敛。我仍然可以在隐藏图层中使用tanh
。
希望这有帮助!