web-dev-qa-db-ja.com

Pytorch:FloatTensorをDoubleTensorに変換

TensorDatasetオブジェクトを使用するためにテンソルに変換する2つのnumpy配列があります。

import torch.utils.data as data_utils

X = np.zeros((100,30))
Y = np.zeros((100,30))

train = data_utils.TensorDataset(torch.from_numpy(X).double(), torch.from_numpy(Y))
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)

私がする時:

for batch_idx, (data, target) in enumerate(train_loader):
    data, target = Variable(data), Variable(target)
    optimizer.zero_grad()
    output = model(data)               # error occurs here

休憩エラーが発生します:

TypeError:addmm_は無効な引数の組み合わせを受け取りました-(int、int、torch.DoubleTensor、torch.FloatTensor)を取得しましたが、次のいずれかを予期していました:[...]
[.____。
[.____。

最後のエラーの原因は次のとおりです。

output.addmm_(0、1、input、weight.t())

私のコードでわかるように、.double()を使用してテンソルを変換しようとしましたが、これは機能しませんでした。なぜ彼は1つの配列をFloatTensorオブジェクトに、もう1つの配列をDoubleTensorにキャストするのですか?何か案は?

12
N8_Coder

numpy配列は64-bit floating pointであり、標準でtorch.DoubleTensorに変換されます。ここで、モデルでそれらを使用する場合、モデルパラメーターもDoubleであることを確認する必要があります。または、モデルパラメータは標準的にnumpyとしてキャストされるため、Float配列がfloatとしてキャストされることを確認する必要があります。

したがって、次のいずれかを実行します。

data_utils.TensorDataset(torch.from_numpy(X).float(), torch.from_numpy(Y).float())

または行う:

model.double()

モデルのパラメーター、入力、およびターゲットをFloatまたはDoubleとしてキャストする場合は、除外します。

13
mexmex

これは、PyTorchでは、異なるタイプのTensor間で操作を実行できないためです。 dataDoubleTensorですが、モデルパラメーターはFloatTensorです。そのため、このエラーメッセージが表示されます。 @mexmexが言ったように、dataFloatTensorに変換して、モデルパラメータータイプに準拠させます。

他の方法で回避しないでください!モデルをダブルに変換しようとすると、 GPUは倍精度の計算が苦手なので、PyTorch devs また、深層学習には浮動小数点で十分です。

5
jdhao