python - PyTorch:尝试第二次向后遍历图形,但缓冲区已被释放
问题描述
我的模型是:
class BaselineModel(nn.Module):
def __init__(self, feature_dim=5, hidden_size=5, num_layers=2, batch_size=32):
super(BaselineModel, self).__init__()
self.num_layers = num_layers
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size=feature_dim,
hidden_size=hidden_size, num_layers=num_layers)
def forward(self, x, hidden):
lstm_out, hidden = self.lstm(x, hidden)
return lstm_out, hidden
def init_hidden(self, batch_size):
hidden = Variable(next(self.parameters()).data.new(
self.num_layers, batch_size, self.hidden_size))
cell = Variable(next(self.parameters()).data.new(
self.num_layers, batch_size, self.hidden_size))
return (hidden, cell)
我的训练循环如下所示:
for epoch in range(250):
hidden = model.init_hidden(13)
# hidden = (torch.zeros(2, 13, 5),
# torch.zeros(2, 13, 5))
# model.hidden = hidden
for i, data in enumerate(train_loader):
inputs = data[0]
outputs = data[1]
print('inputs', inputs.size())
# print('outputs', outputs.size())
optimizer.zero_grad()
model.zero_grad()
# print('inputs', inputs)
pred, hidden = model(inputs, hidden)
loss = loss_fn(pred[0], outputs)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 0.5)
optimizer.step()
我似乎度过了第一个时代,然后看到这个错误:RuntimeError: 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.
我看过有关它的帖子,但就我而言,我正在hidden
为每批重新初始化我的。
解决方案
model.init_hidden(13)
必须在批处理循环中,而不是 epoch 循环中
推荐阅读
- c# - 识别 Web 应用程序机器人上的自适应卡片点击
- ansible - 无法使用 if 条件解析 jinja 文件中的 ansible 变量
- r - 使用 YAML 设置参数 IN YAML 标头 Knitr 和参数
- google-bigquery - 大查询命令行执行多个sql文件
- python - 用于 Google 上长时间任务的 Cloud Functions 替代方案
- c# - 无法在 linq 语句中使用 ViewBag 或任何其他动态变量
- javascript - 如何从javascript中的url读取静态文件以创建数组
- python - 使用 selenium Python 检索 Google 趋势数据中的所有元素
- postgresql - 如何诊断失败的 AWS Database Migration Service 任务?
- java - 仅在上一个方法完成成功后调用方法