问题1:UnboundLocalError: local variable 'output' referenced before assignment
def train(category_tensor, line_tensor,line):
hidden = rnn.initHidden()
rnn.zero_grad()
for i in range(line_tensor.size()[0]):
output, hidden = rnn(line_tensor[i],hidden)
loss = criterion(output, category_tensor)
loss.backward()
grad_clipping(rnn, 1)
for p in rnn.parameters():
p.data.add_(p.grad.data, alpha=-learning_rate)
return output, loss.item()
在参考博客的代码上跑是没有问题的,查阅了一下循环内变量的作用域,for循环里赋值的output最后在循环外面仍然可以引用,除非没有被赋值。但是打印了output是有值的。因为一直在作用域的问题上纠结,直到一个下午过去后我才发现实际问题出现在后面,用var_exists = 'output' in locals()
确定了抽样的数据有问题(可能读入数据有问题)。
def train(category_tensor, line_tensor,line):
hidden = rnn.initHidden()
rnn.zero_grad()
for i in range(line_tensor.size()[0]):
output, hidden = rnn(line_tensor[i],hidden)
var_exists = 'output' in locals()
if var_exists == False:
print("fault %s"%line)
print(line_tensor)
loss = criterion(output, category_tensor)
loss.backward()
grad_clipping(rnn, 1)
for p in rnn.parameters():
p.data.add_(p.grad.data, alpha=-learning_rate)
return output, loss.item()
修改抽样函数
def randomTraindata():
def _choice(l):
return l[random.randint(0,len(l)-1)]
cate = _choice(categories)
lines = all_categories[cate]
line = None
while line == None or line == '':
line = _choice(lines)
lineTensor = _lineTensor(line)
cateTensor = torch.tensor([categories.index(cate)],dtype=torch.long)
return cate,line,cateTensor,lineTensor
问题2:参数调试