Pytorch 串行训练两个网络

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed.

(一)我要完成的是,把前一个网络的输出作为后一个网络的输入。

pytorch生手……我一开始还以为是使用了两次loss.backward,需要在第一个处保存:loss.backward(retain_graph=True),结果还是一直报这个错。

后来发现需要对前一个网络的输出加'.data',也就是写成'output.data',表示取出不带梯度的变量值(大概是这个意思(๑•̀ㅂ•́)و✧)。

(二)如果还需要多个Dataloader同时训练呢:

from itertools import cycle

for step, tupdata in enumerate(zip(cycle(loader1), loader2)):
    data1, labels1, data2, labels2 = tupdata[0][0], tupdata[0][1], tupdata[1][0], tupdata[1][1]

这样使用cycle时,将再次重复使用最小的数据集,注意取出的数据是tuple元组类型。

(三)将tensor转成numpy的几种情况

1. GPU中的Variable变量:

a.cuda().data.cpu().numpy()

2. GPU中的tensor变量:

a.cuda().cpu().numpy()

3. CPU中的Variable变量:

a.data.numpy()

4. CPU中的tensor变量:

a.numpy()

总结:

.cuda()是读取GPU中的数据

.data是读取Variable中的tensor

.cpu是把数据转移到cpu上

.numpy()把tensor变成numpy

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值