1
1

[Python / PyTorch] RuntimeError: "nll_loss_forward_reduce_cuda_kernel_2d_index" not implemented for 'Double' の原因

Last updated at Posted at 2022-02-06

概要

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が正解ではないと思う。
けれども、少なくとも分類タスクなら、「目的変数は浮動小数点数ではない」はず。
そこを見直すと良さそう。(自戒)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1