以一个更加实际的情况为例
如上图中所列参数,x为1(假设batch为1)张图片、3个通道(对应于RGB三个通道)、28*28的大小。而kernel中的3代表对input的x上的三个通道上均进行卷积运算。而multi-kernels中的16泛指包括了blur、edge等16个功能、3代表对每一个通道上的逐渐进行卷积运算。
因此这里原图片所滑动的框体与kernel进行相乘运算,得到的数值进行累加得到一个数值输出到feature map。
以之前的LeNet-5结构为例
C1上的6代表使用了6个kernels,28*28的size与之前原图片的size一致。由C3的结果可知第二层的kernel为[16, 6, 3, 3],bias为16。这里要求可以从结果逆推出bias和kernel的参数值。
那么这种持续的叠加会输出什么结果呢,如下所示
最初的小汽车经过多个卷积层后依次输出的结果如上,神经网络会从这上面提取到不同的特征结构。这里一般认为第一层的feature map上得到的是一些低维的特征(整体模型、颜色、角度等),第二层的feature map上得到的是一些高维的特征(如棱形结构等),更高层的feature map上会得到一些更高维的特征(如汽车的轮胎结构、车窗位置等)。
总而言之,通过不断地卷积,可以持续提取到不同的特征。
那么在pytorch中,是如何实现这种代码的编写?
# 这种神经网络结构的编写要用到nn.Conv2d
# 该API意为进行2D的函数卷积层计算
import torch
import torch.nn as nn
layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=0)
# 1代表这里假设一张黑白图片,3代表kernel的数量,另外设置kernel size为3,步长为1,不打补丁
x = torch.rand(1, 1, 28, 28)
# 随机代入数据到x
out = layer.forward(x)
# 进行一次卷积的前向运算
print(out.size())
# 输出结果的size查看一下
输出为
torch.Size([1, 3, 26, 26])
这里不进行打padding操作,则输出的size减少
本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!