首先,我认为损失计算和更新步骤之后没有更新,但是下面的代码给我带来了错误,这证明有更新:
before = list(model.parameters())[0].clone()
loss.backward()
optimizer.step()
after = list(model.parameters())[0].clone()
logging.info(torch.equal(before.data, after.data))
然后我想通过以下代码查看变化的幅度:
list(model.parameters())[0].grad
这给了我很小的改变:
tensor([[ 3.2294e-07, 7.3983e-06, 6.5637e-06, ..., -1.3529e-06,
2019-11-16T17:21:03.747068480Z -4.9979e-06, 4.9799e-06],
2019-11-16T17:21:03.747074966Z [ 5.5463e-08, 3.0771e-06, -9.5087e-07, ..., 1.9265e-06,
2019-11-16T17:21:03.747080687Z -4.5251e-06, -7.1564e-07].....]
这是我的模特:
self.lstm_hidden_dim = lstm_hidden_dim
self.lstm = nn.LSTM(word_embedding_dim,lstm_hidden_dim, num_layers=1,batch_first=False,bidirectional=True)
self.firstHidden = nn.Linear(lstm_hidden_dim*2, 300)
self.relu=nn.ReLU()
self.secondlinear=nn.Linear(300, score_space_size)
self.softmax= nn.LogSoftmax(dim=1)
损失函数和优化器:
loss_function = nn.NLLLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
任何想法,为什么毕业人数很少?
答案 0 :(得分:0)
您可以添加参数,以查看每次调用优化器时它们所更改的量。 因此,您可以使用类似这样的功能。
def read_params(self):
params=[]
names=[]
for name,param in self.lstm.named_parameters():
params.append(torch.sum(param.data).detach().cpu().numpy())
names.append(name)
return params, names
old_weights = np.array(nets.read_params()[0])
#some point later
new_weights = np.array(nets.read_params()[0])
print("weights updated",np.sum(np.abs(old_weights - new_weights)))
您还可以将学习率提高几个数量级,以查看是否有帮助。