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にキャストするのですか?何か案は?
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
としてキャストする場合は、除外します。
これは、PyTorchでは、異なるタイプのTensor間で操作を実行できないためです。 data
はDoubleTensor
ですが、モデルパラメーターはFloatTensor
です。そのため、このエラーメッセージが表示されます。 @mexmexが言ったように、data
をFloatTensor
に変換して、モデルパラメータータイプに準拠させます。
他の方法で回避しないでください!モデルをダブルに変換しようとすると、 GPUは倍精度の計算が苦手なので、PyTorch devs また、深層学習には浮動小数点で十分です。