使用pytoch实现
1.卷积神经网络
conv2d的参数很简单
conv2d(input_channels, output_channels,kernel_size, stride, padding)
参数分别是输入通道,输出通道,卷积核大小,移动步长,填充数量。
输入通道是特征图的深度,输出通道是输出特征图的深度,卷积核大小一般取值1,3,5,7;
移动步长就是卷积核在特征图上每次移动的长度,取值不一样就会导致特征图的大小不一样,比如取值为2,则特征图会变得只有原图的一半大小。
如果想要特征图输出保持原本的大小,则需要在stride=1的前提下,padding = 0,建议padding的取值等于padding = stride/2向上取整。
2.残缺网络
resnet是一系列残缺网络结合起来的,其架构如图所示,
class ResLayer(nn.Module):
def __init__(self,inputChannels, outputChannels, kernelSize, strides):
super().__init__()
paddings = int(kernelSize/2)
self.convKernel_1 = nn.Conv2d(in_channels= inputChannels,out_channels=outputChannels,
kernel_size=kernelSize, stride=1, padding=paddings)
self.convKernel_2 = nn.Conv2d(in_channels= outputChannels,
out_channels=outputChannels, kernel_size=kernelSize, stride=strides, padding=paddings)
self.bn = nn.BatchNorm2d(outputChannels)
self.activation = nn.ReLU()
self.conv = nn.Conv2d(in_channels= inputChannels, out_channels=outputChannels,
kernel_size=1, stride=strides, padding=0)
def forward(self, inputs):
x = self.convKernel_1(inputs)
x = self.bn(x)
x = self.activation(x)
x = self.convKernel_2(x)
x = self.bn(x)
x = self.activation(x)
X = self.conv(inputs)
x = x + X
return x
这个残差网络第一层的stride=1,第二层的stride=2,因此到输出时,特征图为原来的一半,所有当输出x与输入的特征图X相加时,旁边有一个卷积核大小为1*1的卷积层,stride=2,padding=0,到输出的时候才能匹配好维度。