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])
こうすることで意図通りにパラメータを持つレイヤが認識され、学習や推論が可能となった。