前提・実現したいこと
PyTorchを利用して強化学習のAIを作成しています。楽観的初期化を実装しようとしているのですが、
そうしようとすると
Warning: Error detected in MmBackward. Traceback of forward call that caused the error: File "C:\Users(ユーザー名)\Documents\MyFolder\CardBattle2\CardBattle\Agent_DQN.py", line 102, in <module> out = Model_Target(torch.ones(DQNModel.Inputs,device=Devise)) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 550, in __call__ result = self.forward(*input, **kwargs) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\container.py", line 100, in forward input = module(input) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 550, in __call__ result = self.forward(*input, **kwargs) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\linear.py", line 87, in forward return F.linear(input, self.weight, self.bias) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\functional.py", line 1612, in linear output = input.matmul(weight.t()) (print_stack at ..\torch\csrc\autograd\python_anomaly_mode.cpp:60) Traceback (most recent call last): File "C:\Users(ユーザー名)\Documents\MyFolder\CardBattle2\CardBattle\Agent_DQN.py", line 249, in <module> loss.backward(retain_graph=Need_Retain) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\tensor.py", line 198, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\autograd\__init__.py", line 100, in backward allow_unreachable=True) # allow_unreachable flag RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [64, 5]], which is output 0 of TBackward, is at version 21; expected version 19 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!
というエラーが発生しました。
どうすれば解決できるでしょうか?
よろしくお願いします。
該当のソースコード
問題になっている箇所を抜き出しています。
Agent_DQN.py
Python
1import torch 2import torch.optim as optim 3import DQNModel 4 5#問題の箇所を確認するための設定 6torch.autograd.set_detect_anomaly(True) 7 8#更新対象となるネットワーク 9Devise = "cuda" if torch.cuda.is_available() else "cpu" 10Model = DQNModel.Model.to(Devise) 11 12#更新を計算するためのモデル 13Model_Target = DQNModel.Model.to(Devise) 14optimizer = optim.Adam(DQNModel.Model.parameters(),lr=0.001,weight_decay=0.005) 15 16Model.train(True) 17Model_Target.train(True) 18#楽観的初期化の回数 19StartInitializeTimes = 10 20Need_Retain_First = True 21 22for i in range(StartInitializeTimes): 23 target = torch.ones(DQNModel.Outputs,dtype=torch.float32,device=Devise) 24 out = Model_Target(torch.ones(DQNModel.Inputs,device=Devise)) 25 loss = criterion(out,target) 26 optimizer.zero_grad() 27 loss.backward(retain_graph=Need_Retain_First) 28 Need_Retain_First = False 29 optimizer.step()
DQNModel.py
Python
1#coding: "utf-8" 2import torch.nn as nn 3import torch.nn.functional as F 4 5Inputs = 1664 6Outputs = 5 7#学習に使用するモデル 8Model = nn.Sequential( 9 nn.Linear(in_features=Inputs,out_features=64), 10 nn.LeakyReLU(), 11 nn.Linear(in_features=64,out_features=64), 12 nn.LeakyReLU(), 13 nn.Linear(in_features=64,out_features=Outputs) 14 )
発生している問題・エラーメッセージ
- Pytorchを利用して強化学習のAIを作成したい。
- そのために、楽観的初期化を実装したい。そのために、以下のソースコードを書いた。
Python
1#楽観的初期化の回数 2StartInitializeTimes = 10 3Need_Retain_First = True 4 5for i in range(StartInitializeTimes): 6 target = torch.ones(DQNModel.Outputs,dtype=torch.float32,device=Devise) 7 out = Model_Target(torch.ones(DQNModel.Inputs,device=Devise)) 8 loss = criterion(out,target) 9 optimizer.zero_grad() 10 loss.backward(retain_graph=Need_Retain_First) 11 Need_Retain_First = False 12 optimizer.step()
- しかし、以下のようなエラーが出ていて、実装できない。エラーを解決し、楽観的初期化を実装できるようにしたい。
Warning: Error detected in MmBackward. Traceback of forward call that caused the error: File "C:\Users(ユーザー名)\Documents\MyFolder\CardBattle2\CardBattle\Agent_DQN.py", line 102, in <module> out = Model_Target(torch.ones(DQNModel.Inputs,device=Devise)) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 550, in __call__ result = self.forward(*input, **kwargs) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\container.py", line 100, in forward input = module(input) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\module.py", line 550, in __call__ result = self.forward(*input, **kwargs) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\modules\linear.py", line 87, in forward return F.linear(input, self.weight, self.bias) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\nn\functional.py", line 1612, in linear output = input.matmul(weight.t()) (print_stack at ..\torch\csrc\autograd\python_anomaly_mode.cpp:60) Traceback (most recent call last): File "C:\Users(ユーザー名)\Documents\MyFolder\CardBattle2\CardBattle\Agent_DQN.py", line 249, in <module> loss.backward(retain_graph=Need_Retain) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\tensor.py", line 198, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph) File "C:\Users(ユーザー名)\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\autograd\__init__.py", line 100, in backward allow_unreachable=True) # allow_unreachable flag RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [64, 5]], which is output 0 of TBackward, is at version 21; expected version 19 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!
試したこと
以下のサイトを参考に、Agent_DQN.pyのoutに対してout = out.clone()
してからcriterion()
の引数に入れるようにしたり、DQNModel.pyのnn.LeakyReLU()
の引数にinplace=True
を指定してみましたが、同様のエラーが発生しました。
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [4, 512, 16, 16]], which is output 0 of ConstantPadNdBackward, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True). · Issue #23 · NVlabs/FUNIT
URL : https://github.com/NVlabs/FUNIT/issues/23
補足情報(FW/ツールのバージョンなど)
使用しているPC:Windows 10 Home
Pythonのバージョン:3.7.7
Pytorchのバージョン:1.5.0(GPU用)
CUDAのバージョン:10.2
使用しているGPU:NVIDIA GeForce RTX 2060
あなたの回答
tips
プレビュー