AI框架的使用技巧
前言
这里记录我在工程中摸索到的技术,大部分是在网络中搜不到的或者很难快速搜到的
1 mindspore的技术点
2 pytorch的技术点
2.1 不能简单地用list来包含子module
在编写了一个网络以后,想要通过Module.state_dict()来获取网络权重,但是失效了,返回的是一个空的OrderedDict(),但是可以前向运算。这就非常纳闷了我giao。我直接创建了一个子Module(有时称为模块),发现是可以state_dict()是可以返回非空OrderedDict()的。也就是说,父模块包含了子模块,但是无法获取子模块的权重。然而!我的子模块里也包含了子模块(我称它为孙子模块),子模块是可以通过state_dict()来获取孙子模块的权重的。经过多次的摸索,我发现父模块包含子模块时,我用的是简单的list,如下所示:
class son(nn.Module):
def __init__(self, bias_len):
self.bias = nn.parameter.Parameter(torch.ones((bias_len,)))
def forward(self, x):
out = x + self.bias
return out
class father(nn.Module):
def __init__(self, bias_len, num_layers):
self.layers = [son(bias_len) for i in range(num_layers)]
def forward(self, x):
for layer in self.layers:
x = layer(x)
return x
这相当于没有把子模块注册到父模块中,我估计这种写法是不能训练的(没试过,试完再补充)。一定要把子模块组成的list用nn.ModuleList()封装起来,才算把子模块注册到了父模块。完整的代码如下:
class son(nn.Module):
def __init__(self, bias_len):
self.bias = nn.parameter.Parameter(torch.ones((bias_len,)))
def forward(self, x):
out = x + self.bias
return out
class father(nn.Module):
def __init__(self, bias_len, num_layers):
self.layers = [son(bias_len) for i in range(num_layers)]
self.layers = nn.ModuleList(self.layers) #补充这一句即可
def forward(self, x):
for layer in self.layers:
x = layer(x)
return x
3 tensorflow的技术点
3.1 获取tensorflow网络中的权重
tensorflow以Variable(变量)表示网络中的参数,默认是可训练的,如果想要设置成不可训练,只需要在创建Variable时令参数trainable=False即可。
从网络中直接获取权重,而不是从文件加载权重到网络,也不是从网络保存权重到文件,使用以下两个语句之一即可:
net = CRNN(