主要是参考这里,写的很好PyTorch 入门实战(四)——利用Torch.nn构建卷积神经网络
- 卷积层nn.Con2d()
常用参数
- in_channels:输入通道数
- out_channels:输出通道数
- kernel_size:滤波器(卷积核)大小,宽和高相等的卷积核可以用一个数字表示,例如kernel_size=3;否则用不同数字表示,例如kernel_size=(5,3)
- stride : 表示滤波器滑动的步长
- padding:是否进行零填充,padding=0表示四周不进行零填充,padding=1表示四周进行1个像素点的零填充
- bias:默认为True,表示使用偏置
举个例子,构建一个输入通道为3,输出通道为64,卷积核大小为3x3,四周进行1个像素点的零填充的conv1层:
- class testNet(nn.Module):
- def __init__(self, num_classes=10):
- super(testNet, self).__init__()
- #定义自己的网络
- self.conv1 = nn.Conv2d(3,64,kernel_size=3,padding=1)
-
- def forward(self,x):
- #定义自己的前向传播方式
- out = self.conv1(x)
- return out
这里卷积层的输入维度应该是 (Batch, Number Channels, height, width).
- 池化层
最大值池化nn.MaxPool2d()和均值池化nn.AvgPool2d()
常用参数
kernel_size、stride、padding在卷积层部分定义和这里一样
举个例子,构建一个卷积核大小为2x2,步长为2的pool1层,并且加入到forward中:
- class testNet(nn.Module):
- def __init__(self, num_classes=10):
- super(testNet, self).__init__()
- #定义自己的网络
- self.conv1 = nn.Conv2d(3,64,kernel_size=3,padding=1)
- self.pool1 = nn.MaxPool2d(kernel_size=2,stride=2)
-
- def forward(self,x):
- #定义自己的前向传播方式
- out = self.conv1(x)
- out = self.pool1(out)
- return out
事实上,池化层可以不必紧跟在卷积层之后,中间可以加入激活层和BatchNorm层,甚至可以在多个卷积操作后添加池化操作
批标准化层nn.BatchNorm2d()
激活函数nn.ReLU()