由tensor组成的list
深度学习的OA可能通过循环形成list,但是作图不能用在GPU上的数据。
import matplotlib.pyplot as plt
import numpy as np
import torch
train_binary_OA_list=[torch.tensor(2).cuda(0),torch.tensor(2).cuda(0)]
# 将每个张量从GPU移动到CPU,并转换为Python的int类型
train_binary_OA_list = [t.cpu().item() for t in train_binary_OA_list]
xpoints1 = np.arange(len(train_binary_OA_list)) +1
ypoints1 = np.array(train_binary_OA_list)
plt.plot(xpoints1, ypoints1)
plt.show()
train_binary_OA_list是由tensor组成的list,如下图:
由于tensor部署在GPU上(.cuda(0))所以在后面画图plt.plot(xpoints1, ypoints1)会报错:
TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
在我的Python3.10解释器中有种解决方案:(1)将cuda(0)删除;(2)将tensor变成list或者ndarray型。本质上都是将GPU上的数据放到CPU上。
list = [t.cpu().item() for t in list_make_of_tensor]
通过上面的代码,我将tensor转换成list如下。就可以成功绘图了。
最终的代码如下:
import matplotlib.pyplot as plt
import numpy as np
import torch
train_binary_OA_list=[torch.tensor(2).cuda(0),torch.tensor(2).cuda(0)]
# 将每个张量从GPU移动到CPU,并转换为Python的int类型
train_binary_OA_list = [t.cpu().item() for t in train_binary_OA_list]
xpoints1 = np.arange(len(train_binary_OA_list)) +1
ypoints1 = np.array(train_binary_OA_list)
plt.plot(xpoints1, ypoints1)
plt.show()
由array组成的list
import cupy as cp
list_make_of_array = [cp.array(1), cp.array(4)]
list = [arr.item() for arr in list_make_of_array]
输出
[1, 4]
总结
list = [t.cpu().item() for t in list_make_of_tensor]
list = [arr.item() for arr in list_make_of_array]
推广
如上图所示,一般来说,由tensor或者array组成的list的形成,是由于开始的时候申请了list并用于后续的存储数据。
在后续的数据类型的变换虽然也是可行的,但是我们最好在开始的时候就申请符合要求的数值类型(也就是尽量让上图类似的数据不要出现):tensor和array都可以用来存储数组。
import cupy as cp
x = cp.array([])
list_make_of_array = [cp.array(1), cp.array(4)]
for i in list_make_of_array:
x = cp.append(x, i)
如上代码,我们直接申请array型存储数值。在后面数据类型就是<class 'cupy.ndarray'>。
tensor array与numpy的不同之处
函数不同:前两者更偏向类的方法调用
import torch
import cupy as cp
import numpy as np
x = torch.tensor([1,4])
x = x.max()
print(x)
y = cp.array([1,4])
y = y.max()
print(y)
z = np.array([1,4])
z = max(z)
print(z)
访问元素的方式不同:前两者还有另一种访问方法
list = [[1, 2], [3, 4]]
print(list[0][0])
import numpy as np
array = np.array(list)
print(array[0][0])