如何解决匹配PyTorch张量尺寸
目前,在我的训练功能中,关于张量的维数存在一些问题。我正在使用MNIST数据集,因此有10个可能的目标,并且最初使用10个训练批处理量编写了原型代码,回想起来这不是最明智的选择。在某些较早的测试中,结果不佳,增加训练迭代次数没有任何好处。在尝试增加批处理大小之后,我意识到我所写的内容并不那么普遍,而且我很可能从未对正确的数据进行过培训。下面是我的训练功能:
def Train(tLoops,Lrate):
for _ in range(tLoops):
tempData = train_data.view(batch_size_train,1,-1)
output = net(tempData)
trainTarget = train_targets
criterion = nn.MSELoss()
print("target:",trainTarget.size())
print("Output:",output.size())
loss = criterion(output,trainTarget.float())
# print("error is:",loss)
net.zero_grad() # zeroes the gradient buffers of all parameters
loss.backward()
for j in net.parameters():
j.data.sub_(j.grad.data * Lrate)
打印功能返回的
target: torch.Size([100])
Output: torch.Size([100,10])
在计算损失的行上的错误消息之前;
RuntimeError: The size of tensor a (10) must match the size of tensor b (100) at non-singleton dimension 3
第一个打印目标是每个图像的相应地面真实值的一维列表。输出包含这100个样本中每个样本的神经网络输出,因此有一个10 x 100的列表,但是从先前将数据从28 x 28略读和重塑为1 x 784来看,我似乎不必要地拥有额外的维度。 PyTorch是否提供删除这些内容的方法?我在文档中找不到任何内容,或者还有其他可能是我的问题吗?
解决方法
您的训练脚本中有几个问题。我将在下面对它们中的每一个进行处理。
-
首先,您不应该手工进行数据批处理。 Pytorch / torchvision具有此功能,使用数据集和数据加载器:https://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html。
-
也不要手动更新网络参数。使用优化程序:https://pytorch.org/docs/stable/optim.html。在您的情况下,没有动力的SGD将具有相同的效果。
-
您输入的维数似乎是错误的,对于MNIST,如果要训练MLP,则输入张量应该为(batch_size,1,28,28)或(batch_size,784)。此外,您网络的输出应为(batch_size,10)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。