【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 nnm = 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 nnm = 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 nnm = 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 nnm = 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 nnm = 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 nnm = 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 nnnet = 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 nnt = 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 nnt = 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.]]]])

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

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

相关文章

监控直流防雷浪涌保护器综合方案

监控系统是一种广泛应用于安防、交通、工业、军事等领域的信息系统,它通过摄像机、传输线路、监控中心等设备,实现对目标区域的实时监视和控制。然而,监控系统也面临着雷电的威胁,雷电可能通过直击雷、感应雷、雷电波侵入等途径&a…

map和set的简易封装(纯代码)

RBTree.h #pragma once#include<iostream> #include<vector> using namespace std;enum colar { red,black };template<class T>//有效参数就一个 struct RBTreeNode {RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr)…

在Broker端进行消息过滤

在Broker端进行消息过滤&#xff0c;可以减少无效消息发送到Consumer&#xff0c;少占用网络带宽从而提高吞吐量。Broker端有三种方式进行消息过滤。 1.消息的Tag和Key 对一个应用来说&#xff0c;尽可能只用一个Topic&#xff0c;不同的消息子类型用Tag来标识&#xff08;每条…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

聊聊ThreadLocal(二)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 大部分面试官喜欢问Thr…

git 指定时间代码统计

指定时间代码统计 用法 13 - 17 号 代码情况 近一周 git log --since2023-11-13 00:00:00 --until2023-11-17 23:00:00 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s,total lines: %s\n&…

系列三、GC垃圾回收【总体概览】

一、GC垃圾回收【总体概览】 JVM进行GC时&#xff0c;并非每次都对上面的三个内存区域&#xff08;新生区、养老区、元空间/永久代&#xff09;一起回收&#xff0c;大部分回收的是新生区里边的垃圾&#xff0c;因此GC按照回收的区域又分为了两种类型&#xff0c;一种是发生在新…

hive数仓-数据的质量管理

版本20231116 要理解数据的质量管理&#xff0c;应具备hive数据仓库的相关知识 文章目录 1.理解什么是数据的质量管理&#xff1a;2.数据质量管理的规划数据质量标准的分类 3.数据质量管理解决方案1.ods层的数据质量校验1&#xff09;首先在hive上建立一个仓库&#xff0c;添加…

R语言——taxize(第二部分)

taxize&#xff08;第二部分&#xff09; 3. taxize 文档中译3.10. classification&#xff08;根据类群ID检索分类阶元层级&#xff09;示例1&#xff1a;传递单个ID值示例2&#xff1a;传递多个ID值示例3&#xff1a;传递单个名称示例4&#xff1a;传递多个名称示例5&#xf…

ubuntu 20通过docker安装onlyoffice,并配置https访问

目录 一、安装docker &#xff08;一&#xff09;更新包列表和安装依赖项 &#xff08;二&#xff09;添加Docker的官方GPG密钥 &#xff08;三&#xff09;添加Docker存储库 &#xff08;四&#xff09;安装Docker &#xff08;五&#xff09;启动Docker服务并设置它随系…

001 opencv addWeighted

目录 一、环境 二、addWeighted函数 三、代码演示 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、addWeighted函数 OpenCV中的cv.addWeighted函数是一个用于图像叠加的函数&#xff0c;它可以将两个具有相同尺寸和类型的图像按…

uniapp生成自定义(分享)图片并保存到相册

需求描述 在一个页面中底部有个保存图片的功能&#xff0c;点击能够保存一张生成的自定义表格图片。 第一眼见到这个需求 自己会出现了两个问题 如何去处理图片中的自定义内容以及样式如何将自定义内容转化成图片 至于保存图片&#xff0c;uniapp有对应的api去实现uni.saveIma…

【部署篇】Docker配置MySQL容器+远程连接

一、前言 上篇文章在部署nestjs时&#xff0c;由于docker访问不了主机的localhost&#xff0c;所以无法连接主机数据库。所以我们只能在docker中额外配置一个数据库&#xff0c;映射到主机上&#xff0c;然后可以通过ip地址访问。 在本篇文章我们会在docker中创建一个mysql&a…

Vue3源码reactive和readonly对象嵌套转换,及实现shallowReadonly

前言 官方文档中对reactive的描述&#xff1a; 响应式转换是“深层”的&#xff1a;它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性&#xff0c;同时保持响应性。 官方文档中对readonly的描述: 只读代理是深层的&#xff1a;对任何嵌套属性的访问都将是…

web:[BUUCTF 2018]Online Tool

题目 打开页面显示如下&#xff0c;进行代码审计 上述代码主要功能是接收‘host’参数&#xff0c;后使用nmap扫描主机端口 首先检查是否存在HTTP_X_FORWARDED_FOR头&#xff0c;若存在&#xff0c;将值赋值给EMOTE_ADDR,是为了跟踪用户真实的IP地址 后用检查get‘host’是否…

验证k8s中HPA功能及测试

部署 使用yaml部署服务 apiVersion: apps/v1 kind: Deployment metadata:name: php-apachenamespace: tools spec:replicas: 1selector:matchLabels:app: php-apachetemplate:metadata:labels:app: php-apachespec:containers:- name: php-apacheimage: registry.cn-beijing.…

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…

Java虚拟机运行时数据区结构详解

Java虚拟机运行时数据区结构如图所示 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 多线程切换时&#xff0c;为了能恢复到正确的执行位置&#xff0c;每条线程…

计算机毕业设计选题推荐-二手交易跳蚤市场微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

通信原理板块——脉冲编码调制(PCM)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、脉冲编码调制PCM原理 将模拟信号…