[pytorch入门] 6. 神经网络

基本介绍

  • torch.nn:
    在这里插入图片描述
    • Containers:基本骨架
    • Convolution Layers: 卷积层
    • Pooling layers:池化层
    • Non-linear Activations (weighted sum, nonlinearity):非线性激活
    • Normalization Layers:正则化层

Containers类

介绍

containers相对重要的一个类,主要给神经网络定义了一些骨架、一些结构,后面那些类都是要向骨架中填充的东西
里面有6个模块,其中module模块是里面最重要的一个模块
在这里插入图片描述
一般自己定义类,然后继承nn.module
里面一定要写的两个函数:__init__()和forward函数(前向传播)

from torch import nn
import torch
class Test(nn.Module):def __init__(self):super().__init__()def forward(self,input):output = input+1return outputtest = Test()
# print(test.forward(1))
x = torch.tensor(1)
print(test(x))

Sequential 序列

将网络序列放到sequential里面,这样就可以调用一个模块连续使用自己定义的网络
这样会让代码更加简洁易懂

model = nn.Sequential(nn.Conv2d(1,20,5),nn.ReLU(),nn.Conv2d(20,64,5),nn.ReLU())# Using Sequential with OrderedDict. This is functionally the
# same as the above code
model = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(1,20,5)),('relu1', nn.ReLU()),('conv2', nn.Conv2d(20,64,5)),('relu2', nn.ReLU())]))

在下节实战中进行实例演示

Convolution 卷积

基础理解

import torch
import torch.nn.functional as Finput = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]])
kernel = torch.tensor([[1,2,1],[0,1,0],[2,1,0]])# output = torch.nn.Conv2d(input)
# print(input.shape)
# print(kernel.shape)  # 目前不符合Con2d的尺寸要求,需要进行尺寸变换input = torch.reshape(input, (1,1,5,5))  # 1个通道,1个样本,5行5列
kernel = torch.reshape(kernel, (1,1,3,3))  # 1个通道,1个样本,3行3列print(input.shape)
print(kernel.shape)# 之后进行卷积操作
output1 = F.conv2d(input, kernel, stride=1, padding=0) # stride步长,padding在输入图像的四周进行填充
print(output1)output2 = F.conv2d(input, kernel, stride=2) # stride步长,padding填充
print(output2)output3 = F.conv2d(input, kernel, stride=1, padding=1) # stride步长,padding在输入图像的四周进行填充
print(output3)   # 会发现比padding=0时大了一圈,因为padding=1时,会在输入图像的四周填充一圈0output4 = F.conv2d(input, kernel, stride=1, padding=2) # stride步长,padding在输入图像的四周进行填充
print(output4)   # 会发现比padding=1时大了一圈,因为padding=2时,会在输入图像的四周填充两圈0

在这里插入图片描述

参数概念

def torch.nn.Conv2d(in_channels, out_channels, kernel_size,stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)# in_channels:int,输入通道
# out_channels :int,输出通道
# kernel_size :int或元祖,卷积核的大小
# stride:int or tuple, optional。横向纵向的步径大小 默认为1
# padding (int, tuple or str, optional) 是否需要在输入图像的边缘进行填充,默认为0 不填充
# padding_mode (str, optional) – 'zeros', 'reflect', 'replicate' or 'circular' 控制如何填充,Default: 'zeros'即全部填充为0
# dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1 卷积核之间的距离,一般为空洞卷积,不常用
# groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
# bias (bool, optional) – If True, adds a learnable bias to the output. Default: True

实际上不需要自己写卷积核,他是会自己在输入图像中采样获得,只需要定义卷积核大小即可

使用

import torch
import torchvision
from torch.utils.data import DataLoader
from torch import nn
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("./dataset",train = False, transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(dataset, batch_size=64, shuffle=True)# 搭建简单神经网络
class Test(nn.Module):def __init__(self):super(Test,self).__init__()self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)def forward(self,x):x = self.conv1(x)return xnet = Test()writer = SummaryWriter('logs')
step = 0
for data in dataloader:    # 一次性取出一个batch_size的数据,daaloader的使用见前面文章imgs, targets = dataoutput = net(imgs)print(imgs.shape)print(output.shape)# print(output)print('-------')writer.add_images("input", imgs, step)# 但是这里output的shape是[64,6,30,30],6个通道没办法显示# 因此需要对output进行处理,使其变成[64,3,30,30]# 比较简单的方案是6个通道直接切开,变成两个bitch,每个bitch有3个通道(不是很严谨)# 当不知道batch_size的大小时,可以使用-1来代替,他会根据后面的数据直接计算output = torch.reshape(output,(-1,3,30,30))writer.add_images("output", output, step)step = step+1

在这里插入图片描述

辨析:nn 与 nn.functional

上面卷积操作的两个代码中,一个用的torch.nn.functional中的conv2d,一个用的torch.nn中的conv2d
nn 与 nn.functional有很多相同的函数,同时也有很多差异

相同点

  • 实际功能相同,即nn.Conv2d和nn.functional.conv2d 都是进行卷积,nn.Dropout 和nn.functional.dropout都是进行dropout等
  • 运行效率近乎相同

不同点

  • nn.functional.xxx是函数接口,而nn.XXX是nn.functional.xxx的类封装,并且nn.xxx都集成于同一个祖先nn.Module。这一点导致了nn.XXX除了具有nn.functional.xxx的功能之外,内部附带了nn.Module相关的属性和方法,例如train(), eval(),load_state_dict, state_dict 等。
  • 两者的调用方式不同
    • nn.xxx需要先实例化并传入参数,然后以函数调用的方式调用实例化的对象并传入输入数据

      input = img
      conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)  # 实例化
      out = conv(input) # 以函数调用的方式调用实例化的对象并传入输入数据
      
    • nn.functional.xxx同时传入输入数据和weight、bias等其他参数

      weight = torch.rand(64,3,3,3)
      bias = torch.rand(64)
      out = nn.functional.conv2d(inputs, weight, bias, padding=1) # 调用函数的同时传入数据与参数
      
  • nn.Xxx继承于nn.Module, 能够很好的与nn.Sequential结合使用, 而nn.functional.xxx无法与nn.Sequential结合使用。
    fm_layer = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.BatchNorm2d(num_features=64),nn.ReLU(),nn.MaxPool2d(kernel_size=2),nn.Dropout(0.2)
  • nn.xxx不需要自己定义和管理weight,而functional.xxx需要自己定义weight,每次调用的时候都需要手动传入weight,不利于代码复用
    • 使用nn.xxx定义一个CNN
      class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.cnn1 = nn.Conv2d(in_channels=1,  out_channels=16, kernel_size=5,padding=0)self.relu1 = nn.ReLU()self.maxpool1 = nn.MaxPool2d(kernel_size=2)self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5,  padding=0)self.relu2 = nn.ReLU()self.maxpool2 = nn.MaxPool2d(kernel_size=2)self.linear1 = nn.Linear(4 * 4 * 32, 10)def forward(self, x):x = x.view(x.size(0), -1)out = self.maxpool1(self.relu1(self.cnn1(x)))out = self.maxpool2(self.relu2(self.cnn2(out)))out = self.linear1(out.view(x.size(0), -1))return out
      
    • 用nn.function.xxx的写法
      class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.cnn1_weight = nn.Parameter(torch.rand(16, 1, 5, 5))self.bias1_weight = nn.Parameter(torch.rand(16))self.cnn2_weight = nn.Parameter(torch.rand(32, 16, 5, 5))self.bias2_weight = nn.Parameter(torch.rand(32))self.linear1_weight = nn.Parameter(torch.rand(4 * 4 * 32, 10))self.bias3_weight = nn.Parameter(torch.rand(10))def forward(self, x):x = x.view(x.size(0), -1)out = F.conv2d(x, self.cnn1_weight, self.bias1_weight)out = F.relu(out)out = F.max_pool2d(out)out = F.conv2d(x, self.cnn2_weight, self.bias2_weight)out = F.relu(out)out = F.max_pool2d(out)out = F.linear(x, self.linear1_weight, self.bias3_weight)return out
      

选择

根据问题的复杂度和个人风格喜好决定
一般在能使用nn.xxx的情况下尽量使用,因为这样更能显示出网络间的层次关系,也更加纯粹

在nn.xxx不能满足功能需求时可以使用nn.functional.xxx,因为nn.functional.xxx更接近底层,更灵活

  • pytorch官方推荐:具有学习参数的(例如,conv2d, linear, batch_norm)采用nn.Xxx方式,没有学习参数的(例如,maxpool, loss func, activation func)等根据个人选择使用nn.functional.xxx或者nn.Xxx方式。

最大池化

介绍

池化的目的是保存主要内容的同时减少数据大小

用的比较多的为MaxPool2d,取kernel覆盖范围中最大的值输出

def MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=Flse,ceil_mode=False)
  • kernel_size:采样窗口大小
  • stride:步幅,注意这里默认值不一样了,卷积层为1,这里为kernel_size的大小
  • padding:填充值
  • dilation:kernel中每个格子中间是否存在间隔,一般不对其进行设置,有间隔时也称为空洞卷积
  • ceil_mode:设置为True时使用ceil模式,设置为False时使用floor模式
    • ceil模式:kernel覆盖不足时(边界越界时),保留获取的数值
    • floor模式:kernel覆盖不足时,不保留获取的数值

使用方法

import torch
from torch import nn
input = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]],#   dtype=torch.float32  # 如果报错时,可以尝试加上这一行)input = torch.reshape(input,(1,1,5,5)) # 使之满足输入要求class Test(nn.Module):def __init__(self):super(Test,self).__init__()self.maxpool = nn.MaxPool2d(kernel_size=3,padding=0,ceil_mode=False)def forward(self,input):output = self.maxpool(input)return outputnet = Test()
output = net(input)
print(output)

实例

import torch
from torch import nn
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset, batch_size=4)class Test(nn.Module):def __init__(self):super(Test,self).__init__()self.maxpool = nn.MaxPool2d(kernel_size=3,padding=0,ceil_mode=False)def forward(self,input):output = self.maxpool(input)return outputnet = Test()
writer = SummaryWriter('logs')
step = 0for data in dataloader:imgs, targets = datawriter.add_images('input',imgs, step)output = net(imgs)   # 池化不会改变channel的数量,因此不需要reshapewriter.add_images('output',output, step)step = step+1
writer.close()

非线性激活

官方文档有很多非线性函数,这里举几个例子

ReLU

在这里插入图片描述
ReLU有一个参数inplace:用于指明是否修改原值

  • inplace=True:没有返回值,直接修改原值
  • inplace=False:不修改原值,有结果作为返回值返回
from torch import nn
import torchclass Test(nn.Module):def __init__(self):super(Test, self).__init__()self.relu1 = nn.ReLU(inplace=False)def forward(self, input):output = self.relu1(input)return outputnet = Test()input = torch.tensor([[1,2,0,-3,1],[0,1,-2,3,1],[1,2,1,0,0],[-5,2,3,1,1],[-2,1,0,1,1]])output = net(input)
print(output)

在这里插入图片描述

Sigmod

ReLU对图像的处理不明显,这里用sigmod举例
在这里插入图片描述

from torch import nn
import torch
from torch.utils.tensorboard import SummaryWriter
import torchvision
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset=dataset, batch_size=64)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.sigmoid1 = nn.Sigmoid()def forward(self, input):output = self.sigmoid1(input)return outputnet = Test()
writer = SummaryWriter('logs')
step=0
for data in dataloader:imgs, targets = datawriter.add_images('input',imgs,step)output = net(imgs)writer.add_images('output',output,step)step = step+1
writer.close()

Linear Layers:线性层

在这里插入图片描述
比较常见的这种图实际上就是由线性层一个一个搭建出来的

def torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None

参数中的in_features指的就是上面输入层数据的个数(即d),out_features即为输出层个数(前半部分的输出层为中间的隐藏层),bias=True时,计算会加上偏置b

# 例:将图片(如5*5)展开成一行(如1*25),经过线性层转换为x个import torchvision
import torch
from torch import nn
from torch.utils.data import DataLoaderdatasets = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(datasets, batch_size=64)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.liner1 = nn.Linear(196608,10)def forward(self, input):output = self.liner1(input)return outputnet = Test()for data in dataloader:imgs, targets = dataprint("原始大小:",imgs.shape) # output = torch.reshape(imgs,(1,1,1,-1)) # 将imgs展开成一行 输出效果见第一张图# 这里也可以直接用torch.flatten(imgs)来展开output = torch.flatten(imgs)  # 输出效果见第二张图print("转化为一维", output.shape)  # 先用这个来看一下展开后的大小,这是决定了线性层的输入大小# breakoutput2 = net(output)print("线性层转化后", output2.shape)break

使用reshape:
在这里插入图片描述
使用torch.flatten:
在这里插入图片描述

其它层

Normalization 正则化层: 采用正则化的话会提高神经网络的训练速度
Recurrent Layers:一些特定的网络结构,含有RNN、LSTM等
Transformer Layers:已经写好的特定结构,与上面类似
Dropout Layers:也是在特定网络中才需要
Distance Functions:计算两个层之间的误差
Loss Functions:计算loss

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文讲透Excel数据如何导入到Stata?

推荐采用《Stata统计分析从入门到精通》 杨维忠、张甜 清华大学出版社“1.2.6 导入其他格式的数据文件” 的解答。 在Stata主界面选择“文件|导入”命令(如图所示),即可看到Stata支持的其他格式的数据文件类型,包括Excel电子表格…

【收藏】幻兽帕鲁创建服务器教程

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

如何在 Linux 上安装 Docker?最权威指南来了!

docker文档:https://docs.docker.com/engine/ 打开docker文档 这里需要注意,服务器上一般是没有界面的,我们只需要安装docker Engine。 卸载历史版本 这一步是可选的,如果之前安装过旧版本的Docker,可以使用如下命令…

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

