数据学习
登录
注册
原创博客
期刊会议
学术世界
期刊出版社
领域期刊
SCI/SCIE/SSCI/EI简介
期刊列表
会议列表
所有期刊分区
学术期刊信息检索
JCR期刊分区查询
CiteScore期刊分区查询
中科院期刊分区查询
领域期刊分区
管理 - UTD24期刊列表
管理 - AJG(ABS)期刊星级查询
管理 - FMS推荐期刊列表
计算机 - CCF推荐期刊会议列表
高校期刊分区
南大核心(CSSCI)
合工大小核心
合工大大核心
AI资源仓库
AI领域与任务
AI研究机构
AI学术期刊
AI论文快讯
AI数据集
AI开源工具
AI模型
AI模型概览
预训练模型
数据推荐
网址导航
我的网址导航
程序员必备网站
深度学习卷积操作的维度计算(PyTorch/Tensorflow等框架中Conv1d、Conv2d和Conv3d介绍)
标签:
#PyTorch#
#卷积神经网络#
#深度学习#
时间:2019/05/31 20:27:07
作者:小木
#### 一、卷积操作的维度计算 卷积操作的维度计算是定义神经网络结构的重要问题,在使用如PyTorch、Tensorflow等深度学习框架搭建神经网络的时候,对每一层输入的维度和输出的维度都必须计算准确,否则容易出错,这里将详细说明相关的维度计算。 首先,我们看一下卷积操作涉及的东西,一个卷积操作需要定义卷积核的大小、输入图像的padding长度以及卷积操作的步长。以一个二维输入为例,一个多卷积核操作的示意图如下:

这个例子的输入数据是一个三维数据,带有通道数,输入数据第三个维度是通道数,使用了两个卷积核(滤波器)扫描得到两个二维图像(一个卷积核对一个三维数据,即带多个通道的二维数据扫描可以得到一个图像,要求卷积核也是三维,且通道数和输入数据通道数一样),组成输出数据的两个通道。下面我们来描述具体计算。 假设输入数据大小是: ```math w \times h ``` 其中,w是宽度,h是高度。卷积核大小是: ```math f \times f ``` padding的长度是p(padding),步长是s(stride): 那么经过卷积操作之后,输出的数据大小: ```math \lfloor\frac{w + 2p - f}{s} +1 \rfloor \times \lfloor \frac{h +2p - f }{p} + 1\rfloor ``` 如果输入的数据是三维数据,即: ```math w \times h \times c ``` 其中,w是宽度,h是高度,c是通道数(对于RGB图像输入来说,这个值一般是3,在文本处理中,通常是不同embedding模型的个数,如采用腾讯训练的、谷歌训练的等)。 这个时候的卷积核通常也是带通道的三维卷积核: ```math f \times f \times c ``` 注意,一般来说,卷积核的通道数c和输入数据的通道数是一致的。因此,这个时候卷积之后的输出依然是一个二维数据,其大小为: ```math \lfloor \frac{w + 2p - f}{s} +1 \rfloor \times \lfloor \frac{h +2p - f}{s} + 1 \rfloor ``` 这里的维度做了向下取整,防止结果不是整数的情况。假如希望输出的也是带通道的结果,那么这时候就要使用多个卷积核来操作了,最终输出的数据维度是: ```math \lfloor \frac{w + 2p - f }{s} +1 \rfloor \times \lfloor \frac{h +2p - f}{p} + 1 \rfloor \times c' ``` 其中$c\`$是卷积核的个数。 #### 二、深度学习框架中Conv1d、Conv2d 在像PyTorch、Tensorflow中,都有类似Conv1d、Conv2d和Conv3d的操作。这也都和卷积操作的维度有关,里面的参数都要定义好。例如如下的卷积操作: ```python self.convs = nn.Sequential( nn.Conv1d(in_channels=32, out_channels=16, kernel_size=5, stride=1, padding=0), nn.BatchNorm1d(16), nn.ReLU(inplace=True) ) ``` 这里面的参数要定义好,否则容易出错。我们将分别介绍。 Conv1d是一维卷积操作,它要求输入的数据是三维的,即: ```math \text{min batch size} \times \text{in channels number} \times L_{in} ``` 最终输出的参数也是三维的: ```math \text{min batch size} \times \text{out channels number} \times L_{out} ``` 这里的out_channels定义了将由几个卷积核来扫描,kernel_size则定义了每一个卷积核大小,都可以自有定义。最终,输出的min_batch_size不变,out_channels数量根据定义的参数来,而输出的width计算如下: ```math \lfloor \frac{L_{in} + 2p - f}{s} +1 \rfloor ``` 类似的,如果使用Conv2D做卷积操作,那么输入就是四维的: ```math N \times C_{in} \times H_{in} \times W_{in} ``` 这里的$N$是min batch size,$C\_{in}$是输入数据的通道数,$H\_{in}$是输入数据的高度,$W\_{in}$是输入数据的宽度。其输出也是四维的,根据定义的卷积核大小和数量得到的输出维度如下: ```math N \times C_{out} \times H_{out} \times W_{out} ``` 其中,$C\_{out}$是根据卷积核的数量定义的输出数据的通道数,因为一个卷积核只能扫描得到一个二维图。其中$H\_{out}$和$W\_{out}$的计算如下: ```math H_{out} = \lfloor \frac{H_{in} + 2p - f}{s} +1 \rfloor ``` ```math W_{out} = \lfloor \frac{W_{in} + 2p - f}{s} +1 \rfloor ```
相关博客
最热博客