【Pytorch笔记】7.torch.nn (Convolution Layers)

我们常用torch.nn来封装网络,torch.nn为我们封装好了很多神经网络中不同的层,如卷积层、池化层、归一化层等。我们会把这些层像是串成一个牛肉串一样串起来,形成网络。

先从最简单的,都有哪些层开始学起。

Convolution Layers - 卷积层

torch.nn.Conv1d()

1维卷积层。

torch.nn.Conv1d(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:输入tensor的通道数;
out_channels:输出tensor的通道数;
kernel_size:卷积核的大小;
stride:步长;
padding:输入tensor的边界填充尺寸;
dilation:卷积核之间的间距(下面这个图为dilation=2),默认为1;
在这里插入图片描述

groups:从输入通道到输出通道的阻塞连接数。in_channelout_channel需要能被groups整除。更具体地:
groups=1时所有输入均与所有输出进行卷积,groups=2时该操作相当于并排设置两个卷积层,每卷积层看到一半的输入通道,产生一半的输出通道,然后将两个卷积层连接起来。groups=in_channel时输入的每个通道都和相应的卷积核进行卷积;
bias:是否添加可学习的偏差值,True为添加,False为不添加。
padding_mode:填充模式,有以下取值:zeros(这个是默认值)、reflectreplicatecircular

import torch
import torch.nn as nn

m = nn.Conv1d(in_channels=16,
              out_channels=33,
              kernel_size=3,
              stride=2)
# input: 批大小为20,每个数据通道为16,size=50
input = torch.randn(20, 16, 50)
output = m(input)
print(output.size())

输出

# output: 批大小为20,每个数据通道为33,size=24
torch.Size([20, 33, 24])

torch.nn.Conv2d()

2维卷积层。

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)

参数与Conv1d()基本一样,不再赘述。

import torch
import torch.nn as nn

m = nn.Conv2d(in_channels=2,
              out_channels=3,
              kernel_size=3,
              stride=2)
input = torch.randn(20, 2, 5, 6)
output = m(input)
print(output.size())

输出

torch.Size([20, 3, 2, 2])

torch.nn.Conv3d()

3维卷积层。

torch.nn.Conv3d(in_channels, 
			    out_channels, 
			    kernel_size, 
			    stride=1, 
			    padding=0, 
			    dilation=1, 
			    groups=1, 
			    bias=True, 
			    padding_mode='zeros', 
			    device=None, 
			    dtype=None)

参数与Conv1d()基本一样,不再赘述。

import torch
import torch.nn as nn

m = nn.Conv3d(in_channels=2,
              out_channels=3,
              kernel_size=3,
              stride=2)
input = torch.randn(20, 2, 4, 5, 6)
output = m(input)
print(output.size())

输出

torch.Size([20, 3, 1, 2, 2])

torch.nn.ConvTranspose1d()

1维转置卷积层。

torch.nn.ConvTranspose1d(in_channels, 
						 out_channels, 
						 kernel_size, 
						 stride=1, 
						 padding=0, 
						 output_padding=0, 
						 groups=1, 
						 bias=True, 
						 dilation=1, 
						 padding_mode='zeros', 
						 device=None, 
						 dtype=None)

参数与Conv1d()基本一样,不再赘述。
唯一不同的是output_padding,与padding不同的是,output_padding是输出tensor的每一个边,外面填充的层数。
padding是输入tensor的每个边填充的层数)

import torch
import torch.nn as nn

m = nn.ConvTranspose1d(in_channels=2,
                       out_channels=3,
                       kernel_size=3,
                       stride=1)
input = torch.randn(20, 2, 2)
output = m(input)
print(output.size())

输出

torch.Size([20, 3, 4])

torch.nn.ConvTranspose2d()

2维转置卷积层。

torch.nn.ConvTranspose2d(in_channels, 
						 out_channels, 
						 kernel_size, 
						 stride=1, 
						 padding=0, 
						 output_padding=0, 
						 groups=1, 
						 bias=True, 
						 dilation=1, 
						 padding_mode='zeros', 
						 device=None, 
						 dtype=None)

参数与Conv1d()基本一样,不再赘述。

import torch
import torch.nn as nn

m = nn.ConvTranspose2d(in_channels=2,
                       out_channels=3,
                       kernel_size=3,
                       stride=1)
input = torch.randn(20, 2, 2, 2)
output = m(input)
print(output.size())

输出

torch.Size([20, 3, 4, 4])

