合肥建设网络网站网站,邯郸建网站公司,如何用ps做网站首页的图片,深圳网站建设学习一. 访问模型参数
对于使用Sequential类构造的神经网络#xff0c;我们可以通过方括号[]来访问网络的任一层。回忆一下上一节中提到的Sequential类与Block类的继承关系。 对于Sequential实例中含模型参数的层#xff0c;我们可以通过Block类的params属性来访问该层包含的所有…一. 访问模型参数
对于使用Sequential类构造的神经网络我们可以通过方括号[]来访问网络的任一层。回忆一下上一节中提到的Sequential类与Block类的继承关系。 对于Sequential实例中含模型参数的层我们可以通过Block类的params属性来访问该层包含的所有参数。 下面访问多层感知机net中隐藏层的所有参数。索引0表示隐藏层为Sequential实例最先添加的层。
net[0].params, type(net[0].params)可以看到我们得到了一个由参数名称映射到参数实例的字典类型为ParameterDict类。其中权重参数的名称为dense0_weight它由net[0]的名称dense0_和自己的变量名weight组成。而且可以看到该参数的形状为(256, 20)且数据类型为32位浮点数float32。为了访问特定参数我们既可以通过名字来访问字典里的元素也可以直接使用它的变量名。下面两种方法是等价的但通常后者的代码可读性更好。
net[0].params[dense0_weight], net[0].weightGluon里参数类型为Parameter类它包含参数和梯度的数值可以分别通过data函数和grad函数来访问。因为我们随机初始化了权重所以权重参数是一个由随机数组成的形状为(256, 20)的NDArray。
net[0].weight.data()权重梯度
net[0].weight.grad()输出层的偏差值。
net[1].bias.data()最后我们可以使用collect_params函数来获取net变量所有嵌套例如通过add函数嵌套的层所包含的所有参数。它返回的同样是一个由参数名称到参数实例的字典。
net.collect_params()二. 初始化模型参数
权重参数元素为[-0.07, 0.07]之间均匀分布的随机数偏差参数则全为0。但我们经常需要使用其他方法来初始化权重。MXNet的init模块里提供了多种预设的初始化方法。在下面的例子中我们将权重参数初始化成均值为0、标准差为0.01的正态分布随机数并依然将偏差参数清零。
# 非首次对模型初始化需要指定force_reinit为真
net.initialize(initinit.Normal(sigma0.01), force_reinitTrue)
net[0].weight.data()[0]下面使用常数来初始化权重参数。
net.initialize(initinit.Constant(1), force_reinitTrue)
net[0].weight.data()[0]如果只想对某个特定参数进行初始化我们可以调用Parameter类的initialize函数它与Block类提供的initialize函数的使用方法一致。下例中我们对隐藏层的权重使用Xavier随机初始化方法。
net[0].weight.initialize(initinit.Xavier(), force_reinitTrue)
net[0].weight.data()[0]三. 共享模型参数
在有些情况下我们希望在多个层之间共享模型参数。“模型构造”一节介绍了如何在Block类的forward函数里多次调用同一个层来计算。这里再介绍另外一种方法它在构造层的时候指定使用特定的参数。如果不同层使用同一份参数那么它们在前向计算和反向传播时都会共享相同的参数。在下面的例子里我们让模型的第二隐藏层shared变量和第三隐藏层共享模型参数。
net nn.Sequential()
shared nn.Dense(8, activationrelu)
net.add(nn.Dense(8, activationrelu),shared,nn.Dense(8, activationrelu, paramsshared.params),nn.Dense(10))
net.initialize()X nd.random.uniform(shape(2, 20))
net(X)net[1].weight.data()[0] net[2].weight.data()[0]我们在构造第三隐藏层时通过params来指定它使用第二隐藏层的参数。因为模型参数里包含了梯度所以在反向传播计算时第二隐藏层和第三隐藏层的梯度都会被累加在shared.params.grad()里。