首页 > 其他分享 >Pytorch笔记|小土堆|P16-22|神经网络基本骨架、卷积层、池化层、非线性激活层、归一化、线性层、Sequential

Pytorch笔记|小土堆|P16-22|神经网络基本骨架、卷积层、池化层、非线性激活层、归一化、线性层、Sequential

时间:2024-08-04 16:40:16浏览次数:13  
标签:__ 池化层 22 nn self torch 归一化 output input

torch.nn

Containers是神经网络骨架,含6个类,最常用的是Module——Base class for all NN modules

Module
所有神经网络模型(子类)都必须继承Module(父类),Module相当于给所有的神经网络提供了模板,但可进行修改
官方示例

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
       x = F.relu(self.conv1(x))
       return F.relu(self.conv2(x))

土堆示例

import torch
from torch import nn

class tudui(nn.Module):
    # 调出Generate,alt+insert
    # tudui继承Module,必须定义__init__和forward,也可自行补充和修改内容
    def __init__(self):
        super().__init__() # 子类调用父类的__init__
        # 这里可定义前向过程forward中要用到的各种层
    def forward(self, input):
        # forward和__call__一样,可直接传入参数给对象
        output = input + 1
        return output
a = tudui() # 创建对象
input = torch.tensor(1.0)
output = a(input) # 传入参数,得到返回内容
print(output)

torch.nn和torch.nn.functional区别
torch.nn包含的是类,torch.nn.functional包含的是函数

参考资料:https://blog.csdn.net/wangweiwells/article/details/100531264
————————————————————————————————
torch.nn.functional中的conv.2d为例,解释一下卷积的一些重要参数

import torch.nn.functional as F
output = F.conv.2d(input, kernel, stride=1, padding=1)

先看官方文档:
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor
input:要求shape为(minibatch, in_channels, iH, iW)
*如果不符合要求,应reshape:input = torch.reshape(input, (1, 1, 32, 32)
weight:卷积核,要求shape为(out_channels, in_channels/groups, kH, kW)
bias:optional,默认为None
stride:默认为1,卷积核每次移动多少
padding:默认为0(不填充),否则是填充0的宽度和高度
*stride和padding如果只给1个数值,同时适用于H和W,也可以分别给(sH, sW), (padH, padW)
————————————————————————————————
在上述内容(Module和conv.2d)的基础上,学习nn.Conv2d
示例代码:

import torchvision
from torch import nn
from torch.utils.data import DataLoader

test_set = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor()) # ToTensor后的()别忘记
dataloader = DataLoader(test_set, batch_size=64)

class tudui(nn.Module):
    # tudui继承Module,必须定义__init__和forward,也可自行补充和修改内容
    def __init__(self):
        super().__init__() # 子类调用父类的__init__
        self.conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
        # 这里定义前向过程需要用到的一些层,把参数都设置好
    def forward(self, input):
        # forward和__call__一样,可直接传入参数给对象
        output = self.conv(input) # 此处,前向过程中包含一层卷积
        return output

a = tudui() # 创建对象
for data in dataloader: # 一个batch一个batch拿出来!
    imgs, targets = data 
    output = a(imgs) # 传入参数,得到返回内容
    print(output.shape)

关于nn.Conv2d这个类(而F.conv.2d是一个函数)所需传入的一些参数:
self.conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
in_channels:input的通道数
out_channels:output的通道数——等于卷积核的个数
比如input是3通道图片,卷积核也是3通道的,那么一个卷积核作用于input形成一张feature map(output的一个通道),有多少个卷积核就导致output有几个通道
kernel_size:卷积核size(卷积核不需要自己定,只用给size,在训练过程中会不断完善)
stride、padding同前

对于Conv.2d,output的H和W可根据公式算:
Input: \((N, C_{in}, H_{in}, W_{in})\)
Output: \((N, C_{out}, H_{out}, W_{out})\) where
\(H_{out} = \left\lfloor\frac{H_{in} + 2 \times \text{padding}[0] - \text{dilation}[0] \times (\text{kernel\_size}[0] - 1) - 1}{\text{stride}[0]} + 1\right\rfloor\)
\(W_{out} = \left\lfloor\frac{W_{in} + 2 \times \text{padding}[1] - \text{dilation}[1] \times (\text{kernel\_size}[1] - 1) - 1}{\text{stride}[1]} + 1\right\rfloor\)

如果input和output尺寸不变,比如都是32*32,则计算padding = (kernel_size - 1)/2
——————————————————————————————
卷积层————提取特征,池化层————降低特征的数据量————降低计算量
池化层pooling layers
操作:对卷积层的输出做subsampling下采样,即 对卷积层输出的new img内容分组(kernal size自己定),每组选一个代表(自己定,如max【maxpool】/mean【meanpool】),形成变小但通道数未变的new img。
优点:减少运算量
缺点:可能对于细节捕捉有所不足。现在很多做full conv,扔掉pooling层,如AlphaGo下围棋不能随便缺行/缺列。
1、 无需要学习的参数
2、 通道数不变
3、 对微小位置变化有鲁棒性
学习nn.MaxPool2d:
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
参数:
kernel_size – the size of the window to take a max over
stride – the stride of the window. Default value is kernel_size
padding – implicit zero padding to be added on both sides
dilation – a parameter that controls the stride of elements in the window
return_indices – if True, will return the max indices along with the outputs. Useful for torch.nn.MaxUnpool2d later
ceil_mode – when True, will use ceil instead of floor to compute the output shape
实例代码:

