RuntimeError:预期的标量类型 Double 但发现 Float

Posted

技术标签:

【中文标题】RuntimeError:预期的标量类型 Double 但发现 Float【英文标题】:RuntimeError: expected scalar type Double but found Float 【发布时间】:2021-07-10 05:33:00 【问题描述】:

我是 PyTorch 的新手,我从我的 cnn 层收到以下错误:“RuntimeError: expected scalar type Double but found Float”。我将每个元素转换为.astype(np.double),但错误消息仍然存在。然后在转换Tensor 后尝试使用.double() 并再次出现错误消息。 这是我的代码以便更好地理解:

import torch.nn as nn
class CNN(nn.Module):
    
    # Contructor
    def __init__(self, shape):
        super(CNN, self).__init__()
        self.cnn1 = nn.Conv1d(in_channels=shape, out_channels=32, kernel_size=3)
        self.act1 = torch.nn.ReLU()
    # Prediction
    def forward(self, x):
        x = self.cnn1(x)
        x = self.act1(x)
    return x
    
    X_train_reshaped = np.zeros([X_train.shape[0],int(X_train.shape[1]/depth),depth])
    
    for i in range(X_train.shape[0]):
        for j in range(X_train.shape[1]): 
            X_train_reshaped[i][int(j/3)][j%3] = X_train[i][j].astype(np.double)
    
    X_train = torch.tensor(X_train_reshaped)
    y_train = torch.tensor(y_train)
    
    # Dataset w/o any tranformations
    train_dataset_normal = CustomTensorDataset(tensors=(X_train, y_train), transform=None)
    train_loader = torch.utils.data.DataLoader(train_dataset_normal, shuffle=True, batch_size=16)
    
    model = CNN(X_train.shape[1]).to(device)
    
    # Loss and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters())
    
    # Train the model
    #how to implement batch_size??
    for epoch in range(epochno):
        #for i, (dataX, labels) in enumerate(X_train_reshaped,y_train):
        for i, (dataX, labels) in enumerate(train_loader):
            dataX = dataX.to(device)
            labels = labels.to(device)
            
            # Forward pass
            outputs = model(dataX)
            loss = criterion(outputs, labels)
            
            # Backward and optimize
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            if (i+1) % 100 == 0:
                print ('Epoch [/], Step [/], Loss: :.4f' 
                       .format(epoch+1, num_epochs, i+1, total_step, loss.item()))

以下是我收到的错误:

RuntimeError                              Traceback (most recent call last)
<ipython-input-39-d99b62b3a231> in <module>
     14 
     15         # Forward pass
---> 16         outputs = model(dataX.double())
     17         loss = criterion(outputs, labels)
     18 

~\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
    887             result = self._slow_forward(*input, **kwargs)
    888         else:
--> 889             result = self.forward(*input, **kwargs)
    890         for hook in itertools.chain(
    891                 _global_forward_hooks.values(),

<ipython-input-27-7510ac2f1f42> in forward(self, x)
     22     # Prediction
     23     def forward(self, x):
---> 24         x = self.cnn1(x)
     25         x = self.act1(x)

~\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
    887             result = self._slow_forward(*input, **kwargs)
    888         else:
--> 889             result = self.forward(*input, **kwargs)
    890         for hook in itertools.chain(
    891                 _global_forward_hooks.values(),

~\torch\nn\modules\conv.py in forward(self, input)
    261 
    262     def forward(self, input: Tensor) -> Tensor:
--> 263         return self._conv_forward(input, self.weight, self.bias)
    264 
    265 

~\torch\nn\modules\conv.py in _conv_forward(self, input, weight, bias)
    257                             weight, bias, self.stride,
    258                             _single(0), self.dilation, self.groups)
--> 259         return F.conv1d(input, weight, bias, self.stride,
    260                         self.padding, self.dilation, self.groups)
    261 

RuntimeError: expected scalar type Double but found Float

【问题讨论】:

【参考方案1】:

我不知道是我还是 Pytorch,但错误消息试图以某种方式转换为浮点数。因此,在forward pass 内部,我通过将dataX 转换为float 解决了这个问题,如下所示:outputs = model(dataX.float())

【讨论】:

【参考方案2】:

同意aysebilgegunduz。应该是 Pytorch 的问题,我也遇到同样的错误信息。

只需将类型更改为其他类型即可解决问题。

您可以通过以下方式检查输入张量的类型:

data.type()

一些有用的改变类型的功能:

data.float()
data.double()
data.long()

【讨论】:

以上是关于RuntimeError:预期的标量类型 Double 但发现 Float的主要内容,如果未能解决你的问题,请参考以下文章

pytorch RuntimeError: 标量类型 Double 的预期对象,但得到标量类型 Float

通过 DataLoader (PyTorch) 迭代:RuntimeError: 标量类型 unsigned char 的预期对象但序列元素 9 的标量类型浮点数

RuntimeError:预期的标量类型 Long 但发现 Float

RuntimeError:预期的标量类型为 Double 的对象,但在调用 _th_max 时为参数 #2 'other' 获得了标量类型 Float

Pytorch RuntimeError:参数#1 'indices' 的预期张量具有标量类型 Long;但得到了 CUDAType

Pytorch RuntimeError:预期的标量类型 Float 但找到了字节