多层感知机的简洁实现 讨论区

http://zh.diveintodeeplearning.org/chapter_deep-learning-basics/mlp-gluon.html

建议改下教程, 在多层感知机的gluon和scratch两个版本, 似乎讲的不是一回事.

网络是相同的, 只是gluon版本的输出层使用的linear激活函数, 而scratch版本的输出层使用relu激活函数.

反正scratch在定义net时, 去掉输出层的relu后, 精度大幅上升 :joy:

@szha

2赞

嗯,scratch那头的输出层比gluon版多个relu,感谢汇报! 已奖励badge

请教一下,下面的函数是scratch 版本的多层感知机,你怎么去除输出层的relu呢?
谢谢!
def net(X):
X = X.reshape((-1, num_inputs))
h1 = relu(nd.dot(X, W1) + b1)
output = nd.dot(h1, W2) + b2
return output

这个是更新过的

1赞

没错,谢谢啊!

按我的理解应该是网络层数越深效果应该更好,但是增加隐藏层之后效果似乎更差了

1赞

哈哈 我加了几个隐藏层也是一样 准确率更差了 看样调参果然是个很复杂的事情

from mxnet import gluon

net = gluon.nn.Sequential()
with net.name_scope():
net.add(gluon.nn.Flatten())
net.add(gluon.nn.Dense(512, activation=“relu”))
net.add(gluon.nn.Dense(256, activation=“relu”))
net.add(gluon.nn.Dense(128, activation=“relu”))
net.add(gluon.nn.Dense(10))
net.initialize()
我加了三个隐层,结果就:joy:
Epoch 0. Loss: 0.914370, Train acc 0.662023, Test acc 0.825000
Epoch 1. Loss: 0.505413, Train acc 0.809757, Test acc 0.849902
Epoch 2. Loss: 0.414535, Train acc 0.845462, Test acc 0.862891
Epoch 3. Loss: 0.395988, Train acc 0.851020, Test acc 0.873047
Epoch 4. Loss: 0.355705, Train acc 0.866295, Test acc 0.875586
Epoch 5. Loss: 0.329255, Train acc 0.878125, Test acc 0.881543
Epoch 6. Loss: 0.321669, Train acc 0.880580, Test acc 0.885840
Epoch 7. Loss: 0.297310, Train acc 0.887871, Test acc 0.887305
Epoch 8. Loss: 0.287356, Train acc 0.892115, Test acc 0.888867
Epoch 9. Loss: 0.275935, Train acc 0.896232, Test acc 0.880469
Epoch 10. Loss: 0.269059, Train acc 0.898039, Test acc 0.891992
Epoch 11. Loss: 0.254537, Train acc 0.903635, Test acc 0.891992
Epoch 12. Loss: 0.247496, Train acc 0.905796, Test acc 0.889160
Epoch 13. Loss: nan, Train acc 0.457541, Test acc 0.103516
Epoch 14. Loss: nan, Train acc 0.100039, Test acc 0.103516

为什么nan了?

1赞

我个人观点是:

1.softmax cost function有exp和分母项;

2.relu激活函数不像sigomoid那样具有控制输出到一定范围的作用。

这样的结果应该是跑到后面几轮,可能因为某点激活值过大(几百?),导致exp后更大(上溢),sgd更新后weight直接飞了。现在正在调整lr,看看后面有没有可能收敛。有好的实验结果再上传。:grinning:

3赞

这个函数中,输出层本来就没有relu激励函数吧

lr设置0.2,跑了200轮。171轮train_acc就100%了,不过没啥意义赶脚,test_acc一直维持90附近。

111

不过mnist这个小数据集算是跑够了。

1赞

吼吼,我也玩儿起来:hugs:

第二课中,两个版本的网络训练过程中,Train acc 都比 Test acc低,这个貌似不应该呀,视频中说可以上论坛上讨论,我找了半天,也没找到。
请问这个问题已经讨论了么,给个链接最好了。

为什么optimizer改为“Adam”后准确率这么低?
Adam

把learning rate调小一点

把激活函数换成sigmoid感觉正确率并未降低很多。。。什么时候影响比较大呢?

不太清楚你的语法,会不会因为Adam和其他Ada开头的optimizer只适用于稀疏特征值的训练数据?而fashion MNIST的特征是密集度比较高的。

请问这里的train_loss为什么是为累计的平均batch_loss呀?
train_loss不应该是模型在整个训练数据集上的平均loss吗。