PyToch 深度学习 || 3. 卷积神经网络 | 3.1 深度学习中的卷积操作

深度学习中的卷积操作

文章目录

  • 深度学习中的卷积操作
    • 1. 卷积
    • 2. 一维卷积
      • 2.1 使用nn.functional库中conv1d
      • 2.2 使用nn库中的Conv1d
    • 3. 二维卷积
      • 3.1 nn.functional.conv2d
      • 3.2 nn.Conv2d

1. 卷积

加权求和是一种非常重要的运算,可以整合局部数字特征进而是提取局部信息的重要手段。这种加权求和的形式被称作卷积或者滤波,对于两个信号 f ( x ) f(x) f(x) g ( x ) g(x) g(x),卷积操作表示为

f ( x ) ∗ g ( x ) = ∫ − ∞ + ∞ f ( τ ) g ( x − τ ) d τ f(x)*g(x)=\int^{+\infty}_{-\infty}f(\tau)g(x-\tau)d\tau f(x)g(x)=+f(τ)g(xτ)dτ

卷积在物理现象中类似于波的叠加。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

常用的卷积有1Dconv,2Dconv 和 3Dconv,这些卷积的区别仅在于滑动的方向不一样,而与卷积核的形状无关。1Dconv 滑动的方向仅为水平方向,2Dconv 沿着水平和竖直方向滑动。卷积后的形状遵循如下公式

h = ( h − kennel size + 2 ∗ padding ) / stride + 1 w = ( w − kennel size + 2 ∗ padding ) / stride + 1 h = (h - \text{kennel size}+2*\text{padding}) / \text{stride} + 1\\ w = (w - \text{kennel size}+2*\text{padding}) / \text{stride} + 1 h=(hkennel size+2padding)/stride+1w=(wkennel size+2padding)/stride+1

其中,padding 为边界填充 0 的行列数,stride 为滑动步长。

2. 一维卷积

2.1 使用nn.functional库中conv1d

该函数的优势可以设定核中的权重,尽管这个在网络中不是必须的。

用法:

torch.nn.functional.conv1d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1) → Tensor

参数:

  • input-形状(minibatch,in_channels,iW)的输入张量

  • weight-形状(out_channels,groupsin_channels,kW)的过滤器

  • bias-形状 (out_channels) 的可选偏差。默认值:None

  • stride-卷积核的步幅。可以是单个数字或 one-element 元组 (sW,) 。默认值:1

  • padding-输入两侧的隐式填充。可以是字符串 {‘valid’, ‘same’}、单个数字或 one-element 元组 (padW,) 。默认值:0 padding=‘valid’ 与无填充相同。 padding=‘same’ 填充输入,使输出具有作为输入的形状。但是,此模式不支持 1 以外的任何步幅值。

一维卷积可以对单个向量进行卷积操作

在这里插入图片描述

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

a=range(16)
x = Variable(torch.Tensor(a))
'''
a: range(0, 16)
x: tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,
        14., 15.])
'''

x=x.view(1,1,16)
'''
x variable: tensor([[[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14., 15.]]])
'''

b=torch.ones(3)
b[0]=0.1
b[1]=0.2
b[2]=0.3
weights = Variable(b)
weights=weights.view(1,1,3)
'''
weights: tensor([[[0.1000, 0.2000, 0.3000]]])
'''

y=F.conv1d(x, weights, padding=0)
'''
y: tensor([[[0.8000, 1.4000, 2.0000, 2.6000, 3.2000, 3.8000, 4.4000, 5.0000, 5.6000, 6.2000, 6.8000, 7.4000, 8.0000, 8.6000]]])
'''
y
tensor([[[0.8000, 1.4000, 2.0000, 2.6000, 3.2000, 3.8000, 4.4000, 5.0000,
          5.6000, 6.2000, 6.8000, 7.4000, 8.0000, 8.6000]]])

