模型参数的访问、初始化和共享 讨论区


#65

按反向传播,共享梯度应当是优先计算后一层吧。
不过我看了一下午的源码,python的部分特别清晰,但是看到加载动态库就断线索了。。C++不熟。。
想请教下,求导部分的源码在哪里找?


#66

net.collect_params()net.params的返回有什么不同?
net.collect_params()返回的是这个网络里面所有的参数,包括在子网络中的
net.params只是返回空,除非你自己初始化该参数因为self._params 在_BlockScope中初始化了,其他地方并没有用到,


#67

一般建立的网络中都不会,net.params都不会有参数,因为该网络没有参数,只有子网络才会有参数,
举例:net = nn.Dense(10) ,那么net.params()net.collect_params()就是一样的


#68

我理解这里的写法,目的是第3层共享第2层的参数,第3层的权重矩阵按上面的设置是1010,而第2层形状为1015,不一致导致报错。所以需要修改层形状一致。可将第1层的神经元数目重设为10.


#69

你提供的方法我试了,依然访问不到该参数。

一.需求:我要做fine tuning ,最后一层不同,需要做独立初始化

二.我的mxnet实现网络:

1.基础网络

只贴出最后一层

class base(object){
    fc = mx.symbol.FullyConnected(data=flatten, num_hidden=class_num, name='fc1')
}

2.然后用gloun包装了一下

net_base = base.get_symbol()
net = gluon.nn.SymbolBlock(outputs=net_base, inputs=mx.sym.var('data'))

三.想初始化最后一个层 name=fc1 那个

尝试过如下方法:

1.直接访问该层

net.fc1.initialize()

失败AttributeError: 'SymbolBlock' object has no attribute 'fc1'

2. 通过你提示的方法访问

net.params["fc1"].initialize()

失败KeyError: 'fc1'

3. 重新初始化所有参数

net.collect_params().initialize()

成功:因为我之前做了除 fc1 层以外的所有层的初始化,调用 initialize 的时候初始化过的参数不会再被初始化,
缺点:报一堆警告

4. 通过获取参数,再访问fc1层

net.collect_params('fc1_weight').initialize(
            init=init.Xavier(), ctx=ctx)
net.collect_params('fc1_bias').initialize(ctx=ctx)

或者

net.collect_params('fc1_weight | fc1_bias').initialize(ctx=ctx)

成功


#70

在notebook中跑下面这句,发现initiaze中没有关键字force_reinit 报错,请问该如何解决。
net.initialize(init=init.Xavier(), force_reinit=True)


#71

自问自答:在gluon激活的情况下 对mxnet进行更新或重装即可解决问题。
这个问题的解决方案是这样发现的。我在使用pip时,发现被提示pip不是最新版,此时进行了更新。

但是在gluon激活状态下,发现pip又被提示不是最新版,所以怀疑在未激活状态下更新mxnet无效。所以尝试在激活状态下写在mxnet,并用pip重装。问题解决。


#72

请问 block.Sequential 中 全连接层 计算是 nd.dot(X, w) 还是 nd.dot(x, w.T)


#73

这里不应该是第三层复用了第二层的参数吗?


#74

想问一下貌似教程里面自定义实现一个 Initializer 类的子类只能对weight做初始化
有没有办法对所有的bias做初始化呢?


#75

还有就是我参考了文档 mxnet.initializer. register中的写法,重写了_init_bias,但是看结果bias完全没有更新,想咨询一下各位老师这是为什么?


#76

谁能解答下我这个帖子里的疑问吗?谢谢⭐


#77

看起来_init_bias没有被call. net是什么?是不是bias有过从contructor传进去的initializer?


#78

如何用uniform生成非连续区间内的随机数呢,课程中采用的是将【-10,10】之间生成的随机数里绝对值小于5的置零,导致权重中好多参数为0,并不是真正意义上在【-10,-5】【5,10】之间的随机分布欸:sob:


#79
net.add(nn.Dense(15)) # w1: k * 15 
net.add(nn.Dense(10)) # w2: 15 * 10
net.add(nn.Dense(10,params = net[1].params)) # w3: 10 * 10
net.add(nn.Dense(1))

MXNetError: Shape inconsistent, Provided = [10,15], inferred shape=(10,10)

显然,将w1中的15改成10

总结:一般参数共享层之前的Dense参数最好保持一致,不容易出错


#80

总结的很到位呢


#81

brilliant :grin:


#82

有直接对某一层的simbol进行权重初始化的函数吗?我想实现这么一个功能:将一张图经过几次卷积得到一个特征图,然后把它平均分割成几个小块,每个小块对应一个权重,最后把这些乘了权重的特征小块再加起来进行分类。然后现在卡在了对每个小块特征初始化的地方。


#83

你好,我想请问一下如何手动修改这些梯度呢?


#84

没有定义损失函数是不会有梯度的哦。。。