模型构造 讨论区


#21

auto_encoder.add(encoder)


#22

谢谢,实在没想到。问题已解决


#23

加了偏置


#24

class Net(gluon.Block)写模型的时候,我在类里面定义了一个函数,描述新设计的层,在这个函数里面需要定义新层的权重变量,请问怎么声明变量?


我试过上面两种方式,然后查看net.collect_params()里面的参数,发现都没有我自己定义的参数,请问正确的方式是什么?


#25

好像要用self.params.get()去定义吧


#26

https://mxnet.incubator.apache.org/tutorials/gluon/gluon.html
我参考的这个例子,然后在class里面新定义了一个函数描述自己设计的层,您的回答有没有参考例子的链接,谢谢


#27


http://zh.gluon.ai/chapter_gluon-basics/custom-layer.html


#28

我已经被gluon.Block nn. Block搞晕了,两个都存在,感觉功能也差不多吧,用nn. Block试一试吧,谢谢你


#29

根据我的测试,gluon.Block和 gluon.nn.Block功能和使用方法一模一样,这样设计的目的是?


#30

我再请教一个问题,参数和常数拼接后用于后续操作,并保持常数不变,例如,
我用nn.Block定义新层,weight定义好了,假如是3x2矩阵,现在需要在weight正中间插入一列0(3x1),得到一个3x3矩阵,需要新插入的一列0一直是0不学习,请问怎么实现比较好?
@mli

我用nd尝试如下,担心有错,请拍砖:
self.W0 = self.params.get(‘order_weight’, shape=(3,1,2,1))
self.b0 = self.params.get(‘order_bias’, shape=(3, init=mx.init.Zero())
weight_zero = nd.zeros(shape=(3,1,1,1), ctx=ctx)
W1 = nd.Concat(self.W0.data()[:,:,0:1,:], weight_zero, self.W0.data()[:,:,1:2,:], dim=2)
output = nd.Convolution(
data=x, weight=W1, bias=self.b0.data(), kernel=W1.shape[2:],
num_filter=W1.shape[0], num_group=embedding_dims)


#31

gluon.Block与nn.Block是一个东西


#33

您好 可以看到RecMLP的最后一层dense层. print(rec_mlp)时没有体现出dense层的非线性激活函数.
如果层数很深的网络,无法看到非线性激活函数的话会是很麻烦的问题.

谢谢!


#34

就在forward函数里面写吧,不需要创建paramater


#35

你可以不用 sequential,纯用

lay1 = Dense(...)
lay2 = Dense(...)

然后就可以print了

参考
http://zh.gluon.ai/chapter_convolutional-neural-networks/resnet-gluon.html#构建ResNet


#36

好的谢谢你,我理解以下. 加油!


#37


gluon 可不可以指定传入的哪些参数不参与自动求导?

具体情况是想实现: y = lam * y_ + (1 - lam) * y_hat , 就是将两张图片的label合成新的label训练. 其中 lam是
numpy.random 生成的随机常数.y是图片的label ,是one-hot向量形式体现的. 用
SoftMaxwithLoss

具体用了两种实现, 第一种:
loss层多加入两个变量. 另一张图片的label 和 随机数 lam. 代码在SoftMax源代码里改动改为:

    def hybrid_forward(self, F, pred, label, label1, lam, sample_weight=None):
    if not self._from_logits:
        pred = F.log_softmax(pred, self._axis)
    
    if self._sparse_label:
        loss = -( lam * F.pick(pred, label , axis=self._axis, keepdims=True)
                       + (1 - lam) * F.pick(pred, label1, axis=self._axis, keepdims=True))

        但是这样就会报上层的错误.    出错出在反向传播, 所以认为是这个输入的参数作为乘法加入计算图了. 怎
        么能不对它反向传播呢? 或者还有起它错误,但我搞了半天真心无头序哎.

另一种实现是输入的label不是常数,已经是向量了:(个人不喜欢这么做,因为人脸的类别可能到几万维,但向量形式
的label,其中一两个是1,其他都是零太浪费了)

       我改了utils.py中的一个函数.

def _get_batch(batch, ctx, lam = 0.1):
“”“return data and label on ctx”""
if isinstance(batch, mx.io.DataBatch):
data = batch.data[0]
label = batch.label[0]
else:
data = batch[0] * lam
label = nd.one_hot(batch[1],10) * lam

        lam = np.random.beta(alpha, alpha)
        data, label, batch_size = _get_batch(batch, ctx, lam)
        data_hat, label_hat, batch_size_hat = _get_batch(batch_hat, ctx, 1 - lam)

        data_input = data + data_hat
        label_input = label + label_hat

但还是报错了,
label变成one-hot形式不是这么变吗?..


#38

nn.Dense可以理解成一个对象,做了两次流程吗?


#40

对于这里的self.dense0(x),不理解;为什么被赋值之后还可以当做函数调用。。。。


#42

Parameter里面可以设置grad_req是None,就是不参与求导

https://mxnet.incubator.apache.org/api/python/gluon.html#mxnet.gluon.Parameter


#43

dense0是一个class的实例。dense0(x)属于operator 重载,它实际上是调用dense0.forward(x)