我无法理解批处理如何在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应用于每个样本?前向传播似乎只是相对于单个图像。
答案 0 :(得分:0)
实际上,网络对于批次是不可知的:该模型旨在对单个图片进行分类。
那为什么我们需要批量处理呢?
每个模型都有权重(又称参数),并且需要使用训练图像进行优化权重,以便模型可以尽可能正确地对图像进行分类。
通常使用Stochastic Gradient Descent (SGD)来执行此优化过程:我们使用权重的当前值对图像的批处理进行分类。使用当前模型所做的预测以及我们知道的预期预测(“标签”),我们可以计算权重的 gradient 并改进模型。