神经网络-pytorch网络结构改变-拆分已定义的层
这里整合了一些预备知识
有一个很不错的链接:https://blog.****.net/TTdreamloong/article/details/84823705
这里是引用
pytorch拆分已定义的网络结构
原文链接:https://www.jianshu.com/p/d2a066e05078
这里是引用
pytorch Module里的children()与modules()的区别
链接如下:https://blog.****.net/LXX516/article/details/79016980
以下是正文:
如果只是改变参数的话,就可以直接使用print(model)来输出网络的每个层的定义和名字。比如说第一层的名字是conv1,那么就直接使用
Cnn = model
Print(cnn) #获得每一层的定义和名字
Cnn.conv1 = liner……##这里直接重新对conv1重新定义即可。
如果整个结构都要变,那么就先找出原始模型的源代码,然后复制一份重命名,直接在原来的基础上修改结构,得到一个和pre-train的网络的结构有重复部分的自己的网络。
然后再把重复部分的参数直接拷贝过来就行了。
具体的方法:
用到的函数是model.state_dict()
这个函数的输出如下
返回值里包含信息:参数的层名.weight 以及.bias等等一层中的未知参数。
然后再使用pretrained_dict={k:v for k,v in pretrained_dict.items() if k in model_dict}
筛选出两个网络重叠的部分
最后用.updata()更新自己构造网络的字典参数(由.state_dict()函数输出)
最最后用cnn.load_state_dict(model_dict)来更新网络参数。
具体代码如下: