Pytorch: parameters(),children(),modules(),named_*区别
nn.Module vs nn.functional
前者会保存权重等信息,后者只是做运算
parameters()
返回可训练参数
nn.ModuleList vs. nn.ParameterList vs. nn.Sequential
layer_list = [nn.Conv2d(5,5,3), nn.BatchNorm2d(5), nn.Linear(5,2)]
class myNet(nn.Module):
def __init__(self):
super().__init__()
self.layers = layer_list
def forward(x):
for layer in self.layers:
x = layer(x)
net = myNet()
print(list(net.parameters())) # Parameters of modules in the layer_list don't show up.
nn.ModuleList的作用就是wrap pthon list,这样其中的参数会被注册,因此可以返回可训练参数(ParameterList)。
nn.Sequential的作用如下:
class myNet(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.Sequential(
nn.Relu(inplace=True),
nn.Linear(10, 10)
)
def forward(x):
x = layer(x)
x = torch.rand(10)
net = myNet()
print(net(x).shape)
可以看到Sequential的作用就是按照指定的顺序构建网络结构,得到一个完整的模块,而ModuleList则只是像list那样把元素集合起来而已。
nn.modules vs. nn.children
class myNet(nn.Module):
def __init__(self):
super().__init__()
self.convBN = nn.Sequential(nn.Conv2d(10,10,3), nn.BatchNorm2d(10))
self.linear = nn.Linear(10,2)
def forward(self, x):
pass
Net = myNet()
print("Printing children\n------------------------------")
print(list(Net.children()))
print("\n\nPrinting Modules\n------------------------------")
print(list(Net.modules()))
输出信息如下:
Printing children
------------------------------
[Sequential(
(0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
(1): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
), Linear(in_features=10, out_features=2, bias=True)]
Printing Modules
------------------------------
[myNet(
(convBN1): Sequential(
(0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
(1): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(linear): Linear(in_features=10, out_features=2, bias=True)
), Sequential(
(0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
(1): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
), Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1)), BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True), Linear(in_features=10, out_features=2, bias=True)]
可以看到children只会返回子元素,子元素可能是单个操作,如Linear,也可能是Sequential。 而modules()返回的信息更加详细,不仅会返回children一样的信息,同时还会递归地返回,例如modules()会迭代地返回Sequential中包含的若干个子元素。

named_*
- named_parameters: 返回一个
iterator,每次它会提供包含参数名的元组。
In [27]: x = torch.nn.Linear(2,3)
In [28]: x_name_params = x.named_parameters()
In [29]: next(x_name_params)
Out[29]:
('weight', Parameter containing:
tensor([[-0.5262, 0.3480],
[-0.6416, -0.1956],
[ 0.5042, 0.6732]], requires_grad=True))
In [30]: next(x_name_params)
Out[30]:
('bias', Parameter containing:
tensor([ 0.0595, -0.0386, 0.0975], requires_grad=True))
- named_modules
这个其实就是把上面提到的nn.modules以iterator的形式返回,每次读取和上面一样也是用next(),示例如下:
In [46]: class myNet(nn.Module):
...: def __init__(self):
...: super().__init__()
...: self.convBN1 = nn.Sequential(nn.Conv2d(10,10,3), nn.BatchNorm2d(10))
...: self.linear = nn.Linear(10,2)
...:
...: def forward(self, x):
...: pass
...:
In [47]: net = myNet()
In [48]: net_named_modules = net.named_modules()
In [49]: next(net_named_modules)
Out[49]:
('', myNet(
(convBN1): Sequential(
(0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
(1): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
(linear): Linear(in_features=10, out_features=2, bias=True)
))
In [50]: next(net_named_modules)
Out[50]:
('convBN1', Sequential(
(0): Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1))
(1): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
))
In [51]: next(net_named_modules)
Out[51]: ('convBN1.0', Conv2d(10, 10, kernel_size=(3, 3), stride=(1, 1)))
In [52]: next(net_named_modules)
Out[52]:
('convBN1.1',
BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True))
In [53]: next(net_named_modules)
Out[53]: ('linear', Linear(in_features=10, out_features=2, bias=True))
In [54]: next(net_named_modules)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-54-05e848b071b8> in <module>
----> 1 next(net_named_modules)
StopIteration:
- named_children
同named_modules
参考
https://blog.paperspace.com/pytorch-101-advanced/
Pytorch: parameters(),children(),modules(),named_*区别的更多相关文章
- jquery 中后代遍历之children、find区别
jquery 中children.find区别 首先看一段HTML代码,如下: <table id="tb"> <tr> <td>0</t ...
- web.config中httpModules和Modules的区别
最近用到了mvc的 Modules管道时,发现web.config中有两个modules 1.system.web节点下的httpModules 2.system.webServer节点下的modul ...
- Odoo中Application与modules的区别
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9278681.html 一:Application(应用) application一般是针对大功能的模块,如提供 ...
- jquery选择器中的find和空格,children和>的区别、及父节点兄弟节点,还有判断是否存在的写法
一.find和空格,children和>及其它的区别 空格:$('parent childchild')表示获取parent下的所有的childchild节点(所有的子孙). 等效成 = ...
- jQuery初学:find()方法及children方法的区别分析
首先看看英文解释吧: children方法: find方法: 通过以上的解释,可以总结如下: 1:children及find方法都用是用来获得element的子elements的,两者都不会返回 te ...
- find()与children()方法的区别
来源:http://www.jb51.net/article/26195.htm 总经一下前段时间用于的jQuery方法:find及children.需要的朋友可以参考下. 首先看看英文解释吧: ch ...
- children()与find()区别
1.children() 返回被选元素的所有直接子元素,该方法只会向下一级对 DOM 树进行遍历: 2.find() 返回被选元素的后代元素,一路向下直到最后一个后代.
- vue-loader v15、vue-loader v14及之前版本,配置css modules的区别
vue-loader v15 配置css modules: 是在 css-loader 里配置 官方文档:https://vue-loader.vuejs.org/zh/migrating.html# ...
- jQuery:find()方法与children()方法的区别
1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就像大多数的jQuery方法一样. 2:children方法获得的仅仅是元素一 ...
随机推荐
- centos6服务启动脚本及开机启动过程
centos6服务启动脚本 centos6的服务启动脚本都放在/etc/rc.d/init.d/下,/etc/init.d/是/etc/rc.d/init.d/的软链接: centos6的服务启动脚本 ...
- dskms改为ckplayer播放器
将ckplayer代码文件夹上传到/var/www/html/public/static/plugins/目录下修改/var/www/html/application/home/view/defaul ...
- [BZOJ1852] [MexicoOI06]最长不下降序列
[BZOJ1852] [MexicoOI06]最长不下降序列 额我也不知道是不是水过去的...和网上的另一篇题解对拍过了,但是拍不出来... 经过和神仙的讨论基本可以确定是对的了 考虑如下贪心 (我将 ...
- 在.Net Core中使用HttpClient添加证书
最近公司要对接电信物联网北向API接口,当调用Auth授权接口时,需要用到证书,此篇文章记录下遇到的坑~ 有两种调用接口的方式,下面是两种方式的简单示例 1.使用HttpClient public s ...
- cmd常见错误及解决方法
[英文] Bad command or file name [译文] 错误的命令或文件名 错误原因和解决: 这大概是大家最常见到的错误提示了,它的意思是输入的命令无效.当输入的命令既不是DOS内部命令 ...
- Visual Studio 调试系列3 断点
系列目录 [已更新最新开发文章,点击查看详细] 断点是开发人员的工具箱中最重要的调试技术之一. 若要暂停调试程序执行所需的位置设置断点. 例如,你可能想要查看代码变量的状态或查看调用堆栈的某些 ...
- redis-安装卸载
1.安装service服务 redis-server --service-install [配置文件位置,如:redis.conf] (--service-name 服务名称) 2.启动service ...
- Oracle性能调优之虚拟索引用法简介
本博客记录一下Oracle虚拟索引的用法,虚拟索引是定义在数据字典中的伪索引,可以说是伪列,没有修改的索引字段的.虚拟索引的目的模拟索引,不会增加存储空间的使用,有了虚拟索引,开发者使用执行计划的时候 ...
- SQLAlchemy基础
1.介绍 做个简单笔记,方便回顾. SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后 ...
- ng 引入query
ng 引入jquery 1.在项目中 npm install --save jquery 在对应组件中加入 import * as $ from "jquery"; 在angu ...