火炬和批次

时间:2020-10-26 22:24:07

标签: pytorch

我无法理解批处理如何在Pytorch框架中发挥作用。

在此模型中:

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()

        # 28x28x1 => 26x26x32
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3)
        self.d1 = nn.Linear(26 * 26 * 32, 128)
        self.d2 = nn.Linear(128, 10)

    def forward(self, x):
        # 32x1x28x28 => 32x32x26x26
        x = self.conv1(x)
        x = F.relu(x)

        # flatten => 32 x (32*26*26)
        x = x.flatten(start_dim = 1)
        #x = x.view(32, -1)

        # 32 x (32*26*26) => 32x128
        x = self.d1(x)
        x = F.relu(x)

        # logits => 32x10
        logits = self.d2(x)
        out = F.softmax(logits, dim=1)
        return out

在前向定义中,我们传入一些x,即。从DataLoader批处理中聚合图像。在此,32x1x28x28维度表示一个批次中有32张图像。我们是否只是忽略了这一事实,而Pytorch则将Conv2d应用于每个样本?前向传播似乎只是相对于单个图像。

1 个答案:

答案 0 :(得分:0)

实际上,网络对于批次是不可知的:该模型旨在对单个图片进行分类。

那为什么我们需要批量处理呢?
每个模型都有权重(又称参数),并且需要使用训练图像进行优化权重,以便模型可以尽可能正确地对图像进行分类。
通常使用Stochastic Gradient Descent (SGD)来执行此优化过程:我们使用权重的当前值对图像的批处理进行分类。使用当前模型所做的预测以及我们知道的预期预测(“标签”),我们可以计算权重的 gradient 并改进模型。

相关问题