torch.nn.ConvTranspose3d()

3维转置卷积层。

torch.nn.ConvTranspose3d(in_channels, 
						 out_channels, 
						 kernel_size, 
						 stride=1, 
						 padding=0, 
						 output_padding=0, 
						 groups=1, 
						 bias=True, 
						 dilation=1, 
						 padding_mode='zeros', 
						 device=None, 
						 dtype=None)

参数与Conv1d()基本一样,不再赘述。

import torch
import torch.nn as nn

m = nn.ConvTranspose3d(in_channels=2,
                       out_channels=3,
                       kernel_size=3,
                       stride=1)
input = torch.randn(20, 2, 2, 2, 2)
output = m(input)
print(output.size())

输出

torch.Size([20, 3, 4, 4, 4])

torch.nn.LazyConv1d()

1维延迟初始化卷积层,当in_channel不确定时可使用这个层。
关于延迟初始化,大家可以参考这篇文章,我认为讲的很好:
俱往矣… - 延迟初始化——【torch学习笔记】

torch.nn.LazyConv1d(out_channels, 
					kernel_size, 
					stride=1, 
					padding=0, 
					dilation=1, 
					groups=1, 
					bias=True, 
					padding_mode='zeros', 
					device=None, 
					dtype=None)

LazyConv1d没有in_channel参数
这不代表这个层没有输入的通道,而是在调用时自动适配,并进行初始化。
引用文章中的一段代码,改成LazyConv1d,讲述使用方法。

import torch
import torch.nn as nn

net = nn.Sequential(
    nn.LazyConv1d(256, 2),
    nn.ReLU(),
    nn.Linear(9, 10)
)
print(net)
[net[i].state_dict() for i in range(len(net))]

low = torch.finfo(torch.float32).min / 10
high = torch.finfo(torch.float32).max / 10
X = torch.zeros([2, 20, 10], dtype=torch.float32).uniform_(low, high)
net(X)
print(net)

输出

Sequential(
  (0): LazyConv1d(0, 256, kernel_size=(2,), stride=(1,))
  (1): ReLU()
  (2): Linear(in_features=9, out_features=10, bias=True)
)
Sequential(
  (0): Conv1d(20, 256, kernel_size=(2,), stride=(1,))
  (1): ReLU()
  (2): Linear(in_features=9, out_features=10, bias=True)
)

可以看出,未进行初始化时,in_features=0。只有传入参数使用网络后才会根据输入进行初始化。

torch.nn.LazyConv2d()

2维延迟初始化卷积层。

torch.nn.LazyConv2d(out_channels, 
					kernel_size, 
					stride=1, 
					padding=0, 
					dilation=1, 
					groups=1, 
					bias=True, 
					padding_mode='zeros', 
					device=None, 
					dtype=None)

torch.nn.LazyConv3d()

3维延迟初始化卷积层。

torch.nn.LazyConv3d(out_channels, 
					kernel_size, 
					stride=1, 
					padding=0, 
					dilation=1, 
					groups=1, 
					bias=True, 
					padding_mode='zeros', 
					device=None, 
					dtype=None)

torch.nn.LazyConvTranspose1d()

1维延迟初始化转置卷积层。

torch.nn.LazyConvTranspose1d(out_channels, 
							 kernel_size, 
							 stride=1, 
							 padding=0, 
							 output_padding=0, 
							 groups=1, 
							 bias=True, 
							 dilation=1, 
							 padding_mode='zeros', 
							 device=None, 
							 dtype=None)

torch.nn.LazyConvTranspose2d()

2维延迟初始化转置卷积层。

torch.nn.LazyConvTranspose2d(out_channels, 
							 kernel_size, 
							 stride=1, 
							 padding=0, 
							 output_padding=0, 
							 groups=1, 
							 bias=True, 
							 dilation=1, 
							 padding_mode='zeros', 
							 device=None, 
							 dtype=None)

torch.nn.LazyConvTranspose3d()

3维延迟初始化转置卷积层。

torch.nn.LazyConvTranspose3d(out_channels, 
							 kernel_size, 
							 stride=1, 
							 padding=0, 
							 output_padding=0, 
							 groups=1, 
							 bias=True, 
							 dilation=1, 
							 padding_mode='zeros', 
							 device=None, 
							 dtype=None)

torch.nn.Unfold()

从一个批次的输入张量中提取出滑动的局部区域块。

torch.nn.Unfold(kernel_size, 
				dilation=1, 
				padding=0, 
				stride=1)