手上 ROC-RK3399-PC Pro 使用蓝牙 WIFI 模组是 AP6256。 一、AP6256 模组介绍 AP6256是正基科技(AMPAK)推出的一款低成本、低功耗的双模模块,它集成了Wi-Fi和蓝牙功能。这款模块支持SDIO接口,具有以下特点: 1、型号:AP6256 2、接口:SDIO(Secure Digital Input/Outp…

图像旋转角度计算并旋转

#!/usr/bin/python3 # -*- coding: utf-8 -*- import cv2 import numpy as np import timedef Rotate(img, angle0.0,fill0):"""旋转:param img:待旋转图像:param angle: 旋转角度:param fill:填充方式,默认0黑色填充:return: img: 旋转后…

《幻兽帕鲁》32人专有服务器设置教程,亲测稳定

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

飞速(FS)400G产品全家福及其应用介绍

随着大型数据中心不断向更高性能、更大规模的架构演进,构建能够有效应对海量用户群体、智能设备激增及复杂应用负载所需的高容量网络连接已变得不可或缺。尤其是在超大规模云计算服务迅速普及的背景下,对具备超高带宽和微秒级低延迟特性的网络基础设施需…

灌区信息化系统的建设内容和应用

一、背景 随着科技的不断发展,信息化技术已经逐渐渗透到各个领域中,为我们的生活和工作带来了极大的便利。灌区作为农业发展的重要组成部分,其信息化系统的建设也日益受到重视。 二、政策 据水利部消息,水利部、国家发改委近日正…

Unity中URP下获取额外灯数量

文章目录 前言一、SimpleLit下额外灯数量的获取1、在 SimpleLit 下,先获取了额外灯的数量2、对其进行循环计算每一个额外灯3、GetAdditionalLightsCount在这里插入图片描述 二、GetAdditionalLightsCount实现了什么1、_AdditionalLightsCount.x2、unity_LightData.y…

使用python写一个比Windows系统自带浏览器更好用的计算器

【介绍】 比Windows系统自带的还好用的计算器,感兴趣的可以试用一下。 1.支持括号优先级运算和平方、立方计算; 2.支持计算历史记录功能; 3.支持界面缩放和拖动; 4.支持钉在界面(界面最前置顶)&#xff0c…

Qt/QML编程之路:ListView实现横排图片列表的示例(40)

ListView列表,在QML中使用非常多,排列一个行,一个列或者一个表格,都会用到ListView。 ListView显示从内置QML类型(如ListModel和XmlListModel)创建的模型中的数据,或在C++中定义的从QAbstractItemModel或QAbstract ListModel继承的自定义模型类中的数据。 ListView有一…

未来零售策略解密:品牌全球化与新兴零售模式的交汇

随着全球数字化浪潮的不断推进,品牌出海已经成为零售业的重要发展方向。在这个多元化、全球化的市场中,线上线下融合和智能零售等新兴模式正迅速崛起,为品牌开拓更广阔的国际市场提供了丰富的可能性。本文Nox聚星将和大家探讨新兴零售模式在全…

Windows云服务器如何配置多用户登录?(Windows 2012)华为云官方文档与视频地址

Windows云服务器如何配置多用户登录?(Windows 2012)_弹性云服务器 ECS_故障排除_多用户登录_华为云 打开任务栏左下角的“服务器管理器”,在左侧列表中选中“本地服务器” 然后将右侧“远程桌面”功能的选项修改为“启用”&#x…

携程这几招,让千万用户真正实现低碳出游

近日,法大大与企业绿色发展研究院联合发布了《2023年签约减碳与低碳办公白皮书》(点击阅读及下载:法大大推出“签约减碳”年度账单,引领低碳办公新风潮),该白皮书基于《低碳办公评价》标准倡导的创新减碳技…

【必剪】鬼畜rap和鬼畜剧场的区别?

在【选择素材】中,每个素材下会有一个标签显示支持哪种的鬼畜形式,在点击一个两种格式的有【鬼畜剧场】和【鬼畜rap】这两中的主要区别在于 【鬼畜剧场】:对素材进行人工编排,创作自己原创的剧情作 【鬼畜rap】:对于素…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140,数二140,总分420,顺利上岸复旦大学,回顾这一年的复习,有起有落,也有过犹豫和放弃,好在都坚持下来了,希望大家考研复习要不忘初心,困难肯定是很…

win10安装postgresql 12.17

一、下载地址 Community DL Page 下载的12.17版本 二、安装 直接点“下一步、下一步”就可以,注意几点是在其中需要配置: 1.安装路径 2.data目录位置(默认是安装路径下的data文件夹) 3.端口(默认5432&#xff09…

多元跨界、戮力谐老!2024深圳国际户外运动展览会再创运动生活新方式

COSP Shenzhen 2024国际户外运动用品与时尚展 2024年3.14-16日 深圳会展中心(福田馆) COSP Shanghai 2024国际户外运动用品与时尚展 2024年9.05-07日 上海世博展览馆(浦东) 展会概述: 作为国内最具影响力的户外运动展会之一…

bt1120和bt656时序说明

时序说明 同步码说明 数据传输时序

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合(文件) 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注:进程是存在RAM中,程序是存放在ROM(flash)中的进程内容 BSS段&#xff…