Engineering python pytorch tips

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

pytorchもしくはpytorchネイティブのライブラリ(pytorch lightningやmmdet etc.)などで学習を実行しようとしたら題記のエラーが発生し、学習することができなかった。pytorchの固有のエラーモードらしいので、解決策を明示する。

エラーの意味

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

pytorchには、テンソルの計算をCPUで行うのか、GPUで行うのか、モード指定することができる。入力データと各レイヤにおいては、そのモードをそろえる必要があるが、上記のエラーは入力データはGPUモードで入ってきているに対して、各モデルのレイヤはCPUモードで定義されているため、エラーになっている模様。

解決策1

基本的には、そろっていないモードをそろえればよいらしいので、以下のようにcpu実行になるように切り替える。またはgpu実行になるように切り替えることで、実行できる場合がある。

# We have to apply either ways below
# Change to gpu in data tensor
tensor = torch.tensor([1, 2, 3])
gpu_tensor = tensor.to('cuda')

# Change to gpu in model
model.cpu()

解決策2

上記では今回自分のエラーを解決することはできなかった。いろいろ調べてみると、pytorchでは、nn.Moduleをpythonのデフォルトのlistで使用すると、学習可能なパラメータを持っていたとしても、コンスタントなレイヤ(定数)として扱われてしまい、backward時に無視されてしまうらしい。なので、きちんと学習可能なパラメータであることをpytorchが認識できるようにnn.Sequencialや、nn.ModuleListなどで定義をする必要がある。

model = [self.conv2d, self.linear]
nn.ModuleList([self.conv2d, self.linear])

こうすることで意図通りにパラメータを持つレイヤが認識され、学習や推論が可能となった。

-Engineering, python, pytorch, tips
-, , ,