kernel_size:滑动块的大小;
dilation:卷积核之间的间距(torch.nn.Conv1d中有图示);
padding:输入tensor的边界填充尺寸;
stride:滑块滑动的步长。

这里的输入必须是4维的tensor,否则会报这样的错误:

NotImplementedError: Input Error: Only 4D input Tensors are supported (got 2D)

示例

import torch
from torch import nn


t = torch.tensor([[[[1.,  2.,  3.,  4.],
                    [5.,  6.,  7.,  8.],
                    [9.,  10., 11., 12.],
                    [13., 14., 15., 16.],]]])

unfold = nn.Unfold(kernel_size=(2, 2), dilation=1, padding=0, stride=1)
output = unfold(t)
print(output)

输出

tensor([[[ 1.,  2.,  3.,  5.,  6.,  7.,  9., 10., 11.],
         [ 2.,  3.,  4.,  6.,  7.,  8., 10., 11., 12.],
         [ 5.,  6.,  7.,  9., 10., 11., 13., 14., 15.],
         [ 6.,  7.,  8., 10., 11., 12., 14., 15., 16.]]])

在这里插入图片描述

torch.nn.Fold()

Unfold()的逆操作。当Unfold()时出现滑块有重复覆盖时会导致结果和原来不一样。因为Fold()的过程中对于同一个位置的元素进行加法处理。

torch.nn.Fold(output_size, 
			  kernel_size, 
			  dilation=1, 
			  padding=0, 
			  stride=1)

下面是Unfold()和Fold()结合的代码,Unfold()部分和上面代码相同。

import torch
from torch import nn

t = torch.tensor([[[[1., 2., 3., 4.],
                  [5., 6., 7., 8.],
                  [9., 10., 11., 12.],
                  [13., 14., 15., 16.]]]])

unfold = nn.Unfold(kernel_size=(2, 2), dilation=1, padding=0, stride=1)
output = unfold(t)
print(output)
fold = nn.Fold(output_size=(4, 4), kernel_size=(2, 2))
out = fold(output)
print(out)

输出

tensor([[[ 1.,  2.,  3.,  5.,  6.,  7.,  9., 10., 11.],
         [ 2.,  3.,  4.,  6.,  7.,  8., 10., 11., 12.],
         [ 5.,  6.,  7.,  9., 10., 11., 13., 14., 15.],
         [ 6.,  7.,  8., 10., 11., 12., 14., 15., 16.]]])
tensor([[[[ 1.,  4.,  6.,  4.],
          [10., 24., 28., 16.],
          [18., 40., 44., 24.],
          [13., 28., 30., 16.]]]])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

功能测试+自动化测试代码覆盖率统计

Jacoco 是一个开源的覆盖率工具。Jacoco 可以嵌入到 Ant 、Maven 中,并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技术监控 Java 程序。很多第三方的工具提供了对 Jacoco 的集成,如 sonar、Jenkins、IDEA。 Jacoco 包含了多种尺度的覆盖率计数…

csapp attack lab phase4

csapp attack lab phase4 每个gadget由一系列指令字节组成,最后一个字节为0xc3,编码为ret指令。 举个例子: 48 89 c7 是指令 movq %rax, %rdi, 对应的地址是0x400f15 0x3 也就是0x400f18, 是开始的指令位置。 例如: ret编码为0…

线程安全与同步

线程安全问题是什么 多个线程同时操作同一个共享资源的时候可能会出现业务安全问题,称为线程安全问题。 取钱模型演示 需求:小明和小红是一对夫妻,他们有一个共同的账户,余额是10万元。 如果小明和小红同时来取钱,而…

Vue工程化

目录 一、环境准备 npm 二、Vue整站使用 1、Vue项目创建和启动 区别 目录结构 启动 2、Vue开发流程 App.vue 快速入门 3、API风格 案例 细节注意 代码实现 测试 一、环境准备 介绍:create-vue是Vue官方提供的最新的脚手架工具,用于快速生…

5个高质量的自用原型设计工具分享!

什么是原型?原型可以概括为整个产品推出前的框架设计。设计师可以用它来引导每个人参与这个项目。原型显示了每个部分之间的比重和每个部分之间的联系。原型不仅仅是一个表面的东西,它是可以和用户对话的,向用户解释该如何与产品进行交互。例…

一文讲解关于嵌入式系统程序运行的几个问题

