多层感知机的从零开始实现 讨论区


#21

GPU小白,请问在后面在GPU上编程与在CPU上有什么区别吗?现在没有GPU的环境。


#22

求问,既然已经要求用 cross_entropy 作为loss函数的计算,那么为什么在定义 net 函数的时候,输出层,也就是 output 就是简单的 nd.dot(h1, W2) + b2, 而不是 softmax(nd.dot(h1, W2) + b2
微信截图_20180112235251


#23

大概理解了,因为在定义loss函数的时候,用的是 softmax_cross_entropy,但是这又会产生一个新的问题,在计算accuracy等的时候,这里的output不是归一的值了,这会导致这个输出值的含义模糊,对吧?


02


#24

归一化并不影响相对大小,归一化前的最大值在归一化以后依然是最大值


#25

通过运行help(nd.random_normal)了解参数的意义可知,scale实际上对应的产生随机数的标准差,即std,我记得NG讲过W的初始化的mean分布在0,std=1/sqrt(n),n为units的个数,所以本题的的W的初始权重在1/16左右是没有问题,因此修改weight_scale=0.1/0.01都是可以运行,当为1时,太大了,导致梯度太大,SGD无法运行。


#26

求助,求问scratch版本添加两层隐含层,在训练部分应该怎么改呢?
另,模型定义这样改可以吗?


#27

增加了隐藏层后 顺便增加了训练的次数到30次 貌似在到第28次的时候 loss突然增加到了18.9876.。。。。。。不知道是为啥 第二个隐藏层的节点是60


#28

似乎是偶然现象吧 应该跟值的初始化有关。。。


#29

请问老师,为什么 W2.shape, b2.shape, outputs.shape分别是(256, 10) (10,) (256, 10),b2却可以broadcasting呢?
b2不应该是(1,10)或者(,10)才可以吗?

不太懂,求指导。谢谢!


#30

实际计算是 W_2^T x + b_2


#31

谢谢沐神回复。

还是不是特别明白,两层的代码分别是:
X = X.reshape((-1, num_inputs))
h1 = relu(nd.dot(X, W1) + b1)
output = nd.dot(h1, W2) + b2

output.shape我print出来是(256, 10),也就是(num_examples, num_outputs)

而如你说的nd.dot(W2.T, h1) + b2, 那W2.T.shape、h1.shape分别是(10, 256)和(256, 256),dot后的shape应该是(10, 256),b2广播后也是(10,256),二者相加后应该是(10, 256)而不是output的(256,10)吧?

再次谢谢大神老师!


#32

哦,搞错了 确实是 $x W_2 + b$,为什么可以broadcast是因为matching是从shape的最低到最高。最右边是第0维,所以就是从右到左的match


#33

我们使用了 weight_scale 来控制权重的初始化值大小,增大或者变小这个值会怎么样?
weight_scale 设成10, acc 0.451->0.344 loss 一直在降低,但是accuracy也在降低
weight_scale 设成.5, acc 0.614->0.746
weight_scale 设成.05, acc 0.743->0.866
weight_scale 设成.01, acc 0.738->0.849
weight_scale 设成.005, acc 0.674->0.861
weight_scale 设成.001, acc 0.660->0.857
weight_scale 设成.00001, acc 0.590->0.853
weight_scale 设成 0, python就死了
记得 Ang Wu的课 是说这个起始weight不能设为0

尝试改变 num_hiddens 来控制模型的复杂度
hidden layer 10
Epoch 0. Loss: 1.252398, Train acc 0.500818, Test acc 0.691106
Epoch 1. Loss: 0.666911, Train acc 0.738231, Test acc 0.768830
Epoch 2. Loss: 0.596531, Train acc 0.780315, Test acc 0.798478
Epoch 3. Loss: 0.559390, Train acc 0.793303, Test acc 0.814002
Epoch 4. Loss: 0.542588, Train acc 0.802784, Test acc 0.827224

hidden layer 512,
Epoch 0. Loss: 0.763049, Train acc 0.713608, Test acc 0.774339
Epoch 1. Loss: 0.475959, Train acc 0.823851, Test acc 0.845954
Epoch 2. Loss: 0.426344, Train acc 0.842465, Test acc 0.861378
Epoch 3. Loss: 0.387897, Train acc 0.856454, Test acc 0.869191
Epoch 4. Loss: 0.366468, Train acc 0.863699, Test acc 0.863882

尝试加入一个新的隐含层
加了一个256的隐藏层

Epoch 0. Loss: 1.333896, Train acc 0.496928, Test acc 0.696615
Epoch 1. Loss: 0.572982, Train acc 0.781116, Test acc 0.818710
Epoch 2. Loss: 0.469473, Train acc 0.826072, Test acc 0.846554
Epoch 3. Loss: 0.427476, Train acc 0.842064, Test acc 0.855168
Epoch 4. Loss: 0.406262, Train acc 0.851195, Test acc 0.855869


#34

1、隐藏层的话,设置的每一层的units数量应该逐层递减,比如hidden1 =256,后面可以一次为 128 64 32. 或者直接
hidden 2=64(32)。 这样
2、隐藏层过多的话训练会比较慢,因此epoch次数应该多一点
3、隐藏层太多,导致梯度爆炸或者梯度消失。从而产生nan


#36

我觉得是因为weight_scale的方差越大,梯度的方差就会越大。梯度方差越大就越不稳定。


#37

直接使用1/16=0.625.我去weight_scale=0.6,训练结果出现训练的准确率高于测试的准确率,请问是什么原因?希望沐神能够见一下初始化参数这一块.
Epoch 0. Loss: 0.341686, Train acc 0.874265, Test acc 0.869291
Epoch 1. Loss: 0.329852, Train acc 0.878589, Test acc 0.874299
Epoch 2. Loss: 0.318583, Train acc 0.882228, Test acc 0.875401
Epoch 3. Loss: 0.308178, Train acc 0.886285, Test acc 0.876703
Epoch 4. Loss: 0.299554, Train acc 0.889623, Test acc 0.870493
Epoch 5. Loss: 0.288443, Train acc 0.892461, Test acc 0.884515
Epoch 6. Loss: 0.281514, Train acc 0.895399, Test acc 0.881811
Epoch 7. Loss: 0.273861, Train acc 0.898738, Test acc 0.878405
Epoch 8. Loss: 0.269596, Train acc 0.899990, Test acc 0.886819
Epoch 9. Loss: 0.264138, Train acc 0.901793, Test acc 0.886018


#38
  • weight_scale调大[0.01->10],第一次loss值会很大,会一直下降,但是train_acc和test_acc几乎不会变化.
  • weight_scale调小[0.01->0.000001],用沐神的话来说"没什么区别",train_acc和test_acc在每次weight_scale变化时,变化不是很大.
  • 如果weight_scale=0,则会报错Check failed: param.scale > 0 (0 vs. 0) scale parameter in gaussian has to be positive.应该是梯度vanish了吧~沐神

#39

源代码运行遇到报错

此课http://zh.gluon.ai/chapter_deep-learning-basics/mlp-scratch.html,我把所有代码原样复制到spyder(3.6python)中,运行总是停留在runfile(‘D:/Programming/Python/DeepLearningSchool/gluon_tutorials_zh-1.0/2Mulitiplayer.py’, wdir=‘D:/Programming/Python/DeepLearningSchool/gluon_tutorials_zh-1.0’)

Reloaded modules: gluonbook, gluonbook.utils

Downloading C:\Users\Administrator.mxnet\datasets\fashion-mnist\train-images-idx3-ubyte.gz from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/dataset/fashion-mnist/train-images-idx3-ubyte.gz
一直无法运行。
1、我尝试进入C:\Users\Administrator.mxnet\datasets\fashion-mnist\文件夹目录,应用浏览器进入https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/dataset/fashion-mnist/train-images-idx3-ubyte.gz下载了数据集,放在D:\Programming\Python\DeepLearningSchool\gluon_tutorials_zh-1.0目录下,依旧是这样
请教我该如何解决?


#40

问题1: 改变超参数 num_hiddens 的值,看看对结果有什么影响?
回答:epoch 设为100,num_hiddens 由256改成32 ,loss 会下降比较慢,而 train accuracy 会上升比较慢
image


#41

问题2: 试着加入一个新的隐藏层,看看对结果有什么影响。
回答:epoch 设为100;增加 一层 num_hiddens =256/128的隐藏层:发现增加一层,迭代100次之后,loss更容易 比不增加一层的loss更容易收敛,train accuracy增加得更多 ;另外 num_hiddens 为256/128 影响并不大。