

以下のコード中のtorch.autograd.gradの偏微分の計算で，Noneになってしまいます．

torch.autograd.gradの中身を見ることが出来ませんので，偏微分の計算中に何かしら問題が起こっている？と思いますが，どうなっているかがいまだに不明です．

なお，torch.autograd.gradで用いられるlossとparams.values()はきちんと値が出力されます．

lossの例: `tensor(0.5828, grad_fn=<MseLossBackward0>) `

params.values()の例: `odict_values([Parameter containing: tensor([[-0.1331]],
requires_grad=True),`

何か知っている方がいらっしゃいましたら，ご教示頂きますと幸いです．

宜しくお願い致します．

[code]

                x = torch.rand(4, 1) * 4 * math.pi - 2 * math.pi
                y = torch.sin(x)
    
                optimizer.zero_grad()
    
                params = OrderedDict(model.named_parameters())
    
                for itr in range(1000):
                    
                    pred_y = model(x)
                    loss = nn.MSEloss(pred_y, y)
    
                    grads = torch.autograd.grad(loss, params.values(), create_graph=True, allow_unused=True)
    
[/code]

[code]

    class Net(nn.Module):
        def __init__(self, i_channel, o_channel, l_channel):
            super(Net, self).__init__()
            self.i_net = nn.Linear(i_channel, l_channel) # i_channel = 1, l_channel = 1
            self.l_net = nn.Linear(l_channel, l_channel) # l_channel = 1, l_channel = 1
            self.o_net = nn.Linear(l_channel, o_channel) # l_channel = 1, o_channel = 1
    
            nn.init.normal_(self.i_net.weight, -1.0, 1.0)
            nn.init.normal_(self.l_net.weight, -1.0, 1.0)
            nn.init.normal_(self.o_net.weight, -1.0, 1.0)
    
            self.relu = nn.ReLU()
        
        def forward(self, x):
            x = self.relu(self.i_net(x))
            x = self.relu(self.l_net(x))
            x = self.relu(self.o_net(x))
            return x
    
[/code]


CC BY-SA 4.0
2022-01-13T16:25:31.943
85673
2022-01-14T07:40:32.127
2022-01-13T16:26:30.247
3060
49011
question
python python3 機械学習 深層学習 pytorch
torch.autograd.gradが０またはNoneTypeになってしまう


すみません．

２つ目のNetクラス中のforwardの部分を直したら解決しました．

具体的には，出力層の最後の部分のReLU関数によって`grad = 0.0`が量産されていたので，取り除きました．

すなわち，

[code]

    def forward(self, x):
        x = self.relu(self.i_net(x))
        x = self.relu(self.l_net(x))
        x = self.relu(self.o_net(x))
        return x
    
[/code]

の出力層の部分のReLUを消しました．

[code]

    def forward(self, x):
        x = self.relu(self.i_net(x))
        x = self.relu(self.l_net(x))
        x = self.o_net(x)
        return x
    
[/code]

大変お騒がせ致しました．

回答に携わっていた方に感謝の意を申し上げます．


CC BY-SA 4.0
2022-01-14T07:40:32.127
85690
2022-01-14T07:40:32.127
49011
85673
answer