zoukankan      html  css  js  c++  java
  • pytorch——nn.Module

    pytorch——nn.Module

    构建深度学习模型的话,用autograd太抽象、底层、代码量大实现麻烦,提供了nn.Module比较方便。nn.Module代表某一次或者某几层的nn。一般是基础nn.Module,写自己的nn/nn的某层

    一、Module基本知识介绍

    1、在实现自己的某层的时候基础了nn.Module,在构造函数中要调用Module的构造函数

    super(Linear,self).init()

    2、可学习参数放在构造函数中,并且通过nn.Parameter()使参数以parameters(一种tensor,默认是自动求导)的形式存在Module中,并且通过parameters()或者named_parameters()以迭代器的方式返回可学习参数的值

    3、因为parameters是自动求导,所以调用forward()后,不用自己写和调用backward()函数。而且一般不是显式的调用forward(layer.farword),而是layer(input),会自执行forward()。

    4、forward函数实现前向传播过程,其输入可以是一个或多个tensor。

    5、module对象可以包含子module,Module能够自动检测到自己的Parameter并将其作为学习参数。除了parameter之外,Module还包含子Module,主Module能够递归查找子Modul中parameters。构造函数中,可利用前面自定义的Linear层(module),作为当前module对象的一个子module,它的可学习参数,也会成为当前module的可学习参数。

    关于可学习参数命名规范

    module的parameters的话,一般就是self.para_name (例如self.w)

    module的子module命名是self子module名字para_name,例如self_submodule_w

    阅读module相关文档时的注意点

    1、构造函数的参数 ,如nn.Linear(in_features,out_features)

    2、属性、可学习参数、子module。如nn.Linear包括w,b两个可学习参数,无子module。

    3、输入、输出形状(batch_size,in_features) (batch_size,out_features)

    这些自定义layer对输入形状都有假设:输入的不是单个数据,而是一个batch。输入只有一个数据,则必须调用tensor.unsqueeze(0) 或 tensor[None]将数据伪装成batch_size=1的batch

    二、常用的神经网络层

    ####1、图像层

    Image.open()    打开显示一张图

    Image->To_Tensor(如果是单个图片要unsqueeze())->进行各种处理->ToPILImage(如果是一张图转化为Image之前要squeeze())->Image

    2、卷积层(有些有反卷积层)

    conv=nn.Conv2d(3,3,5,1)   // 输入通道,输出通道,卷积核,步长

    conv.weight.data  //权重的值,可以自己赋值

    to_pil(out.data.squeeze()) //显示图片  经过每个层,都会有该层的layer.data

    3、池化

    pool=nn.MaxPool2d(2,2)   //卷积核,步长

    4、全连接层

    nn.Linear(in_features,out_features)

    5、BatchNorm层

    BatchNorm1d(in_features)  //参数是希望输入的特征数

    他的参数是w是标准差,b是平均值

    bn = nn.BatchNorm1d(4)
    bn.weight.data = t.ones(4) * 4
    bn.bias.data = t.zeros(4)

    输出的是均值和方差(方差是标准差平方)

    6、dropout层

    Dropout(0.5)  //每个元素以0.5的概率被舍弃,即有一半的数变为0

    7、激活函数

    nn.ReLU()

    三、将nn的层连接起来

    我们发现每一层的输出作为下一层的输入,这种前馈nn可以不用每一层都重复的写forward()函数,通过Sequential()和ModuleList(),可以自动实现forward。这两个函数都是特殊module,包含子module。ModuleList可以当成list用,但是不能直接传入输入。

    Sequential构造方法

    (a)

    net1=nn.Sequential();

    net1.add("conv",nn.Conv2d(3,3,5))

    net1.add("batchnorm",nn.BatchNorm2d(3))

    访问方式:net1.conv(input)

    (b)

    net2=nn.Sequential(nn.Conv2d(3,3,5),nn.BatchNorm(3))

    访问方式:net2[0]

    (c)

    net3=nn.Sequential(OrderedDict([ ("conv",nn.Conv2d(3,3,5)),("batchnorm",nn.BatchNorm(3)),() ]))

    访问方式:net3.conv(input)

    ModuleList构造方法

    modulelist=nn.ModuleList([ nn.Conv2d(3,3,6),nn.BatchNorm(3) ])

    访问方式

    for model in modulelist:

    input=modullist(input)

  • 相关阅读:
    Redis指令(2) ------String
    Redis指令(1) ------常用指令
    Redis数据类型
    Python set集合
    Python random 模块
    Python random 模块
    Python time 模块
    Python sys模块
    Python 递归函数
    Python 局部变量和全局变量
  • 原文地址:https://www.cnblogs.com/zmmz/p/9830278.html
Copyright © 2011-2022 走看看