Pytorch 串行训练两个网络

博客围绕Pytorch使用展开,介绍了将前一个网络输出作为后一个网络输入时的报错解决办法,即对前一个网络输出加'.data';还提及多个Dataloader同时训练时使用cycle的注意事项,以及tensor转成numpy在不同情况(GPU/CPU的Variable和tensor变量)下的操作和相关函数作用。
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

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值