繁体   English   中英

匹配 PyTorch 张量维度

[英]matching PyTorch tensor dimensions

目前,我在训练函数中的张量维数方面存在一些问题。 我使用的是 MNIST 数据集,因此有 10 个可能的目标,并且最初使用 10 的训练批次大小编写原型代码,回想起来这不是最明智的选择。 它在一些早期的测试中给出了糟糕的结果,增加训练迭代次数也没有任何好处。 在尝试增加批量大小后,我意识到我写的内容并不那么通用,而且我可能从未在正确的数据上对其进行过训练。 下面是我的训练函数:

def Train(tLoops, Lrate):
    for _ in range(tLoops):
        tempData = train_data.view(batch_size_train, 1, 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, 1, 1, 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 是否提供了删除这些的方法? 我在文档中找不到任何内容,或者还有其他可能是我的问题吗?

您的训练脚本中有几个问题。 我将在下面逐一说明。

  1. 首先,您不应该手动进行数据批处理。 Pytorch/torchvision 有这方面的功能,使用数据集和数据加载器: https ://pytorch.org/tutorials/recipes/recipes/loading_data_recipe.html。

  2. 您也不应该手动更新网络参数。 使用优化器: https : //pytorch.org/docs/stable/optim.html 在您的情况下,没有动量的 SGD 将具有相同的效果。

  3. 您输入的维度似乎是错误的,对于 MNIST,如果您正在训练 MLP,则输入张量应该是 (batch_size, 1, 28, 28) 或 (batch_size, 784)。 此外,您的网络的输出应该是 (batch_size, 10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM