call:

在python中,类的__call__方法可以使得类对象具有类似函数的功能,这一点在pytorch经常有应用,理解这一点才能理解pytorch中forward函数等的作用。
__call__方法的使用示例:

class A():def __call__(self):print("this __call__ makes object called like a function")a=A()
a()输出:
this __call__ makes object called like a function

在pytorch中,pytorch的基类nn.Module就实现了这个__call__方法,并且在__call__中调用了forward函数。
简化的nn.Module说明例子:

class demo():def __init__(self,para_1):print("the first parameter is:",para_1)self.f_p=para_1def __call__(self,para_2):ret=self.forward(para_2)return retdef forward(self,para_2):print("the second parameter used by forward:",para_2)return self.f_p+para_2test=demo(1)
output=test(2)
print("the output is:",output)输出:
the first parameter is: 1
the second parameter used by forward: 2
the output is: 3

nn.Module

关于这个模块,明确两点就可以:

  • nn.Module是所有神经网络单元的基类
  • pytorch在nn.Module中,实现了__call__方法,而在__call__方法中调用了forward函数

nn.Linear

Linear的forward函数:

执行过程:

input * weight + bias

代码举例:

import torch
from torch import nnm=nn.Linear(20,30)
input=torch.randn(128,20)
output=m(input)print(output.size())输出:
torch.Size([128, 30])

这段代码的执行过程是首先创建类对象m,然后通过m(input)实际上调用__call__(input),然后__call__(input)调用forward()函数,最后返回计算结果。自己创建神经网络模块的时候,以nn.Module为基类,实现__init__和forward就可以。
以下为代码举例:

import torch
from torch import nnclass simpleNet(nn.Module):def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):super().__init__()self.layer1 = nn.Linear(in_dim, n_hidden_1)self.layer2 = nn.Linear(n_hidden_1, n_hidden_2)self.layer3 = nn.Linear(n_hidden_2, out_dim)def forward(self, x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)return xdemo=simpleNet(20,30,40,50)
input=torch.randn(128,20)
output=demo(input)
print(output.size())输出:
torch.Size([128, 50])

关于linear类中weight的转置问题探讨:

import torch
from torch import nnm=nn.Linear(20,30)
input=torch.randn(128,20)
output=m(input)print(output.size())
print(m.weight.shape)输出:
torch.Size([128, 30])
torch.Size([30, 20])

这里可以注意到weight的形状为[30,20]而不是[20,30],因为在进行矩阵乘法前,pytorch首先进行了一步转置。
pytorch中nn.Linear源码:

注意下这一句:

self.weight=Parameter(torch.Tensor(out_features, in_features))

接着forward函数如下:

其中forward函数调用了F.linear函数,F.Linear函数源码如下:

其中这一句:

ret=torch.addmm(bias, input, weight.t())

可以看出在进行矩阵乘法的时候使用了矩阵转置

nn.Sequential:

这是一个有序的容器,神经网络模块将按照传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。
以下是两个执行过程的例子:

import torch.nn as nn
import collections.OrderDict as OrderedDictmodel=nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU()
)model = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(1,20,5)),('relu1', nn.ReLU()),('conv2', nn.Conv2d(20,64,5)),('relu2', nn.ReLU())
]))

Sequential的__init__()源码如下所示:

从上面的源码可以看出传入两种类型参数的不同构造方式。
Sequential的forward函数:

forward函数通过for循环依次调用添加到self._module中的模块,最后输出经过所有神经网络层的结果
以下是一个三层网络的例子:

import torch
from torch import nnclass simpleNet(nn.Module):def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):super().__init__()self.layer=nn.Sequential(nn.Linear(in_dim,n_hidden_1),nn.ReLU(True),nn.Linear(n_hidden_1,n_hidden_2),nn.ReLU(True),nn.Linear(n_hidden_2,out_dim))def forward(self, x):x = self.layer(x)return xdemo=simpleNet(20,30,40,50)
input=torch.randn(128,20)
output=demo(input)
print(output.size())输出:
torch.Size([128, 50])

参考:
pytorch __call__方法
nn.Module源码
nn.Linear源码
nn.Linear理解
nn.Sequential源码
nn.Sequential理解
functional源码

