使用Pytorch进行深度学习:了解神经网络示例 - python

我正在阅读Pytorch documentation,并且对引入的神经网络有几个问题。该文档定义了以下网络:

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个节点,因为十六个输出通道中的每个通道都有28x28像素。不知何故,这是不正确的,并且下一层包含16x6x6节点。为什么会这样呢?

问题2:第二个卷积层从六个输入通道变为十六个输出通道。怎么做?

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

参考方案

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

问题1:要了解为什么需要32x32的图像才能使该神经网络正常工作,请考虑以下事项:

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

第2层:
首先,将3x3内核的卷积应用于15x15网格,从而得到13x13网格。接下来,对2x2内核应用最大池化,步幅为2,从而生成尺寸为6x6的网格。我们得到的是6x6网格,而不是7x7网格,因为默认情况下使用的是floor函数,而不是ceil函数。

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

问题2:通过将六个不同的内核应用于每个输入通道并对其结果求和,可以创建每个输出通道。 documentation中对此进行了说明。

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…