卷积神经网络中卷积核参数计算和卷积操作理解

  1. 背景知识

    卷积神经网络中的卷积操作主要是由:卷积核大小(kearl_size),步长(stride),填充(padding)等决定,根据输入的特征图的in_channel的个数,尺寸以及卷积核大小,步长与填充的关系可以计算出卷积后输出的特征图的out_channel,大小等。

  2. 相关计算

    现在假设原图像的输入为in_channel * image_size * image_size,卷积操作的卷积核的大小为kearl_size,卷积的步长为stride,填充为padding,卷积核的个数为out_channel,以下给出计算出卷积操作后特征图的个数,大小,以及卷积操作的参数等。
    假设现在输入的图像是3 * 32 * 32(3代表的是channel的个数,32 * 32是图像的大小),卷积操作中的卷积核的大小kearl_size为7,padding为1,stride为3,卷积核的个数conv_num为64,求卷积操作后图像的大小,卷积后的特征图的个数,以及卷积核的参数?

  • 卷积操作后图像的尺寸计算
    由公式得卷积后的图像的尺寸为:after_size=(image_size+2 * padding-keral_size)/stride+1
    那么卷积后的图像尺寸为:(32+2 * 1-7)/3+1=10
  • 卷积操作后特征图的feature maps个数(其实也是out_channel)计算
    输出的特征图的个数就是卷积核的个数 64
  • 卷积核的参数计算
    由卷积操作知,卷积核的大小为64 * 3 * 7 * 7,其中64是输出的通道out_channel,3是输入通道in_channel,7乘7是卷积核的大小,那么一般的卷积核的大小为:out_channel * in_channel * size * size,往往卷积操作是共享一个卷积核,同时共享一个bias,那么一个卷积核所含的参数为:3 * 7 * 7+1,那么64个卷积核所含的参数的个数为:64 * (3 * 7 * 7+1),一般的计算为:卷积核的参数个数:out_channel * (in_channel * keral_size * keral_size+bias)
  1. 卷积操作的正确打开方式
    直接上图:
    卷积神经网络中卷积核参数计算和卷积操作理解_第1张图片
  2. 代码实现
'''
@copyright :Allen 2019/8/29
'''
import torch
from torch import nn
from torch.autograd import Variable
#定义一个简单的卷积类,conv,里面包含一个卷积操作
class conv(nn.Module):
    """
    in_channel:输入图像的channel的大小
    out_channel:卷积核的个数也是输出的图像的个数
    size:卷积核的大小
    std:卷积核移动的步长
    padding:填充的的大小
    """
    def __init__(self,in_channel,out_channel,size,std,pad):
        super(conv, self).__init__()
        self.net=nn.Conv2d(in_channel,out_channel,kernel_size=size,stride=std,padding=pad)

    def forward(self, x):
        x=self.net(x)
        return x

#输入的大小,1*3*32*32,注意此时pytorch接受的输入是4维的格式数据
# 其中1*3*32*32中的1表示batch size的大小,此处为1,代表的是一张图片
input=Variable(torch.randn([1,3,32,32]))
conv_layer=conv(3,64,7,3,1)
output=conv_layer(input)
print(output.shape)

输出结果:
torch.Size([1, 64, 10, 10])

你可能感兴趣的:(深度学习)