线性回归的简洁实现 讨论区

还有一个疑问,文章中说在net(x)之后,模型会自动推断出每一层的输入个数,也即输入的特征数,那么在这之前已经进行过参数初始化的工作了,即,执行net. initialize(in it.Normal(sigma=0.03))时还不知道输入的情况,他是怎么初始化权重(w)的,在不知道输入特征个数的基础上? (在 从零开始实现 这一节里,w初始化时,w的大小是人为设计的,依赖于输入特征数,但是 简洁实现 这一节的同一部分只是调用了初始化函数而已,没看出手动设计参数w大小的痕迹)

你看从零开始实现那一节,随机的其实是全部样本的indices,然后通过间隔batch_size来依次选取indices,所以这里的随机选取就会遍历所有的样本。:grin:

1赞

刚看到模型参数的延后初始化,明白是怎么回事了,看来前期好多问题在后面都有解释的

请教各位:
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)
这句代码是想实现什么?前面有labels了,后面一句看不太懂

我们在 step 函数中指明批量大小,从而对批量中样本梯度求平均。

为什么用gluon来实现网络时,不需要用attach_grad()?

对应之前的 [linear-regression-scratch.ipynb]中batch_size

trainer.step(batch_size)
是不是不太严谨,应该拿X的长度
因为最后一个batch的实际size,未必等于我们计划的batch_size

这样会导致最后一个batch的 平均梯度不准确
总梯度除以了一个 比实际size大的 batch_size

后面一句是加入了随机的噪声干扰,,要是完全满足的数据都不用训练了,所以加入一些噪声干扰来体现线性回归的可行性

image
为什么这里不需要用attach_grad()函数来分配内存?

nn模块来写的网络在库函数内已经将这些工作做了,除非是自己手写网络则需要手动来分配内存。

image
请问如何获得这里的initialize()函数的帮助文档?如何获得initialize()函数初始化后的权重参数值和偏差参数值?

   $ net.initialize??

可以看到这是一个函数的解释并且可以看到这个函数定义在block类中。

File: ~/miniconda3/envs/gluon/lib/python3.6/site-packages/mxnet/gluon/block.py

在前一次前向计算之前,我们无法直接操作模型参数。(P96)
在前向计算后,我们可以操作模型参数。(P90)

from mxnet import init,nd
from mxnet.gluon import nn

net=nn.Sequential()
net.add(nn.Dense(256,activation=‘relu’))
net.add(nn.Dense(10))
net.initialize()#使用默认初始化方式

X=nd.random.uniform(shape=(2,20))
Y=net(X)#前向计算

#访问模型参数
print(net[0].params,type(net[0].params))
print(net[0].params[‘dense0_weight’],net[0].weight)
print(net[0].weight.data())
print(net[0].weight.grad())
print(net[1].bias.data())
print(net.collect_params())
print(net.collect_params(’.*weight’))

同样的疑问

我参考例子修改特征个数是3个,真实权重3个,训练模型后,打印训练结果的权重(w)结果什么也没有,但是变差值(b)是有打印出来的。想问为何没有打印训练结果的权重值?

num_inputs = 3
num_examples = 1000
true_w = [1, 2, 3]
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_w[2] * features[:, 2] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)