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元组类型。
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