使用卷积神经网络时,需要明确卷积层输入输出的尺寸关系,计算公式如下。
这样抽象,举个例子,这是pytorch官方给出的手写字识别的网络结构:
3359 py torch.org/tutorials/beginner/blitz/neural _ networks _ tutorial.html # sphx-glr-beginner-blitz-nener
这里是网络结构图:
这是对应的代码:
importtorchimporttorch.nnasnnimporttorch.nn.functionalasfclassnet (nn.module ) : def __init__(self ) 333333330 6 output channels,5x5square convolution # kernel self.con v1=nn.conv 2d5) self.con v2=nn.conv 2d (6,16,5 ) anaffinv 120 )5*5fromimagedimensionself.fc2=nn.linear (120,84 ) self.fc3=nn.linear (84,10 ) defforward ) self,fcf 10 ) self 2) windowx=f.max_pool2d(f.relu ) self.conV1(x ),(2) ) # If the size is a square,youcanspecifywithasion 2 ) x=torch.flatten(x ) x,1 ) flattenalldimensionsexceptthebatchdimensionx=f.relu (self.fc1 ) x ) x=f.relu
第一个参数是输入通道数,第二个参数是输出通道数,第三个参数是卷积核大小。
torch.nn.conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1)
然后带着公式计算
H=(32 - 5 2 * 0)/1 1=28
W=(32 - 5 2 * 0)/1 1=28
D=6
折叠后尺寸为28、28、6
然后进行池化,x=f.max _ pool 2d (f.relu (self.con v1 (x ),2,2 ) )的池化,即每2x2个区域取一个值。 下图是最大池化的过程
此时,尺寸为(14、14、6 )
接着进行第2次卷积,输入尺寸(32、32、1 )的图像,对应的代码为self.conv2=nn.conv2d ) 6、16、5,带入公式进行计算
H=(14 - 5 2 * 0)/1 1=10
W=(14 - 5 2 * 0)/1 1=10
D=16
折叠后尺寸为[10、10、16]
然后进行第二次池化,是使用x=f.max _ pool 2d (f.relu (self.con v2 (x )、2 )、也(2、2 ) )的池化,池化后为) 5、5、16 )
即,与下一个所有连接层对应的输入self.fc1=nn.linear (16 *5* 5,120 )