Python 使用Pytorch进行深度学习:理解神经网络示例

Python 使用Pytorch进行深度学习:理解神经网络示例,python,neural-network,pytorch,Python,Neural Network,Pytorch,我正在读这篇文章,我有几个关于介绍的神经网络的问题。本文档定义了以下网络: import torch import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 1 input image channel, 6 output cha

我正在读这篇文章,我有几个关于介绍的神经网络的问题。本文档定义了以下网络:

import torch
import torch.nn as nn
import torch.nn.functional as F

    class Net(nn.Module):

        def __init__(self):
            super(Net, self).__init__()
            # 1 input image channel, 6 output channels, 3x3 square convolution
            # kernel
            self.conv1 = nn.Conv2d(1, 6, 3)
            self.conv2 = nn.Conv2d(6, 16, 3)
            # an affine operation: y = Wx + b
            self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)

        def forward(self, x):
            # Max pooling over a (2, 2) window
            x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
            # If the size is a square you can only specify a single number
            x = F.max_pool2d(F.relu(self.conv2(x)), 2)
            x = x.view(-1, self.num_flat_features(x))
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x

        def num_flat_features(self, x):
            size = x.size()[1:]  # all dimensions except the batch dimension
            num_features = 1
            for s in size:
                num_features *= s
            return num_features
随后,作出以下声明:

让我们尝试一个32x32的随机输入。注:该网络(LeNet)的预期输入大小为32x32。要在MNIST数据集上使用此网络,请将数据集中的图像调整为32x32

问题1:为什么图像需要是32x32(我假设这意味着32像素乘以32)

第一次卷积将六个内核应用于图像,每个内核为3x3。这意味着,如果输入通道为32x32,则六个输出通道的尺寸均为30x30(3x3内核网格使您在宽度和高度上损失2个像素)。第二次卷积应用了更多的内核,因此现在有16个输出通道,尺寸为28x28(同样,3x3内核网格使您在宽度和高度上损失了2个像素)。现在我希望下一层有16x28x28个节点,因为16个输出通道中的每一个都有28x28个像素。不知何故,这是不正确的,下一层包含16x6个节点。为什么这是真的

问题2:第二个卷积层从六个输入通道到十六个输出通道。这是怎么做到的


在第一个卷积层,我们从一个输入通道到六个输入通道,这对我来说很有意义。您只需将六个内核应用于单个输入通道,即可获得六个输出通道。从六个输入通道到十六个输出通道对我来说没有多大意义。不同的内核是如何应用的?您是否将两个内核应用于前五个输入通道以获得十个输出通道,并将六个内核应用于最后一个输入通道,从而使总数达到十六个输出通道?还是神经网络会自己学习使用x核并将其应用于它认为最合适的输入通道?

我现在可以自己回答这些问题了

<强>问题1:看为什么你需要一个32×32的图像用于这个神经网络工作,考虑如下:

第1层: 首先,卷积应用于3x3内核。由于图像的尺寸为32x32,因此将生成30x30的网格。接下来,将最大池应用于网格,使用2x2内核和2的步长生成一个尺寸为15x15的网格

第二层: 首先,卷积与3x3内核一起应用于15x15网格,形成13x13网格。接下来,使用2x2内核应用最大池,步长为2,生成一个尺寸为6x6的网格。我们得到的是6x6网格,而不是7x7网格,因为默认情况下使用的是楼层功能,而不是ceil功能

由于第2层中的卷积有16个输出通道,因此第一个线性层需要16x6个节点!我们看到,所需的输入实际上是一个32x32图像

问题2:每个输出通道都是通过对每个输入通道应用六个不同的内核并对结果求和而创建的。这一点在本节中进行了解释