1Dconv 同样可以对多个向量进行一维卷积操作
在这里插入图片描述

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

a=range(16)
x = Variable(torch.Tensor(a))
'''
a: range(0, 16)
x: tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,
        14., 15.])
'''

x=x.view(1,2,8)
'''
x variable: tensor([[[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.]
                     [ 8.,  9., 10., 11., 12., 13., 14., 15.]]])
'''

b=torch.ones(6)
b[0]=0.1
b[1]=0.2
b[2]=0.3
b[3]=0.1
b[4]=0.2
b[5]=0.3

weights = Variable(b)
weights=weights.view(1,2,3)
'''
weights: tensor([[[0.1000, 0.2000, 0.3000]
                  [0.1000, 0.2000, 0.3000]]])
'''

y=F.conv1d(x, weights, padding=0)
'''
y: tensor([[[ 6.4000,  7.6000,  8.8000, 10.0000, 11.2000, 12.4000]]])
'''
y
tensor([[[ 6.4000,  7.6000,  8.8000, 10.0000, 11.2000, 12.4000]]])

2.2 使用nn库中的Conv1d

在深度学习中,滤波器的初始权重并没有多大意义,因此,初始权重采用随机数和权重共享的方式,不必设定权重的值,而nn.Conv1d正是为了达到此目的而产生的。

用法:

torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=‘zeros’)

参数:

  • in_channel:输入的通道数,信号一般为一维

  • out_channel:输出的通道数

  • kernel_size:卷积核的大小

  • stride:步长

  • padding:0填充

import time

import torch
import torch.nn as nn

'''
Description: torch.nn.Conv1d
input:(batch_size,in_channel,length)
output:(batch_size,out_channel,length)
shape of kernel:(channel*kernel_size)
out_channel :the num of kernel--> how much kernel do you need?
'''
#(batch_size,in_channel,length)
input =torch.ones(1,1,6)
print(input)
model =nn.Conv1d(in_channels=1,
                 out_channels=1,#可以设定多个滤波器,共享权重
                 kernel_size=3,
                 padding=0)
# (batch_size,out_channel,length)
output =model(input)
print(output)
tensor([[[1., 1., 1., 1., 1., 1.]]])
tensor([[[-0.2018, -0.2018, -0.2018, -0.2018]]],
       grad_fn=<ConvolutionBackward0>)
import time

import torch
import torch.nn as nn

'''
Description: torch.nn.Conv1d
input:(batch_size,in_channel,length)
output:(batch_size,out_channel,length)
shape of kernel:(channel*kernel_size)
out_channel :the num of kernel--> how much kernel do you need?
'''
#(batch_size,in_channel,length)
input =torch.ones(1,1,6)
print(input)
model =nn.Conv1d(in_channels=1,
                 out_channels=2,#可以设定多个滤波器,共享权重
                 kernel_size=3,
                 padding=0)
# (batch_size,out_channel,length)
output =model(input)
print(output)
tensor([[[1., 1., 1., 1., 1., 1.]]])
tensor([[[-1.4254, -1.4254, -1.4254, -1.4254],
         [ 0.4811,  0.4811,  0.4811,  0.4811]]],
       grad_fn=<ConvolutionBackward0>)
import time

import torch
import torch.nn as nn

'''
Description: torch.nn.Conv1d
input:(batch_size,in_channel,length)
output:(batch_size,out_channel,length)
shape of kernel:(channel*kernel_size)
out_channel :the num of kernel--> how much kernel do you need?
'''
#(batch_size,in_channel,length)
input =torch.ones(4,2,6)
print(input)
model =nn.Conv1d(in_channels=2,
                 out_channels=4,#可以设定多个滤波器,共享权重
                 kernel_size=3,
                 padding=0)
# (batch_size,out_channel,length)
output =model(input)
print(output)
tensor([[[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]],

        [[1., 1., 1., 1., 1., 1.],
         [1., 1., 1., 1., 1., 1.]]])