问题1:FLASH中的代码是如何得到运行的呢?比如PC指针是在哪里由谁设置的? 以ARM为例: ARM-cortex-M3/4的单片机(比如STM32 等):该类单片机的代码在nor flash中,cortex内核可以直接运行…

Python入门教程之基本语法详解,收藏慢慢学~

文章目录 一、Python输出1、repr() 或 str() 转成字符串2、字符串填充空格进行格式化3、!a (使用 **ascii()**), !s (使用 **str()**) 和 !r (使用 **repr()**) 可以用于在格式化某个值之前对其进行转化 二、Python标识符三、Python保留字符(关键字)四、…

VC6.0 添加CMarkup文件,程序编译不成功

报错信息 Generating Code... Linking...Creating library Release/Iodevcfg.lib and object Release/Iodevcfg.exp ItemConfigDlg.obj : error LNK2001: unresolved external symbol "public: __thiscall CMarkup::~CMarkup(void)" (??1CMarkupQAEXZ) ItemConfigD…

具有mDNS功能的串口服务器

1.概述: 通过mDNS协议可以获得设备的ID、mac、IP、port等信息,方便计算机在同一个局域网内连接到具有该服务的模块。支持产品有串口服务器、串口转以太网模块、RS485串口转网口芯片等。 图 1 mDNS网络结构图 当具有mDNS的服务的设备接入网络的时候,首先…

leetcode链表必刷题——移除链表元素、设计链表、反转链表、两两交换链表中的节点、删除链表的倒数第 N 个结点、相交链表、环形链表、环形链表 II

文章目录 移除链表元素设计链表反转链表两两交换链表中的节点删除链表的倒数第 N 个结点相交链表环形链表环形链表 II 移除链表元素 题目链接 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节…

1分钟精准预测未来10天天气,谷歌开源GraphCast

11月15日,谷歌旗下著名AI研究机构Deepmind在官网宣布,开源天气大模型GraphCast,并公布了论文。 据悉,GraphCast可以在1分钟内,精准预测而来全球10天的天气情况,同时可以提前预警大暴雨、大风雪、洪水、高温…

KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0

KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0 作者: 猫头虎博主 文章目录 KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0🐅摘要引言1. 迁移前的精心准备1.1 系统环境介绍1.2 深度数据验证1.2.…

语音识别芯片NRK3301在智能茶吧机的应用

传统的饮水机传大多只能提供热水和冷水,而智能茶吧机则是一款集合了热饮水机、煮茶器、泡茶壶等多种功能于一体的多功能生活电器。它不仅具备了传统饮水机的所有功能,还可以根据不同的需求,提供多种水温的饮水方式;还具备了煮茶和…

Cesium+Vue:地形开挖

作者:CSDN @ _乐多_ 本文记录了在Cesium中进行地形开挖的方法和代码。使用Vue框架。 效果如下所示, 文章目录 前言:配置Cesium一、Vue文件二、创建地形开挖函数库三、创建绘制图形库四、创建提示语库前言:配置Cesium 参考《Vue:Vue项目中的Cesium配置备忘录》

【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

安装PostgreSql 9.6版本报错

先去官网:Community DL Page 下载了一个“9.6.24*”版本的PostgreSql,然后开始安装。 安装PostgreSql 报错: Cant install PostgreSQL: An error occurred executing the Microsoft VC runtime installer 第一,先:右…

外汇天眼:「外汇回撤」这术语是指什么?

"外汇回撤"是外汇交易中一个常见的专业术语。对于许多投资者,尤其是初学者来说,可能并不十分理解这个术语的实质。下面我们将详细介绍外汇回撤的含义。 外汇回撤通常被称为"外汇百分比回撤"。在外汇市场出现强烈趋势波动时&#xf…

Python自动化测试之request库详解(三)

做过接口测试的都会发现,现在的接口都是HTTPS协议了,今天就写一篇如何通过request发送https请求。 什么是HTTPS HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer ,是以安全为目标的HTTP通道,简单的讲是HTT…

UI游戏设计模板大放送:7种别具匠心的创意!

随着游戏产业的快速发展,UI游戏设计已经成为一个热门的设计行业,但与之前的设计相比,UI游戏设计还是比较特殊的,主要体现在UI游戏设计难度大,需要大量的手绘内容和对游戏玩法的理解上。这些门槛需要大量的时间去学习&a…

ALlegro怎么恢复到初始操作界面?

1.View 2.UI Settings 3.Reset UI To Default