当前位置: 首页 > news >正文

深度学习:模型训练过程中Trying to backward through the graph a second time解决方案

1 问题描述

在训练lstm网络过程中出现如下错误:

Traceback (most recent call last):File "D:\code\lstm_emotion_analyse\text_analyse.py", line 82, in <module>loss.backward()File "C:\Users\lishu\anaconda3\envs\pt2\lib\site-packages\torch\_tensor.py", line 487, in backwardtorch.autograd.backward(File "C:\Users\lishu\anaconda3\envs\pt2\lib\site-packages\torch\autograd\__init__.py", line 200, in backwardVariable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass
RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved tensors after calling backward.

2 问题分析

按照错误提示查阅相关资料了解到,实际上在大多数情况下retain_graph都应采用默认的False,除了几种特殊情况:

  • 一个网络有两个output分别执行backward进行回传的时候: output1.backward(), output2.backward().
  • 一个网络有两个loss需要分别执行backward进行回传的时候: loss1.backward(), loss2.backward().

但本项目的LSTM训练模型不属于以上情况,再次查找资料,在在pytorch的官方论坛上找到了真正的原因:

如截图中的描述,只要我们对变量进行运算了,就会加进计算图中。所以本项目的问题在于在for循环梯度反向传播中,使用了循环外部的变量h,如下所示:

epochs = 128step = 0model.train()  # 开启训练模式for epoch in range(epochs):h = model.init_hidden(batch_size)  # 初始化第一个Hidden_statefor data in tqdm(train_loader):x_train, y_train = datax_train, y_train = x_train.to(device), y_train.to(device)step += 1  # 训练次数+1x_input = x_train.to(device)model.zero_grad()output, h = model(x_input, h)# 计算损失loss = criterion(output, y_train.float().view(-1))loss.backward()nn.utils.clip_grad_norm_(model.parameters(), max_norm=5)optimizer.step()if step % 10 == 0:print("Epoch: {}/{}...".format(epoch + 1, epochs),"Step: {}...".format(step),"Loss: {:.6f}...".format(loss.item()))

3 问题解决

代码修改如下:

epochs = 128step = 0model.train()  # 开启训练模式for epoch in range(epochs):h = model.init_hidden(batch_size)  # 初始化第一个Hidden_statefor data in tqdm(train_loader):x_train, y_train = datax_train, y_train = x_train.to(device), y_train.to(device)step += 1  # 训练次数+1x_input = x_train.to(device)model.zero_grad()h = tuple([e.data for e in h])output, h = model(x_input, h)# 计算损失loss = criterion(output, y_train.float().view(-1))loss.backward()nn.utils.clip_grad_norm_(model.parameters(), max_norm=5)optimizer.step()if step % 10 == 0:print("Epoch: {}/{}...".format(epoch + 1, epochs),"Step: {}...".format(step),"Loss: {:.6f}...".format(loss.item()))

增加for循环内部变量,对外部变量进行复制,内部变量参与梯度传播,问题解决。

http://www.lryc.cn/news/176465.html

相关文章:

  • 【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现
  • linux主机名
  • 前端uniapp图片select联动文本切换
  • java - 包装类
  • 防火墙基础
  • 服务断路器_Resilience4j的断路器
  • 微信小程序学习笔记3.0
  • nginx 反向代理 负载均衡 动静分离
  • Codeanalysis(tca)后端二次开发环境搭建
  • JS前端树形Tree数据结构使用
  • Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力
  • 电缆隧道在线监测系统:提升电力设施安全与效率的关键
  • Java BigDecimal 详解
  • 简述信息论与采样定理
  • 网络安全之网站常见的攻击方式
  • iOS Swift 拍照识别数字(Recognizing Text in Images)
  • 数学建模:智能优化算法及其python实现
  • monkeyrunner环境搭建和初步用法
  • 2024华为校招面试真题汇总及其解答(一)
  • css调整字体间距 以及让倾斜字体
  • 工具篇 | Gradle入门与使用指南 - 附Github仓库地址
  • 使用 Python 函数callable和isinstance的意义
  • Netty场景及其原理
  • Java接口和接口继承
  • 2023 年解锁网络安全即服务
  • python基于轻量级卷积神经网络模型GhostNet开发构建养殖场景下生猪行为识别系统
  • Selenium自动化测试 —— 通过cookie绕过验证码的操作!
  • 链表(单链表、双链表)
  • 面试题08.05.递归算法
  • 分布式IT监控系统