概要
PyTorchを使っていたら、
RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Double'
というエラーが発生して困った。
stackoverflowでこんな記事を見つけたが、いまいち何言ってるかよくわからない...(;゚Д゚)
という状況下で、原因を特定できたので共有しておこうという記事。
(日本語の記事がなかった)
原因
言葉で説明
pytorchのデータセットに渡す目的変数
が、「本来は整数値
じゃないといけないのに、浮動小数点数になっていた」場合に発生している模様。
コードで該当箇所を説明
私の場合は、多クラス分類タスクに対するモデルを実装していた。
そして、原因になっていた目的変数の作成箇所はここ。
datasetを作成している部分
x_train_val = torch.tensor(bow_train_val, dtype=torch.float32)
x_test = torch.tensor(bow_test, dtype=torch.float32)
t_tr_val_torch = torch.tensor(t_train_val_ndarray, dtype=torch.float64) # <- 分類問題なのに float64 を指定している
t_test_torch = torch.tensor(t_test_ndarray, dtype=torch.float64) # <-
dataset_train_val = torch.utils.data.TensorDataset(x_train_val, t_tr_val_torch)
dataset_test = torch.utils.data.TensorDataset(x_test, t_test_torch)
対策としては、こうするだけでOKでした!( ˙꒳˙ \三/ ˙꒳˙)/
※該当箇所を、torch.float64
-> torch.int64
へと変更。
datasetを作成している部分
x_train_val = torch.tensor(bow_train_val, dtype=torch.float32)
x_test = torch.tensor(bow_test, dtype=torch.float32)
t_tr_val_torch = torch.tensor(t_train_val_ndarray, dtype=torch.int64) # <- 分類問題なので int64 にした
t_test_torch = torch.tensor(t_test_ndarray, dtype=torch.int64) # <-
dataset_train_val = torch.utils.data.TensorDataset(x_train_val, t_tr_val_torch)
dataset_test = torch.utils.data.TensorDataset(x_test, t_test_torch)
最後に
おそらく、取り扱っているタスクによっては、必ずしもint64が正解ではないと思う。
けれども、少なくとも分類タスクなら、「目的変数は浮動小数点数ではない」はず。
そこを見直すと良さそう。(自戒)