卷积神经网络cnn中,卷积核大小一般取1、3、5…,其通道数是与输入通道数相等的,卷积核大小加上通道数成为一个卷积核。卷积核数与输出通道数是相等的,且可以自定义,取决于自己的实验设置。
如果一个卷积核会有三个通道,每个卷积核对三个通道的图片卷积然后相加得到一个feature map(此时为一个二维矩阵)。
有一个动态图展示了其中的运算过程。原图出处
图中卷积核Fileter的个数与输出通道数Outout是对应的,每一个输出由多通道卷积累加并加上偏执Bias得到,一个卷积核只有一个偏执值。PyTorch框架对卷积运算Conv2d的描述亦是如此。
特地以PyTorch代码验证一下动图中的运算。关键函数conv2d()参见官方文档
import torch
import torch.nn.functional as F
import numpy
input = torch.FloatTensor([ [[[0, 1, 1, 2, 2], [0, 1, 1, 0, 0], [1, 1, 0, 1, 0], [1, 0, 1, 1, 1], [0, 2, 0, 1, 0]],
[[1, 1, 1, 2, 0], [0, 2, 1, 1, 2], [1, 2, 0, 0, 2], [0, 2, 1, 2, 1], [2, 0, 1, 2, 0]],
[[2, 0, 2, 0, 2], [0, 0, 1, 2, 1], [1, 0, 2, 2, 1], [2, 0, 2, 0, 0], [0, 0, 1, 1, 2]]] ])
weight = torch.FloatTensor([ [[[1, 1, -1], [-1, 0, 1], [-1, -1, 0]], [[-1, 0, -1], [0, 0, -1], [1, -1, 0]], [[0, 1, 0], [1, 0, 1], [0, -1, 1]]],
[[[-1, -1, 0], [-1, 1, 0], [-1, 1, 0]], [[1, -1, 0], [-1, 0, -1], [-1, 0, 0]], [[-1, 0, 1], [1, 0, 1], [0, -1, 0]]] ])
output = F.conv2d(input, weight=weight, bias=torch.FloatTensor([1,0]), padding=1, stride=2)
print(output)
输出结果:
tensor([[[[ 1., 0., -3.],
[-6., 1., 1.],
[ 4., -3., 1.]],
[[-1., -6., -4.],
[-2., -3., -4.],
[-1., -3., -3.]]]])
之所以输入/输出为四维,因为PyTorch默认需要mini-batch,这里batch = 1。
来源:CSDN
作者:co2e
链接:https://blog.csdn.net/qq_32789231/article/details/103896996