0

各入力のネットワークの勾配を計算する方法を理解しようとしています。そして、私は少し迷っています。基本的に、私が望むのは、入力 x のすべての値に対して d self.output/d weight1 と d self.output/d weight2 を計算することです。したがって、たとえば、サイズ (1000, 5) のマトリックスがあります。1000 は入力 x のサイズ、5 はレイヤー内の重みの数です。

以下に示した例では、重みをサイズ (1,5) として返します。ここで計算されているのは正確には何ですか?これは x の 1 つの入力に対する d self.output/ d weight1 ですか、それともすべての入力の平均ですか?

次に、features.grad と weight1.grad の matmul は、私が求めているものと同じでしょうか? x のすべての値に対する weight1 のすべての勾配の行列。

class Network(torch.nn.Module):

    def __init__(self, iNode, hNode, oNode):
        super(Network, self).__init__()

        print("Building Model...")

        iNode = int(iNode) ; self.iNode = iNode
        hNode = int(hNode) ; self.hNode = hNode
        oNode = int(oNode) ; self.oNode = oNode

        self.fc1 = nn.Linear(iNode, hNode, bias=False)
        self.fc2 = nn.Linear(hNode, oNode, bias=False)

    def forward(self, x):
        self.hidden_probs = self.fc1(x)
        self.hidden = self.actFunc1(self.hidden_probs)
        self.output_probs = self.fc2(self.hidden)
        self.output = self.actFunc2(self.output_probs)
        return self.output

    def actFunc1(self, x):
        return 1.0/(1.0+torch.exp(-x))

    def actFunc2(self, x):
        return x

    def trainData(self, features, labels, epochs, alpha, optimisation, verbose=False):

        for epoch in range(0,epochs):
            net_pred = self.forward(features)
            net_pred.backward(gradient=torch.ones(features.size())) #calc. dout/dw for all w
print(features.grad.size()) #returns (1000,1)



            with torch.no_grad():
                for name, param in self.named_parameters():
                    if(param.requires_grad):
                        param -= alpha*param.grad

                for name, param in self.named_parameters():
                    if(param.requires_grad):
                        param.grad.zero_()


            sys.stdout.write("Epoch: %06i\r" % (epoch))
            sys.stdout.flush()
        sys.stdout.write("\n")


4

1 に答える 1