实际落地操作时,需要将pytorch模型输出的特征保存成npy格式。
首先读取模型输出,将模型输出从GPU转换到CPU,并切换到numpy格式,新建numpy list保存所有结果,最后保存为npy格式。
创建一个tensor
a = torch.arange(10)
'''
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
device(type='cpu') 默认在cpu上
'''
1. CPU tensor转GPU tensor:
cpu_imgs.cuda()
a = torch.arange(10).cuda()
'''
device(type='cuda', index=0) 调用cuda()方法后Tensor存储在gpu
'''
2. GPU tensor 转CPU tensor:
gpu_imgs.cpu()
a = torch.arange(10).cuda()
'''
device(type='cuda', index=0) 调用cuda()方法后Tensor在gpu上计算
'''
a = a.cpu()
'''
device(type='cpu') 调用cpu()方法后Tensor又重新回到cpu
'''
3. numpy转为CPU tensor:
torch.from_numpy( imgs )
4.CPU tensor转为numpy数据:
cpu_imgs.numpy()
5. note:GPU tensor不能直接转为numpy数组,必须先转到CPU tensor。
6. 如果tensor是标量的话,可以直接使用 item() 函数(只能是标量)将值取出来:
print loss_output.item()
numpy append()函数用于合并两个数组。它返回一个新数组, 并且原始数组保持不变。
umpy.append(arr, values, axis=None)
1)arr:array_like
这是一个ndarray。新值将附加到此数组的副本中。此参数是必需的, 并且在numpy.append()函数中起重要作用。
2)值:array_like
此参数定义附加到ndarray副本的值。这里要注意的是, 这些值必须具有与原始ndarray相同的形状(不包括轴)。如果未定义轴, 则值可以为任何形状, 并且在使用前将变平。
3)轴:int(可选)
此参数定义沿其附加值的轴。如果没有给它们轴, 则在使用前将ndarray和值都展平。
axis无定义
numpy.append(arr,values,axis=None):
返回由arr和values组成的新数组。axis是一个可选的值,当axis无定义时,返回总是为一维数组。
由下面的例子可以看出,不管两个数组是什么形式,返回的都是一维数组。
import numpy as np
HJL = np.append([1,2,3],[[4,5,6],[7,8,9]])
print(HJL)
# 当axis无定义时,是横向加成,返回总是为一维数组。
#[1 2 3 4 5 6 7 8 9]
HXH = np.append([[1,2],[3,4]],[[5,6,7],[8,9,10]])
print(HXH)
# [ 1 2 3 4 5 6 7 8 9 10]
axis=0的情况
axis=0,表示针对第1维进行操作,可以简单的理解为,加在了行上。所以行数增加,列数不变。
由此可知,列数必须保持相同。
axis=1的情况
拓展列,行数不变。行数需要相同。主要记录二维矩阵的append用法
np.append(fea_neg,fea_pos,axis=0)#axis=0表示将两个矩阵上下堆叠,比如两个矩阵维度均为(3,4)则堆叠后为(6,4)
np.append(fea_neg,fea_pos,axis=1)#axis=1表示左右拼接,比如两个矩阵维度均为(3,4)则堆叠后为(3,8)
保存
利用这种方法,保存文件的后缀名字一定会被置为.npy
x = 10
numpy.save("data_x.npy",x)
读取
data = numpy.load("data_x.npy")