# layer1(conv + relu + pool) # input:(bitch_size, 1, 48, 48), output(bitch_size, 64, 24, 24) self.conv1 = nn.Sequential( nn.Conv2d(1, 64, 3, 1, 1), nn.BatchNorm2d(num_features=64), # 归一化 nn.RReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) ) # layer2(conv + relu + pool) # input:(bitch_size, 64, 24, 24), output(bitch_size, 128, 12, 12) self.conv2 = nn.Sequential( nn.Conv2d(64, 128, 3, 1, 1), nn.BatchNorm2d(num_features=128), nn.RReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) ) # layer3(conv + relu + pool) # input: (bitch_size, 128, 12, 12), output: (bitch_size, 256, 6, 6) self.conv3 = nn.Sequential( nn.Conv2d(128, 256, 3, 1, 1), nn.BatchNorm2d(num_features=256), nn.RReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2) )
时间: 2023-10-02 14:11:15 浏览: 105
这段代码定义了三个卷积层,每个卷积层后面跟着一个批归一化层、RReLU 激活函数和最大池化层。具体来说,模型的结构如下:
1. 第一个卷积层(layer1):
- 输入是一个大小为 (batch_size, 1, 48, 48) 的张量,其中 batch_size 是批量大小。
- 该卷积层使用一个 3x3 的卷积核,将输入通道数从 1 增加到 64。
- 卷积核的步长为 1,填充为 1,保持输入和输出的尺寸一致。
- 然后应用批归一化,将通道数归一化为 64。
- 接下来使用 RReLU 激活函数对特征图进行非线性变换。
- 最后进行最大池化,使用 2x2 的池化窗口,步长为 2,将特征图的尺寸减半。输出的特征图大小为 (batch_size, 64, 24, 24)。
2. 第二个卷积层(layer2):
- 输入是上一层的输出,即大小为 (batch_size, 64, 24, 24) 的特征图。
- 该卷积层使用一个 3x3 的卷积核,将输入通道数从 64 增加到 128。
- 卷积核的步长为 1,填充为 1,保持输入和输出的尺寸一致。
- 然后应用批归一化,将通道数归一化为 128。
- 接下来使用 RReLU 激活函数对特征图进行非线性变换。
- 最后进行最大池化,使用 2x2 的池化窗口,步长为 2,将特征图的尺寸减半。输出的特征图大小为 (batch_size, 128, 12, 12)。
3. 第三个卷积层(layer3):
- 输入是上一层的输出,即大小为 (batch_size, 128, 12, 12) 的特征图。
- 该卷积层使用一个 3x3 的卷积核,将输入通道数从 128 增加到 256。
- 卷积核的步长为 1,填充为 1,保持输入和输出的尺寸一致。
- 然后应用批归一化,将通道数归一化为 256。
- 接下来使用 RReLU 激活函数对特征图进行非线性变换。
- 最后进行最大池化,使用 2x2 的池化窗口,步长为 2,将特征图的尺寸减半。输出的特征图大小为 (batch_size, 256, 6, 6)。
这些卷积层的作用是逐步提取输入图像的特征,通过多次卷积和池化操作,将输入图像的尺寸减小,并增加通道数,以获取更高级别的特征表示。这些特征表示将用于后续的全连接层进行分类。
阅读全文