tensor([[[-0.4742, -0.4742, -0.4742, -0.4742],
         [ 1.0267,  1.0267,  1.0267,  1.0267],
         [-0.8237, -0.8237, -0.8237, -0.8237],
         [ 0.2031,  0.2031,  0.2031,  0.2031]],

        [[-0.4742, -0.4742, -0.4742, -0.4742],
         [ 1.0267,  1.0267,  1.0267,  1.0267],
         [-0.8237, -0.8237, -0.8237, -0.8237],
         [ 0.2031,  0.2031,  0.2031,  0.2031]],

        [[-0.4742, -0.4742, -0.4742, -0.4742],
         [ 1.0267,  1.0267,  1.0267,  1.0267],
         [-0.8237, -0.8237, -0.8237, -0.8237],
         [ 0.2031,  0.2031,  0.2031,  0.2031]],

        [[-0.4742, -0.4742, -0.4742, -0.4742],
         [ 1.0267,  1.0267,  1.0267,  1.0267],
         [-0.8237, -0.8237, -0.8237, -0.8237],
         [ 0.2031,  0.2031,  0.2031,  0.2031]]],
       grad_fn=<ConvolutionBackward0>)

3. 二维卷积

3.1 nn.functional.conv2d

卷积的方式有多种,主要区别在于卷积核与图像矩阵边界匹配的方式和加权求和后值的位置分配不同,下图尽通过一组图来展示卷积的过程。
在这里插入图片描述

在这里插入图片描述

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

其中input代表的是输入图像/矩阵(这里限制输入必须是以[minibatch,channel,H,W]这样的shape输入)
weight代表的是卷积核(同样是要求以上面的shape输入)
stride代表的是卷积核在输入图像上移动的步长
padding代表的是进行卷积之前是否对输入图像进行边缘填充(默认不填充)

import torch 
import torch.nn.functional as F

#卷积操作
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]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

print(input)   # [5,5]
print('\n', kernel)  # [3,3]
input = torch.reshape(input, (1, 1, 5, 5)) # (batch, channal, width, heiht)
kernel = torch.reshape(kernel, (1, 1, 3, 3)) # (batch, channal, width, heiht)

# stride=1,卷积核每次移动一个元素
output1 = F.conv2d(input, kernel, stride=1)
print("\n stride=1,不进行padding,卷积操作后:")
print(output1) # (5-3+2*0)/1 + 1 = 3

# padding=1, 边界填充一格,元素设置为0,扩充完之后是一个7*7的矩阵

output2 = F.conv2d(input, kernel, stride=1, padding=1)
'''
[[0,0,0,0,0,0,0]
 [0,1,2,0,3,1,0],
 [0,0,1,2,3,1,0],
 [0,1,2,1,0,0,0],
 [0,5,2,3,1,1,0],
 [0,2,1,0,1,1,0]
 [0,0,0,0,0,0,0]]
'''
print("\n stride=1,padding=1,卷积操作后:")
print(output2) # (5-3+2*1)/1 + 1 = 5

# stride=2,卷积核每次移动2个元素
output3 = F.conv2d(input, kernel, stride=2)
print("\n stride=2,不进行padding,卷积操作后:")
print(output3) # (5-3+2*0)/2 + 1 = 2
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]])

 tensor([[1, 2, 1],
        [0, 1, 0],
        [2, 1, 0]])

 stride=1,不进行padding,卷积操作后:
tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])

 stride=1,padding=1,卷积操作后:
tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])

 stride=2,不进行padding,卷积操作后:
tensor([[[[10, 12],
          [13,  3]]]])

3.2 nn.Conv2d

深度学习中一般不需要刻意设定卷积核的权重,可以使用nn.Conv2d,将关注点放在输入和输出上的数目上。

函数:

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

x = torch.randn(3,1,5,4) # [batch, channel, height, width]
print('3 批数据单通道矩阵:')
print(x)

