天天看点

pytorch:List中包含Tensor的grad数据怎么办?

最近在学习pytorch,碰到一个问题

就是我想画出loss-weight的二维图

然后在收集loss数据时,我开始是定义了一个空的list,然后通过append方法,每次循环计算出一个loss,我就追加进去,具体代码如下:

# ================================================================== #
#                4. Training cycle               					 #
# ================================================================== #
loss_list=[]
w_list=[]
num_epochs=100
for epoch in range(num_epochs):
	y_pred=model(x_data)
	loss=criterion(y_pred,y_data)
	print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs,loss.item()))

	optimizer.zero_grad()
	loss.backward()
	optimizer.step()

	loss_list.append(loss)
	w_list.append(model.linear.weight)
           

然后就出现了这个问题 

pytorch:List中包含Tensor的grad数据怎么办?

大概意思就是 我这个张量数据包含了它的梯度信息,不能直接转换为numpy数组?我的理解是这样,然后权重和loss数据类型如下:

pytorch:List中包含Tensor的grad数据怎么办?
pytorch:List中包含Tensor的grad数据怎么办?

我以为是因为包含这个梯度信息,然后画不出图,然后他说要detach,我想应该是把不包含梯度信息的数字数据detach出来,然后我就去detach了

loss_list=loss_list.detach().numpy()
w_list=w_list.detach().numpy()
           

 然后发现我这个是list数组,没有detach方法,我就想着先把list转换为numpy数组

loss_list=np.array(loss_list)
w_list=np.array(w_list)
           

然后又出现了同样的问题,就是因为我这个append的list包含梯度信息,不能直接转换为numpy,我就想着我直接初始化一个空的numpy数组,然后再append这个numpy数组,然后再detach,这样总可以吧,结果发现numpy数组没有append方法,绝了,这不无解了哈哈

然后后面想到一个方法,就是只append当前loss的i数字信息,这里就用到item()方法

loss_list.append(loss.item())
w_list.append(model.linear.weight.item())
           

这样获得的数据格式是这样的

pytorch:List中包含Tensor的grad数据怎么办?
pytorch:List中包含Tensor的grad数据怎么办?

 目前的解决方法是这样,如果还有啥方法希望大伙不吝赐教,小菜鸡一个,很多不懂,向大家学习。

继续阅读