import torchvision
from torch import nn
from torch.utils.data import DataLoader
test_set = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(test_set, batch_size=64)
class tudui(nn.Module):
    def __init__(self):
        super().__init__() 
        self.conv = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)
        self.maxpool = nn.MaxPool2d(3)
    def forward(self, input):
        output = self.maxpool(self.conv(input))
        return output
a = tudui() 
for data in dataloader:
    imgs, targets = data
    output = a(imgs) 
    print(output.shape)

———————————————————————————————————
非线性变换:torch.nn中Non-linear Activations
nn.ReLU()
nn.Sigmoid()
nn.Softmax()

———————————————————————————————————
正则化防止过拟合,作用于损失函数
归一化加快训练速度,作用于激活函数输入。在卷积神经网络的卷积层之后可添加BatchNorm2d进行数据的归一化处理,使得数据在进行非线性激活前不会因为数据过大而导致网络性能的不稳定
nn.BatchNorm2d
具体参考:https://blog.csdn.net/qq_50001789/article/details/120507768
———————————————————————————————————
linear layers,深度学习网络中会用到的全连接层fully connected layers,用于变换特征的维度
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
in_features:输入通道数(input特征维度,要先flatten成向量torch.flatten(imgs)或者nn.Flatten()
out_features:输出通道数(output特征维度)
实例代码:

import torchvision
from torch import nn
from torch.utils.data import DataLoader
test_set = torchvision.datasets.CIFAR10(root=r'./cifar10', train=False, transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(test_set, batch_size=64, drop_last=True)
class tudui(nn.Module):
    def __init__(self):
        super().__init__() 
        self.linear = nn.Linear(196608, 10)
    def forward(self, input):
        output = self.linear(input)
        return output
a = tudui() 
for data in dataloader:
    imgs, targets = data
    imgs_f = torch.flatten(imgs)
    output = a(imgs_f) 
    print(output.shape)

———————————————————————————————————————
nn.Sequential
在__init__中用Sequential封装所有layers:

self.model1 = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )

在__forward__中就可以简化代码:
output = self.model1(input)

标签:__,池化层,22,nn,self,torch,归一化,output,input
From: https://www.cnblogs.com/xjl-ultrasound/p/18340286

相关文章

  • SSM大学生身心健康管理系统的设计与实现d223r 带论文文档1万字以上
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:学生,测试人员,班级信息,学院信息,身心健康开题报告内容一、选题背景与意义随着教育水平的不断提升和社会竞争的日益激烈,大学生面临着来自学业、就业......
  • windows11系统NVIDIA显卡驱动自动升级导致2070 Super显卡失效 —— 552.22版本自动升
    操作系统Windows11,旧版本显卡驱动是552.22,由于安装的是NVIDIAGeforceExperience后显卡驱动自动升级到560.77版本,然后显卡不再工作。重新安装显卡驱动560.77版本显示window11版本操作系统不支持该版本显卡驱动,所以这说明虽然官网上说这个版本的显卡驱动是支持window11的,而且Ge......
  • Open3D 计算点云的归一化协方差矩阵
    目录一、概述1.1原理1.2实现步骤1.3应用二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2数据显示Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        计算点云的归一......
  • github克隆项目到Visual Studio 2022出错怎么回事?
    到底咋回事啊?不同的方法有不同的出错方式。。。。先是选择"用vs打开",结果:然后选择自己输入,结果:救救我,找了各种方法,git也配置了邮箱,密钥也加到github设置里了,github网页用了watttllokit也能打开,怎么就是没法克隆呢,救救救,到底是哪里的错误?????......
  • CVE-2022-4230 复现
    题目描述:WPStatisticsWordPress插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行SQL注入攻击。默认情况下,具有管理选项功能(admin+)的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它。根据描述,我们直接去查看wp-admin路......
  • android studio 2022配置加速
    当前版本AndroidStudioFlamingo|2022.2.1Build#AI-222.4459.24.2221.9862592,builtonMarch31,2023Runtimeversion:17.0.6+0-b2043.56-9586694amd64VM:OpenJDK64-BitServerVMbyJetBrainss.r.o.Windows1010.0GC:G1YoungGeneration,G1OldGeneratio......
  • 阿里227滑块
    ​声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wxa15018601872       本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解......
  • 前程无忧阿里227滑块
    ​声明(lianxia15018601872)本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!  前言(lianxia15018601872)第一次打算先搞非淘流程,发现227是真的牛逼,你滑块......
  • Jetson Orin Nano安装(烧录)Ubuntu22.04.4LTS
    1、准备材料JetsonOrinNano(8GB)外设(键盘、屏幕、鼠标、网线、电源适配器)主机(也可以是虚拟机,只要是ubuntu系统就可以)2、下载SDKmanger下载地址:JetPackSDK|NVIDIA开发者进入下载位置并解压:cdDownloads/sudodpkg-isdkmanager_2.1.0-11682_amd64.deb第一次解压......
  • Ubuntu22.04 + Mysql5.7 + Docker + 主备复制方案
    同时运行两个MySQL5.7容器。这种方式可以实现数据库的主-备复制架构,提高系统的可靠性。下面是一个示例,演示如何运行两个MySQL5.7容器,一个作为主节点,一个作为备节点:1.运行主MySQL容器:sudodockerrun-d\--namemysql-57-master\--restart=always\......