pytorch 神经网络构造相关推荐

  1. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

  2. PyTorch 神经网络

    PyTorch 神经网络 神经网络 神经网络可以通过 torch.nn 包来构建. 现在对于自动梯度(autograd)有一些了解,神经网络是基于自动梯度 (autograd)来定义一些模型.一个 n ...

  3. PyTorch神经网络集成技术

    PyTorch神经网络集成技术 create_python_neuropod 将任意python代码打包为一个neurood包. create_python_neuropod( neuropod_pa ...

  4. 总结 | 深度学习PyTorch神经网络箱使用

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散   计算机视觉联盟笔记   作者:王博Kings.Sophia 本文内容概述PyTorch神经网络箱 AI博士笔记系 ...

  5. Tensor:Pytorch神经网络界的Numpy

    摘要:Tensor,它可以是0维.一维以及多维的数组,你可以将它看作为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便. 本文分享自华为云社区<Tensor:P ...

  6. 神经网络模型中class的forward函数何时调用_总结深度学习PyTorch神经网络箱使用...

    ↑ 点击蓝字 关注极市平台来源丨计算机视觉联盟编辑丨极市平台 极市导读 本文介绍了Pytorch神经网络箱的使用,包括核心组件.神经网络实例.构建方法.优化器比较等内容,非常全面.>>加入 ...

  7. pytorch神经网络解决回归问题(非常易懂)

    pytorch神经网络解决回归问题(非常易懂) 参考文章: (1)pytorch神经网络解决回归问题(非常易懂) (2)https://www.cnblogs.com/Yanjy-OnlyOne/p/ ...

  8. 使用Google-Colab训练PyTorch神经网络

    Colaboratory 是免费的 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行.关键是还有免费的GPU可以使用!用Colab训练PyTorch神经网络步骤如下: 1: ...

  9. 数据分析实战:python热门音乐分析 附代码+数据 +论文(PCA 主成分分析,sklearn 机器学习,pytorch 神经网络,k-means 聚类,Librosa 音频处理,midi 音序)

    项目概述: 本选取了抖音当下最热门的 400 首音乐,通过一系列方法提取每首歌的波形特征,再经过降维以及机器学习等手段,进行无监督学习对音乐数据进行聚类的同时训练并使用监督学习分类器进行音乐流派分类, ...

  10. 第3章 PyTorch神经网络工具箱(1/2)

    前面已经介绍了PyTorch的数据结构及自动求导机制,充分运行这些技术可以大大提高我们的开发效率.这章将介绍PyTorch的另一利器:神经网络工具箱.利用这个工具箱,设计一个神经网络就像搭积木一样,可 ...

最新文章

  1. react 组件连动效果_react-redux应用之独立组件联动实例
  2. 监听服务端口及邮件报警脚本
  3. linux 8g内存 swap,linux可用内存足够为什么还用swap
  4. linux下的精确wait
  5. Java中的类型安全的空集合
  6. 46什么是session
  7. 模板消息 php实例,PHP微信模板消息操作示例
  8. json jar包支持
  9. CF988 D. Points and Powers of Two【hash/数学推理】
  10. WEB系统技术开发方向
  11. 计算机专业代码933,数学类专业代码
  12. EndNote文献输出引用格式自定义修改与编辑界面解读
  13. 电工和电气工程师的区别
  14. 无需重装系统,Windows Server 2019系统硬盘无损从MBR转换为GPT格式
  15. python爬取微博评论_python爬虫抓取新浪微博数据
  16. Python安装教程和Pycham教程
  17. 苏如是:香港中鼎资本与您分享“数实共生世界”和“后人类社会”
  18. C语言用函数指针实现数组排序
  19. NTP DDoS反射放大攻击实验
  20. [Unity3D]添加音效说明

热门文章

  1. 微信解绑手机号服务器会保留吗,我把我的微信号给了别人,银行卡都解绑了,但手机号还在绑定,会不会有危险...
  2. Flutter动画系列之SizeTransition
  3. 上班一个月,后悔当初着急入职的选择了
  4. Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
  5. linux qt程序窗口大小变化,Qt调整初始窗口大小
  6. python回溯算法全排列_从全排列看回溯算法
  7. android多线程实现计时器,方法一、使用Handler和Thread(线程)实现定时器
  8. c#web页面显示弹窗_C# .NET弹出窗口
  9. python 开发公众号sdk_「公众号开发」基于Serverless架构Python实现公众号图文搜索...
  10. python格式化输出类型_Python格式化输出format方法需要限定数据类型吗?