我试图弄清楚如何计算每个输入的网络梯度。我有点迷路了。本质上,我想要的是为输入 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")