IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Pytorch 卷积层的padding计算 -> 正文阅读

[人工智能]Pytorch 卷积层的padding计算

简介

最近在使用Pytorch搭建一个简单的DQN网络,其中涉及到图像需要进行卷积层和池化层的计算。
个人感觉Pytorch是一个数据每走一步都需要编程者清楚明白的Library,从github也可以感受到Pytorch的开发者对于极致性能的追求,这个问题会在后面讨论到……
好的,那我们先来查看一下Pytorch官网的接口。

Pytorch官网接口

Pytorch.nn Document
打开Doc并定位到convolution layers。

class
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:代表输入的通道数,比如你有4帧图像,那么in_channels=4
out_channels:代表输出的通道数,比如你想输出32个矩阵,那么out_channels=32
kernel_size:是个int也可以是个tuple,int即为正方形的卷积核,tuple即为矩形卷积核(X,Y)
stride:步长
padding:controls the amount of padding applied to the input. It can be either a string {‘valid’, ‘same’} or a tuple of ints giving the amount of implicit padding applied on both sides.
emm,那既然你官网都这么说了,那我就这么写吧。

import numpy as np 
import torch 
import torch.nn as nn

input = np.random.rand(80,80,4) # 80*80*4帧图像
input = input.transpose(2,0,1) # numpy转制为4*80*80便于输入
stateinput = input[None,:] # numpy数组升维
x = torch.from_numpy(stateinput).to(torch.float32) # torch tensor和numpy的转换

conv1 = nn.Conv2d(in_channels=4, out_channels=32, kernel_size=(8,8), stride=4, padding='same')
out = conv1(x)
print(out.shape)

好的,在这里我的每一步都是按照官网的Docs来的,但是你这么运行,会发现在构造conv2d时出现了错误。

ValueError: padding='same' is not supported for strided convolutions

【有内鬼啊!】
搜索了一下Pytorch的issue,发现了问题所在:
Pytorch issues67551
似乎是为了Pytorch的性能,需要用户自己计算一下padding的值,那么好吧,也是一个学习的过程。

Padding的计算

在实际操作时,我们会碰到 padding的两种方式 “SAME” 和 “VALID”,padding = “SAME”时,会在图像的周围填 “0”,padding = “VALID”则不需要,即 P=0。
一般会选“SAME”,以来减缓图像变小的速度,二来防止边界信息丢失(即有些图像边界的信息发挥作用较少)。
padding= “SAME”时:
N = W ? F + 2 P S + 1 N=\frac{W-F+2P}{S}+1 N=SW?F+2P?+1
其中:
N代表输出大小
W代表输入图片大小
F代表kernel大小
S代表步长
P就是padding也就是我们需要计算的值

举例

我们现在其余变量均已知,想要计算P值。
希望得到的输出是2020的图像,N=20;
输入是80
80的图像,W=80;
kernel大小是8*8,F=8
步长为4,S=4
N = W ? F + 2 P S + 1 N=\frac{W-F+2P}{S}+1 N=SW?F+2P?+1
20 = 80 ? 8 + 2 ? P 4 + 1 20=\frac{80-8+2*P}{4}+1 20=480?8+2?P?+1
求 得 P = 2 求得P=2 P=2

验证

import numpy as np 
import torch 
import torch.nn as nn

input = np.random.rand(80,80,4) # 80*80*4帧图像
input = input.transpose(2,0,1) # numpy转制为4*80*80便于输入
stateinput = input[None,:] # numpy数组升维
x = torch.from_numpy(stateinput).to(torch.float32) # torch tensor和numpy的转换

conv1 = nn.Conv2d(in_channels=4, out_channels=32, kernel_size=(8,8), stride=4, padding=2)
out = conv1(x)
print(out.shape)

得到结果

torch.Size([1, 32, 20, 20])

即32个20*20的数字矩阵,有了这样的算式,剩下的Convolution Layers和Pooling Layers也就照猫画虎的得到了。

Reference

卷积层输出大小尺寸计算及padding为 “SAME” 和 “VALID”的计算
使用pytorch实现CNN
如有错误,欢迎各位在评论区指出,我也是初学者,希望和大家一起进步。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:10:15  更:2022-04-06 23:12:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:35:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码