python - "RuntimeError: expected scalar type Double but found Float"在 Pytorch CNN 训练中

标签 python deep-learning pytorch tensor scalar

我刚刚开始学习 Pytorch 并创建了我的第一个 CNN。数据集包含 3360 张 RGB 图像,我将它们转换为 [3360, 3, 224, 224]张量。数据和标签在dataset(torch.utils.data.TensorDataset) .下面是训练代码。

    def train_net():
        dataset = ld.load()
        data_iter = Data.DataLoader(dataset, batch_size=168, shuffle=True)
        net = model.VGG_19()
        summary(net, (3, 224, 224), device="cpu")
        loss_func = nn.CrossEntropyLoss()
        optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9, dampening=0.1)
        scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)
        for epoch in range(5):
            print("epoch:", epoch + 1)
            train_loss = 0
            for i, data in enumerate(data_iter, 0):
                x, y = data
                print(x.dtype)
                optimizer.zero_grad()
                out = net(x)
                loss = loss_func(out, y)
                loss.backward()
                optimizer.step()
                train_loss += loss.item()
                if i % 100 == 99:
                    print("loss:", train_loss / 100)
                    train_loss = 0.0
        print("finish train")
然后我有这个错误:
    Traceback (most recent call last):
              File "D:/python/DeepLearning/VGG/train.py", line 52, in <module>
                train_net()
              File "D:/python/DeepLearning/VGG/train.py", line 29, in train_net
                out = net(x)
              File "D:\python\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
                result = self.forward(*input, **kwargs)
              File "D:\python\DeepLearning\VGG\model.py", line 37, in forward
                out = self.conv3_64(x)
              File "D:\python\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
                result = self.forward(*input, **kwargs)
              File "D:\python\lib\site-packages\torch\nn\modules\container.py", line 117, in forward
                input = module(input)
              File "D:\python\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
                result = self.forward(*input, **kwargs)
              File "D:\python\lib\site-packages\torch\nn\modules\conv.py", line 423, in forward
                return self._conv_forward(input, self.weight)
              File "D:\python\lib\site-packages\torch\nn\modules\conv.py", line 419, in _conv_forward
                return F.conv2d(input, weight, self.bias, self.stride,
            RuntimeError: expected scalar type Double but found Float
我认为 x 有问题,我用 print(x.dtype) 打印了它的类型:
torch.float64
这是double而不是float。你知道怎么回事吗?谢谢你的帮助!

最佳答案

该错误实际上是指在 float32 中的 conv 层的权重默认情况下,调用矩阵乘法时。由于您的输入是 double (pytorch 中的 float64)而 conv 中的权重是 float所以你的情况的解决方案是:

def train_net():
    dataset = ld.load()
    data_iter = Data.DataLoader(dataset, batch_size=168, shuffle=True)
    net = model.VGG_19()
    summary(net, (3, 224, 224), device="cpu")
    loss_func = nn.CrossEntropyLoss()
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9, dampening=0.1)
    scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)
    for epoch in range(5):
        print("epoch:", epoch + 1)
        train_loss = 0
        for i, data in enumerate(data_iter, 0):
            x, y = data                        #      //_______________
            x = x.float()    # HERE IS THE CHANGE     \\
            print(x.dtype)
            optimizer.zero_grad()
            out = net(x)
            loss = loss_func(out, y)
            loss.backward()
            optimizer.step()
            train_loss += loss.item()
            if i % 100 == 99:
                print("loss:", train_loss / 100)
                train_loss = 0.0
    print("finish train")
这肯定会起作用

关于python - "RuntimeError: expected scalar type Double but found Float"在 Pytorch CNN 训练中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66074684/

相关文章:

machine-learning - 为什么对于同一问题,binary_crossentropy 和 categorical_crossentropy 给出不同的性能?

pytorch - torch.distributed.barrier() 如何工作

pytorch - CUDA 与 DataParallel : Why the difference?

recurrent-neural-network - 没有 MAX_LENGTH 的 AttentionDecoderRNN

python - 要检查 Pandas Dataframe 列是否为 TRUE/FALSE,如果为 TRUE,则检查另一列是否满足条件并生成具有值 PASS/FAIL 的新列

Python 2.7 SimlpeQueue 导入错误(错误?)

neural-network - 神经网络如何知道它从行动中获得了哪些奖励?

python - 如何从本地驱动器上传和保存大数据到Google Colaboratory?

python - 如何在 Python 中连接两个矩阵?

python - 使用护身符允许从 flask 中的单一路径使用 iframe