pytorch “尝试第二次通过图进行反向传播”错误与字符级RNN

我正在使用pytorch训练一个字符级的GRU,并将文本分成一定长度的批次。这是训练循环:

for e in range(self.epochs):  self.model.train()  h = self.get_init_state(self.batch_size)    for batch_num in range(self.num_batch_runs):    batch = self.generate_batch(batch_num).to(device)        inp_batch = batch[:-1,:]    tar_batch = batch[1:,:]            self.model.zero_grad()    loss = 0    for i in range(inp_batch.shape[0]):      out, h = self.model(inp_batch[i:i+1,:],h)      loss += loss_fn(out[0],tar_batch[i].view(-1))              loss.backward()    nn.utils.clip_grad_norm_(self.model.parameters(), 5.0)    optimizer.step()        if not (batch_num % 5):      print("epoch: {}, loss: {}".format(e,loss.data.item()/inp_batch.shape[0]))

尽管如此,在第一个批次之后,我仍然遇到了这个错误:

Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.

提前感谢..


回答:

我自己找到了答案,GRU的隐藏状态仍然附着在最后一次批次运行上,因此需要使用以下方法断开连接:

h.detach_()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注