1. 提取层结构
对于一个给定的模型,如果不想要模型中所有的层结构,只希望能够提取网络中的某一层或者某几层,应该如何实现呢?
首先定义一下神经网络结构:
1 | import torch |
再来看一下nn.Module
的几个重要属性
1.1 children()
children()
:返回下一级模块的迭代器。比如在上述定义的神经网络模型中,它只会返回self.layer1
、self.layer2
、self.layer3
以及self.layer4
以上的迭代器,不会返回它们内部的东西。
1.代码示例1:model.children()
返回的是一个生成器
1 | model = SimpleCnn() |
2.代码示例2:对model.children()
进行迭代,提取神经网络下一级模块
1 | model = SimpleCnn() |
1 | Sequential( |
3.代码示例3:对下一级模块继续进行迭代,得到下下级模块。
1 | model = SimpleCnn() |
1 | Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
4.如果想提取神经网络的前两层,实现如下:
1 | model = SimpleCnn() |
1 | Sequential( |
1.2 modules()
modules
会返回模型中的所有模块的迭代器,这样就有一个好处,即它能访问到最内层,比如self.layer1.conv1
这个模块。输出结果:返回神经网络的所有模块,包括各种不同级的模块。注意与1.1中代码示例1和代码示例2的区别。
1 | model = SimpleCnn() |
1 | SimpleCnn( |
1.3 named_children()和named_modules()
named_children()
、named_modules()
分别与children()
、modules()
相对应,其不仅返回模块的迭代器,还会返回网络层的名字。
1.代码示例1
1 | model = SimpleCnn() |
1 | ('', SimpleCnn( |
2.如果希望提取模型中所有的卷积层,实现如下:
1 | model = SimpleCnn() |
1 | Sequential( |
2.提取参数及自定义初始化
2.1 提取参数
nn.Module
里有两个关于参数的属性:
parameters()
:给出一个网络的全部参数的迭代器named_parameters()
:给出网络层的名字和参数的迭代器
1.代码示例1:获取模型的参数。还可以通过para.grad
获取梯度
1 | model = SimpleCnn() |
2.代码示例2:获取模型网络层的名字和参数。model.named_parameters()
迭代出形式为(名字,参数值)的元组。
1 | model = SimpleCnn() |
2.2 自定义初始化
1 | model = SimpleCnn() |