模型构造 讨论区


#64

我觉得这样理解是不对的,nn是gluon中的一个子模块. 别名的语法是from…import…as.


#65

哦, 是我的用词不对,不好意思


#66

我觉得可能是网站上的文档跟gulon不匹配…


#67

“from module_name import name” 的本质是导入指定的变量或方法到当前文件中。


#68

应该这样理解


#69

谢谢,看了下源代码,有点理解了,gulon package中导入了block, nn pakage也导入了block,同时gulon中导入了nn,所以gulon.block跟nn.block是同一个东西.


#70

继承 Block 类来构造模型

class MLP(nn.Block):
  def __init__(self, **kwargs):
    super(MLP, self).__init__(**kwargs)
    self.hidden = nn.Dense(256, activation='relu')
    self.output = nn.Dense(10)

  def forward(self, x):
    return self.output(self.hidden(x))

e.g.1 实例化 MLP 类

x = nd.random.uniform(shape=(2, 20))
net = MLP()
net.initialize()
print('e.g.1:', net, net(x))

我期待的结果是:

('e.g.1:', MLP(
  (hidden): Dense(20 -> 256, Activation(relu))
  (output): Dense(256 -> 10, linear)
),

但是实际print的如下,output和hidden的位置反了。

('e.g.1:', MLP(
  (output): Dense(256 -> 10, linear)
  (hidden): Dense(20 -> 256, Activation(relu))
),

因为nn.block__setattr__会按顺序register_child注册hiddenoutput,我尝试在__init__函数中调换了self.hiddenself.output,结果还是一样。

我试了print_summary,顺序是按照期待中的(应该是因为forward中定义了顺序)。我觉得print net有必要和print_summary的顺序一致,否则会引起误会。 @astonzhang @mli

________________________________________________________________________________________________________________________
Layer (type)                                        Output Shape            Param #     Previous Layer
========================================================================================================================
data(null)                                          20                      0
________________________________________________________________________________________________________________________
dense0_fwd(FullyConnected)                          256                     5376        data
________________________________________________________________________________________________________________________
dense0_relu_fwd(Activation)                         256                     0           dense0_fwd
________________________________________________________________________________________________________________________
dense1_fwd(FullyConnected)                          10                      2570        dense0_relu_fwd
========================================================================================================================
Total params: 7946

#71

习题2,如果我们去掉 FancyMLP ⾥⾯的 asscalar 会有什么问题?

x = nd.ones((2, 2)).norm().asscalar()
if x > 1.2:
  print('e.g.6:', x, type(x))

x = nd.ones((2, 2)).norm()
if x > 1.2:
  print('\ne.g.6:', x, type(x))

输出:

('e.g.6:', 2.0, <type 'numpy.float32'>)

('e.g.6:',
[2.]
<NDArray 1 @cpu(0)>, <class 'mxnet.ndarray.ndarray.NDArray'>)

从打印结果来看,做不做asscalar()似乎对控制流并没有影响?


#72

ParammeterDict object has no attribute get_constant 什么情况啊???


#73

更新一下mxnet?


#74

问下里面的super函数的作用是什么呀?


#75

那请问如果要在class内for loop要怎么操作?能给出代码例子看看嘛~谢谢~


#76

例子里面:class MySequential(nn.Block)类
通过这样的方式打印net

x = nd.random.uniform(shape=(5,40))
net = MySequential()
net.add(nn.Dense(256, activation='relu'))
net.add(nn.Dense(10))
net.initialize()
print (net(x))
print (net)

最后显示:
MySequential(

)

而MLP的是可以打印出net的。


#77
  • 如果不在 MLP 类的 __init__ 函数里调用父类的 __init__ 函数,会出现什么样的错误信息?
    会出现如下错误信息。
    尝试了以下,会出现如下错误信息。

#78

请教以下各位。

  • 如果去掉 FancyMLP 类里面的 asscalar 函数,会有什么问题?
    尝试修改代码,去掉asscaler函数,运行结果没有发现什么异常啊?
    x.norm().asscalar() 返回的是 “True” or “False”,
    x.norm() 返回的是 “[1.]” or “[0.]”,
    但是对这段程序的运行结果有影响吗?

#79

x = nd.relu(nd.dot(x, self.weight)+1)
修改为
x = nd.relu(nd.dot(x, self.weight.data())+1)
是否就可以参与运算了呢?


另外,关于 gluon 和nn的区别:
from mxnet.gluon import nn
因为我们在import gluon的时候,给gluon取了一个更简单的名称“nn”。


#80

def forward(self, x):
x = self.dense(x)
# 使用创建的常数参数,以及NDArray的relu函数和dot函数
x = nd.relu(nd.dot(x, self.rand_weight.data()) + 1)
# 复用全连接层。等价于两个全连接层共享参数
x = self.dense(x)
# 控制流,这里我们需要调用asscalar函数来返回标量进行比较
while x.norm().asscalar() > 1:
x /= 2
if x.norm().asscalar() < 0.8:
x *= 10
return x.sum()

那为啥就是复用了,不懂啊


#81

为什么,两次同样的网络层的运行结果 会不一样呢?

X=nd.random.uniform(shape=(2,20))
net=MLP()
net.initialize()
net(X)

[[ 0.09543004  0.04614332 -0.00286655 -0.07790346 -0.05130241  0.02942038
   0.08696645 -0.0190793  -0.04122177  0.05088576]
 [ 0.0769287   0.03099706  0.00856576 -0.044672   -0.06926838  0.09132431
   0.06786592 -0.06187843 -0.03436674  0.04234696]]
<NDArray 2x10 @cpu(0)>
net=MySequential()
net.add(nn.Dense(256,activation='relu'))
net.add(nn.Dense(10))
net.initialize()
net(X)

[[ 0.00362229  0.00633331  0.03201145 -0.01369375  0.10336448 -0.0350802
  -0.00032165 -0.01676024  0.06978628  0.01303309]
 [ 0.03871717  0.02608212  0.03544958 -0.02521311  0.11005436 -0.01430663
  -0.03052467 -0.03852826  0.06321152  0.0038594 ]]
<NDArray 2x10 @cpu(0)>

但是X每次是一样的
并且之后每次运行也不一样了,但,每次重启环境,重新运行的话,又是一样的,这是为什么?


#82

唉,哥们,from mxnet.gluon import nn 指的是从mxnet的gluon模块里面只导入了nn这个模块,而没有导入gluon里面的别的模块,详情参考:python基础语法


#83

唉,第一个问题:你每次都调用net.initialize()这句话,初始化是随机初始化,权重不一样,计算结果当然不一样; 第二个问题:详情敬请百度搜索:“随机种子”