Python 未能理解pyTorch教程中的数据类型及其索引 上下文

Python 未能理解pyTorch教程中的数据类型及其索引 上下文,python,pytorch,tensor,torch,Python,Pytorch,Tensor,Torch,我正在努力理解pyTorch的基础知识,特别注意如何处理张量。我正在学习这些教程,但是,在其中一个教程中,我发现了一些我不清楚的细节 问题描述 我很难理解为什么在中有两种不同的方式应用argmax()函数。问题不在于函数本身,而在于它应用于输入数据的方式:变量以不同的方式被索引,我也不理解。这可能是因为我不明白输入数据是什么形状,即使尝试在计算机中进行实验,我也无法理解它。以下是使用argmax()的代码的第一部分: def test(dataloader, model): size

我正在努力理解pyTorch的基础知识,特别注意如何处理张量。我正在学习这些教程,但是,在其中一个教程中,我发现了一些我不清楚的细节

问题描述 我很难理解为什么在中有两种不同的方式应用
argmax()
函数。问题不在于函数本身,而在于它应用于输入数据的方式:变量以不同的方式被索引,我也不理解。这可能是因为我不明白输入数据是什么形状,即使尝试在计算机中进行实验,我也无法理解它。以下是使用
argmax()
的代码的第一部分:

def test(dataloader, model):
    size = len(dataloader.dataset)
    model.eval()
    test_loss, correct = 0, 0
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model(X)
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    test_loss /= size
    correct /= size
    print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

这里感兴趣的是计算正确猜测的数量。在这种情况下,在我看来,等式的右侧想要选取张量的第二个元素的参数(即argmax)的最大值,这是输入元素的预测标签。但是这里
print(pred.shape)
返回
torch.Size([64,10])
,所以我已经迷路了。

此外,在页面的最后一段代码中,应该显示数据集的单个样本及其预测,
argmax()
的用法如下:

classes = [
    "T-shirt/top",
    "Trouser",
    "Pullover",
    "Dress",
    "Coat",
    "Sandal",
    "Shirt",
    "Sneaker",
    "Bag",
    "Ankle boot",
]

model.eval()
x, y = test_data[0][0], test_data[0][1]
with torch.no_grad():
    pred = model(x)
    predicted, actual = classes[pred[0].argmax(0)], classes[y]
    print(f'Predicted: "{predicted}", Actual: "{actual}"')

在这里,我不明白为什么我们要以这种特定的方式编写
pred[0].argmax(0)
。我迷失在试图围绕数据类型和张量维度进行思考的过程中。

我想要什么 对上述语法的解释。也许给我提供一些关于张量和其他与这个问题相关的数据类型的例子/思维方式也会对我有很大帮助

到目前为止我所尝试的 我尝试在中进行实验,在最后一个代码块的末尾添加以下行:

    print(pred)
    print(pred[0])
    print(type(test_data))
    print(type(pred))
    print(pred.shape)
    print(test_data[0][0].shape)
    print(type(test_data[0]))
    print(type(test_data[0][0]))
这产生了:

tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.3538, 0.0000, 0.0000, 1.2093, 2.4238]])
tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.3538, 0.0000, 0.0000, 1.2093, 2.4238])
<class 'torchvision.datasets.mnist.FashionMNIST'>
<class 'torch.Tensor'>
torch.Size([1, 10])
torch.Size([1, 28, 28])
<class 'tuple'>
<class 'torch.Tensor'>
张量([[0.0000,0.0000,0.0000,0.0000,0.0000,1.3538,0.0000,0.0000,1.2093,2.4238])
张量([0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1.3538,0.0000,0.0000,1.2093,2.4238])
火炬尺寸([1,10])
火炬尺寸([1,28,28])


我为什么问这个问题 到目前为止,我在Stackoverflow上有很多愉快的经历,所以我宁愿先在这里询问,而不是创建一个新的帐户,并直接寻求关于Stackoverflow的帮助

谢谢大家!