机器学习深度学习——torch.nn模块

news2025/1/1 22:00:50

机器学习&&深度学习——torch.nn模块

  • 卷积层
  • 池化层
  • 激活函数
  • 循环层
  • 全连接层

torch.nn模块包含着torch已经准备好的层,方便使用者调用构建网络。

卷积层

卷积就是输入和卷积核之间的内积运算,如下图:
在这里插入图片描述
容易发现,卷积神经网络中通过输入卷积核来进行卷积操作,使输入单元(图像或特征映射)和输出单元(特征映射)之间的连接时稀疏的,能够减少需要的训练参数的数量,从而加快网络计算速度。
卷积的分类如下所示,大体分为一维卷积、二维卷积、三位卷积以及转置卷积(简单理解为卷积操作的逆操作)

层对应的类功能作用
torch.nn.Conv1d()针对输入信号上应用1D卷积
torch.nn.Conv2d()针对输入信号上应用2D卷积
torch.nn.Conv3d()针对输入信号上应用3D卷积
torch.nn.ConvTranspose1d()在输入信号上应用1D转置卷积
torch.nn.ConvTranspose2d()在输入信号上应用2D转置卷积
torch.nn.ConvTranspose3d()在输入信号上应用3D转置卷积

以torch.nn.Conv2d()为例,介绍卷积在图像上的使用方法,其调用方式为:

torch.nn.Conv2d(in_channels,outchannels,kernel_size,
				stride=1,
				padding=0,
				dilation=1,
				groups=1,
				bias=True)

直接说前面三个参数吧,这三个是必选的参数,其他的参数作用可以看下面的这个文章:
torch.nn.Conv2d() 用法讲解
必选参数:

in_channels:输入的通道数目
out_channels:输出的通道数目
kernel_size:卷积核的大小,类型为int或元组,当卷积为方形时,只需要一个整形边长即可,否则要输入一个元组表示高和宽

现在我们针对一个二维图像来做卷积并观察结果:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

# 使用PIL包读取图像数据,使用matplotlib包来可视化图像和卷积后的结果
# 读取图像->转化为灰度图像->转化为Numpy数组
myim = Image.open("data/chap2/yier.jpg")
myimgray = np.array(myim.convert("L"), dtype=np.float32)
# 可视化图片
plt.figure(figsize=(6, 6))
plt.imshow(myimgray, cmap=plt.cm.gray)
plt.axis("off")
# plt.show()

# 上述操作得到一个512×512的数组,在卷积前,需要转化为1×1×512×512的张量
imh, imw = myimgray.shape
myimgray_t = torch.from_numpy(myimgray.reshape(1, 1, imh, imw))
# print(myimgray_t.shape)

# 卷积时需将图像转化为四维来表示[batch,channel,h,w],卷积后得到两个特征映射:
# 第一个特征映射使用图像轮廓提取卷积核获取,第二个特征映射使用的卷积核为随机数
# 卷积核大小为5×5,且不使用0填充,则卷积后输出特征映射的尺寸为508×508
# 下面进行卷积,且对卷积后的两个特征映射进行可视化

kersize = 5  # 定义边缘检测卷积核,并将维度处理为1*1*5*5
ker = torch.ones(kersize, kersize, dtype=torch.float32) * -1
ker[2, 2] = 24
ker = ker.reshape((1, 1, kersize, kersize))
# 此时ker矩阵为:
# tensor([[[[-1., -1., -1., -1., -1.],
#           [-1., -1., -1., -1., -1.],
#           [-1., -1., 24., -1., -1.],
#           [-1., -1., -1., -1., -1.],
#           [-1., -1., -1., -1., -1.]]]])
#           用意还是很好理解的,如果不再边缘上,那么乘积之和就是0,否则看结果正负也容易知道边缘所在的大概位置

# 进行卷积操作
conv2d = nn.Conv2d(1, 2, (kersize, kersize), bias=False)
# 设置卷积时使用的核,第一个核使用边缘检测核
conv2d.weight.data[0] = ker
# 对灰度图像进行卷积操作
imconv2dout = conv2d(myimgray_t)
# 对卷积后的输出进行维度压缩
imconv2dout_im = imconv2dout.data.squeeze()
# print(imconv2dout_im.shape)
# 可视化卷积后的图像
plt.figure(figsize=(12, 12))
plt.subplot(2, 2, 1)
plt.imshow(myim)
plt.axis("off")
plt.subplot(2, 2, 2)
plt.imshow(myimgray, cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(2, 2, 3)
plt.imshow(imconv2dout_im[0], cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(2, 2, 4)
plt.imshow(imconv2dout_im[1], cmap=plt.cm.gray)
plt.axis("off")
plt.show()

结果:
在这里插入图片描述
可以看出,使用的边缘特征提取卷积核很好地提取出了图像的边缘信息。而使用随机数的卷积核得到的卷积结果与原始图像很相似。

池化层

池化的一个重要目的是对卷积后得到的特征进行进一步处理(主要是降维),池化层可以对数据进一步浓缩,从而缓解内存压力。
池化会选取一定大小区域,将该区域内的像素值用一个代表元素表示,如下图表示滑动窗口2×2,且步长为2时的最大值池化和平均值池化:
在这里插入图片描述
在pytorch中有多种池化的类,分别是最大值池化(MaxPool)、最大值池化的逆过程(MaxUnPool)、平均值池化(AvgPool)与自适应池化(AdaptiveMaxPool、AdaptiveAvgPool)等,且都提供了一二三维的池化操作。
如果对上一个卷积后的图像进行池化,并且使用步长为2的最大值池化或平均值池化以后,所得到的尺寸将会变为254×254。
如果使用nn.AdaptiveAvgPool2d()函数,构造时可以指定其池化后的大小。
池化后,特征映射的尺寸变小,图像变得更模糊。

激活函数

下面的一些函数感觉也都是很基础的,一些关于双曲正余弦函数、双曲正切函数、梯度的概念给搞懂了就没什么问题。

层对应的类功能
torch.nn.SigmoidSigmoid激活函数
torch.nn.TanhTanh激活函数
torch.nn.ReLUReLU激活函数
torch.nn.SoftplusReLU激活函数的平滑近似

torch.nn.Sigmoid()
其对应的Sigmoid激活函数,又叫logistic激活函数:
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1
其输出在(0,1)这个开区间内,该函数在神经网络早期也是很常用的激活函数之一,但是当输入远离坐标源点时,函数的梯度就会变得很小,几乎为0,因此会影响参数的更新速度
torch.nn.Tanh()
对应双曲正切函数:
f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} f(x)=ex+exexex
其输出区间在(-1,1)之间,整个函数以0为中心,虽然与Sigmoid一样,当输入很大或很小时,梯度很小,不利于权重的更新,但毕竟是以0为对称,使用效果会比Sigmoid好很多
torch.nn.ReLU()
其对应的ReLU函数又叫修正线性单元,计算方式为:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
其只保留大于0的输出。而在输入正数时,不会存在梯度饱和的问题,计算速度会更快,而且因为ReLU函数只有线性关系,所以不管是前向传播还是反向传播都很快。
torch.nn.Softplus()
对应的平滑近似ReLU的激活函数,计算公式:
f ( x ) = 1 β l o g ( 1 + e β x ) f(x)=\frac{1}{β}log(1+e^{βx}) f(x)=β1log(1+eβx)
β默认为1。这个函数可以在任何位置求导数,且尽可能保留了ReLU函数的优点。

循环层

pytorch提供三种循环层实现:

层对应的类功能
torch.nn.RNN()多层RNN单元
torch.nn.LSTM()多层长短期记忆LSTM单元
torch.nn.GRU()多层门限循环GRU单元
torch.nn.RNNCell()一个RNN循环层单元
torch.nn.LSTMCell()一个长短期记忆LSTM单元
torch.nn.GRUCell()一个门限循环GRU单元

几个循环层函数的原理将在之后更新。

全连接层

指一个由多个神经元所组成的层,其所有的输出和该层的所有输入都有连接,即每个输入都会影响所有神经元的输出。
在pytorch中,nn.Linear()表示线性变换,全连接层可以看作是nn.Linear()表示线性变层再加上一个激活函数层所构成的结构。
nn.Linear()全连接操作及相关参数:
torch.nn.Linear(in_features,out_features,bias=True)
参数说明如下:
in_feature:每个输入样本的特征数量
out_feature:每个输出样本的特征数量
bias:若设置为False,则该层不会设置偏置,默认为True

torch.nn.Linear()的输入为(N,in_feature)的张量,输出为(N,out_feature)的张量。
全连接层的应用广泛,只有全连接层组成的网络是全连接神经网络,可用于数据的分类或回归预测,卷积神经网络和循环神经网络的末端,通常多个连接层组成。

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

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

相关文章

汽车养护店服务难题,看帕凝怎样解决?

中国汽车市场庞大,入户已然成为标配,加之新能源汽车近些年高增量,更促进了行业增长。而汽车后市场也迎来了一系列变化,客户服务前后路径需完善,商家们应该如何数字化经营呢? 接下来让我们看看【帕凝汽车养…

提升内功之模拟实现库函数atoi

本文包含知识点: 库函数atoi的使用和模拟实现枚举常量的运用fgets代替gets函数读取字符串isspace isdigit库函数的使用 一、库函数atoi的介绍与使用atoi的介绍atoi的使用细节 二、库函数atoi的模拟实现 一、库函数atoi的介绍与使用 atoi的介绍 函数介绍 头文件——…

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出,它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。 EdDSA的一个特殊之处在于,该方案不要求每次签名都是用全新的…

Spring项目如何创建?Bean对象是如何存储的?

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 目录 文章目录 一、创建Spring项目 1.1 创建Maven项目 2.2 配置国内源 二、Bean对象的存储和读取 2.1 添加spring配置文件 2.2 创建Bean对象 2.3 读取Bean对象 2.3.1 得到spring上下文对象…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

生命的样子

bbc纪录片《王朝》第一季就让我颇为震撼,第二季拖到现在才看,不过好在看了《晚酌de流派》之后,现在对待上好的游戏和视频都要颇有仪式感的情况下食用,夜深人静,配着暖灯,一杯茶,伴随大卫爱登堡的…

Lesson2——时间复杂度与空间复杂度

前言: 一个物品的好坏,我们可以通过体验、口碑、销量等因素判断。那一个算法的好坏我们怎么判断呢? 目录: 1. 算法的效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度oj练习 一、算法的效率 1、如何衡量一个算…

react-draft-wysiwyg富文本编辑器

在React项目中使用 yarn add react-draft-wysiwyg draft-js or npm i react-draft-wysiwyg draft-js推荐在项目中单独创建一个富文本编辑器组件 import { Editor } from "react-draft-wysiwyg"; import { EditorState, convertToRaw, ContentState } from draft-js…

12、动手学深度学习——循环神经网络从零实现+Pytorch内置函数实现:代码详解

1、基础知识 参考文章:8.4. 循环神经网络 2、从零开始实现 本节将上述描述, 从头开始基于循环神经网络实现字符级语言模型。 这样的模型将在H.G.Wells的时光机器数据集上训练。 首先, 我们先读取数据集。 %matplotlib inline import math…

陆拾柒- 如何通过数据影响决策(二)

是否曾感觉自己已经很努力了,但却一直被人说表现的比以前差了。 虽然古语有云“眼见为实”,但着眼之处很有可能是错的。 一、某咖啡店近期销量 7月17日准备要开大会时,负责小程序渠道的同事看到7月17日趋势下跌之后,就开始想办法…

fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errno=Unknown error

git:fatal: unable to connect to github.com:github.com[0:20.205.243.166]: errnoUnknown error 在 bash 执行命令 git clone 时 报 : fatal: unable to connect to github.com:github.com[0: 20.205.243.166]: errnoUnknown error 发生此错误是因为 g…

【C++】string类的模拟实现(增删查改,比大小,运算符重载)

文章目录 1.1大框架1.2基本函数:2.成员函数2.0构造函数2.05析构函数2.09拷贝构造函数补充:预留存储空间(reserve) 2.1增加字符(push_back,append,s)push_backappends 2. 删除字符&am…

SpringCloud-Alibaba之Seata处理分布式事务

一ID三组件模型 Transaction ID XID 全局唯一的事务ID Transaction Coordinator(TC) 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚 Transaction Manager™ 控制全局事务的边界,负责开启一个全局事务,…

Java当中的深拷贝和浅拷贝

文章目录 一、前提二、浅拷贝1. BeanUtils实现浅拷贝 三、深拷贝1. 实现Cloneable接口并重写clone()方法:2. 使用序列化与反序列化: 一、前提 在计算机的内存中,每个对象都被赋予一个地址,该地址指向对象在内存中存储的位置。当我…

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此,由两部分组成的教程的第一部分中,我将向您展示如何: 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…

uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

放点击事件里面即可 uni.navigateToMiniProgram({appId: , //跳转的小程序的aooIdpath: pages/index/index?id123, //如果这里不填,默认是跳转到对方小程序的主页面extraData: { //需要传给对方小程序的数据data1: test},success(res) {// 打开成功} })

Leetcode每日一题:42. 接雨水(2023.7.23 C++)

目录 42. 接雨水 题目描述: 实现代码与解析: 单调栈 原理思路: 动态规划 原理思路: 42. 接雨水 原题链接: 42. 接雨水 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,…

SVTR: 使用单一视觉模型进行场景文本识别【论文翻译】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 SVTR: Scene Text Recognition with a Single Visual ModelAbstract1 Introduct…

Ansible部署与实施PlayBook

Ansible部署与实施PlayBook 计算机名称IP角色workstation192.168.182.130管理servera192.168.182.131被管理serverb192.168.182.132被管理serverc192.168.182.133被管理 部署 控制节点 官方文档 Ansible易于安装。只需要安装到要运行它的一个或多个控制节点上。由Ansbile管…

【事业单位-语言理解】中心理解01

【事业单位-语言理解】中心理解01 一、中心理解1.1 转折关系1.2 因果关系1.3必要条件关系 二、总结 一、中心理解 1.1 转折关系 转折之后是中心意思 转折在分述句子中,就没有那么重要 1.2 因果关系 一方面另一方面起到的是分述的作用,一般不要过多…