conv = torch.nn.Conv2d(in_channels=1, out_channels=4, kernel_size=(2,3), stride=1, padding=0)
res = conv(x) # (5-2+2*0)/1+1 =4; (4-3+2*0)/1+1=2

print(res.shape)    # torch.Size([3, 4, 4, 2])
3 批数据单通道矩阵:
tensor([[[[-0.2597, -0.2103,  0.0358, -1.0163],
          [ 0.9965,  0.0855, -0.7477, -1.5901],
          [ 2.2799, -1.1986, -2.2921, -0.8996],
          [ 1.2546, -0.2645, -0.0734,  2.1464],
          [ 0.4333, -1.4566,  1.4044,  0.9502]]],


        [[[-0.5962, -0.0100,  1.2836,  1.5562],
          [ 0.7060,  0.9727,  0.3383, -0.8690],
          [ 0.2354,  0.2068, -1.1025,  2.9323],
          [-0.8895, -0.9010,  1.4417, -0.3452],
          [ 1.3244,  1.5612, -2.3033,  0.5028]]],


        [[[ 1.3851, -0.9373,  1.4245,  0.9449],
          [-1.7409, -1.2329,  0.4447,  0.8167],
          [ 1.4936, -0.2248,  1.3076, -1.7958],
          [ 1.2098,  0.6465,  0.0848,  0.8640],
          [-0.0291, -0.3277,  2.0227, -0.7025]]]])
torch.Size([3, 4, 4, 2])

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

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

相关文章

BI系统能给企业带来什么?看完本文就懂了

这几年大家都在转型数字化&#xff0c;而数字化运营需要依赖BI系统来进行数据分析和决策支持&#xff0c;从而提升企业效率和竞争力&#xff0c;因此在转型数字化的过程中&#xff0c;必然少不了BI系统。 BI系统是一种可以高效智能地收集和整合多业务系统数据&#xff1b;实现大…

L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 示例1 输入 1 10 3 5 输出 3 说明 只有一把回旋镖&#xff0c;你可以先打两次伤害为3的&#xff0c;再打一次倾尽全力的&#xff0c;造成的伤害为5。总伤害为33511&#xff0c;即可获得胜…

string类的模拟实现

文章目录 string类的模拟实现string基本框架的实现operator的实现string常用函数的实现 string类的模拟实现 前文对于string的常用函数做了讲解&#xff0c;由于string是一个面试官常考的点&#xff0c;总喜欢让模拟实现string类&#xff0c;下面来模拟实现一下string&#xf…

Alluxio技术分析

Alluxio技术分析 Alluxio: A Virtual Distributed File System Alluxio主要解决的基于磁盘的分布式存储层性能低下的问题&#xff0c;通过alluxio提供的分布式内存来加速数据分析。 Alluxio的这种通过内存加速数据的想法其实是有明确的使用场景的&#xff1a; Immutable da…

【WEB开发】Java获取高德POI(关键词搜索法)实现数据展示

前言 该篇文章是关键词搜索法获取高德poi&#xff0c;但鉴于无法突破200条记录的上限&#xff0c;所以采用了本方法进行区/县循环检索。开始之前我们首先需要明白一些常识 poi是兴趣点&#xff0c;它本身除了经纬度&#xff0c;还记录了一些信息&#xff0c;如名称、地址、联…

opencv-19 图像色彩空间转换函数cv2.cvtColor()

cv2.cvtColor() 函数是 OpenCV 中用于图像颜色空间转换的函数。它允许你将图像从一个色彩空间转换为另一个色彩空间。在 Python 中&#xff0c;你可以使用这个函数来实现不同色彩空间之间的转换。 函数的基本语法为&#xff1a; cv2.cvtColor(src, code[, dst[, dstCn]])参数…

消息队列(一)-- RabbitMQ入门(4)

RabbitMQ 其他知识点 幂等性 消息重复消费 消费者在消费MQ 中的消息时&#xff0c;MQ 已经把消息发送给消费者&#xff0c;消费者在给 MQ 返回 ack 时网络中断&#xff0c;故MQ 未收到确认消息&#xff0c;该消息会重新发给其他消费者&#xff0c;或网络重新连接后再次发给该消…

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习

1. 中值定理 中值定理是反映函数与导数之间联系的重要定理&#xff0c;也是微积分学的理论基础&#xff0c;在许多方面它都有重要的作用&#xff0c;在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的&#xff0c;其中拉格朗日中值定理是核心&…

登录和注册页面 - 验证码功能的实现

目录 1. 生成验证码 2. 将本地验证码发布成 URL 3. 后端返回验证码的 URL 给前端 4. 前端将用户输入的验证码传给后端 5. 后端验证验证码 1. 生成验证码 使用hutool 工具生成验证码. 1.1 添加 hutool 验证码依赖 <!-- 验证码 --> <dependency><groupId…

Android Studio Flamingo Logcat使用方式

旧版Android Studio突然打不开了&#xff0c;安装了新的Flamingo。习惯用Log.e看日志&#xff0c;突然发现logcat没有筛选下拉了。o(╥﹏╥)o 还是需要查看官方文档&#xff1a;https://developer.android.google.cn/studio/debug/logcat?hlzh-cn &#xff08;不知道为啥&…

jdk,jre和jvm三者的关系和区别

目录 一、三者的关系 二、JDK的概念 三、JRE的概念 四、JVM的概念 五、三者区别 一、三者的关系 从图中可以清楚地看到&#xff0c;他们之间的关系是JDK包含JRE, JRE又包含JVM。 因此&#xff0c;JDK包含JRE和JVM。 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap…

VS下c++解析pcap文件

一、pcap文件格式 https://www.cnblogs.com/Chary/articles/15716063.html 接口协议&#xff08;四&#xff09;&#xff1a;以太网&#xff08;Ethernet&#xff09;学习&#xff08;一&#xff09;&#xff1a;协议_以太网协议_QNee的博客-CSDN博客 二、代码 pcapParser.h #…

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…

npm i babel-plugin-import -D之后报错

替换modules/.bin/XX文件 1.vue-cli-service #!/bin/sh basedir$(dirname "$(echo "$0" | sed -e s,\\,/,g)")case uname in*CYGWIN*) basedircygpath -w "$basedir";; esacif [ -x "$basedir/node" ]; then"$basedir/node"…

Audio Clip

Unity支持的音频格式&#xff1a; aiff/wav&#xff1a;适用于较短声音片段 mp3/OGG:适用于较长的音乐片段 多声道强制转为单声道&#xff0c;减小所占内存。 勾选后会对声音有优化 在后台加载声音 Load Type&#xff1a; 第一个&#xff0c;以不压缩的形式存在内存&#…

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

FAQ文档的重点注意事项!别踩坑了

在很多优秀的大企业中&#xff0c;FAQ文档是企业运营管理中不可或缺的重要部分。但是也仅限大企业&#xff0c;很多企业目前还是没有这个意识的。一方面原因是因为缺乏这个客户服务的意识&#xff0c;另一方面也和技术水平不足有关。但是其实现在有不少的第三方搭建平台可以帮助…

【Element-ui】学习与使用

网站快速成型工具Element&#xff0c;一套为开发者、设计师和产品经理准备的基于vue2.0的桌面端组件库 安装 npm i element-ui -S 在项目中安装element-ui&#xff0c;安装了以后查看package.json中的依赖中有没有element-ui的版本&#xff0c;如果有&#xff0c;则说明安装成功…

react 在build读取env 数据

默认会读取.env 文件 npm install dotenv --save npm install dotenv-cli --save-dev例如读取.env.test "build:test": "dotenv -e .env.test react-app-rewired build",.env.test REACT_APP_CURRENTMODE devREACT_APP_Public_Path "https://baid…