npy文件是numpy专用的二进制文件
import numpy as np
data = np.zeros((3,4))
np.save('data.npy', data)
del data
data = np.load('data.npy')
print('type :', type(data))
print('shape :', data.shape)
print('data :')
print(data)
输出如下:
type :
shape : (8, 4)
data :
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
#矩阵的垂直合并
arr3 = np.vstack((arr1,arr2))
print(arr3)
[[1 2 3]
[4 5 6]]
#矩阵的水平合并
arr4 = np.hstack((arr1,arr2))
print(arr4)
[1 2 3 4 5 6]
#3个矩阵的垂直合并
arrv = np.vstack((arr1,arr2,arr3))
print(arrv)
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
#3个矩阵的水平合并
arrh = np.hstack((arr1,arr2,arr4))
print(arrh)
[1 2 3 4 5 6 1 2 3 4 5 6]
#合并的一般方式 默认是水平合并
arr = np.concatenate((arr1,arr2,arr1))
print(arr)
[1 2 3 4 5 6 1 2 3]
#axis = 0代表是纵向的合并,注意合并的array维度需要先相同,形状要匹配
arr = np.concatenate((arr3,arrv),axis = 0)
print(arr)
[[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]]
#axis = 1代表是横向的合并,注意合并的array维度需要先相同,形状要匹配
arr = np.concatenate((arr3,arr3),axis = 1)
print(arr)
[[1 2 3 1 2 3]
[4 5 6 4 5 6]]
#对1维的矩阵进行转置发现输出没有变化,说明一维的矩阵不能转置
print(arr1.T)
[1 2 3]
print(arr1.T.shape)
(3,)
#给1维的矩阵第一个维度上加一个维度,这时候就可以进行转置
arr1_1 = arr1[np.newaxis,:]
print(arr1_1)
[[1 2 3]]
print(arr1_1.shape)
(1, 3)
print(arr1_1.T)
[[1]
[2]
[3]]
#给1维的矩阵第二个维度上加一个维度
arr1_2 = arr1[:,np.newaxis]
print(arr1_2)
[[1]
[2]
[3]]
print(arr1_2.shape)#(3,1)
(3, 1)
#np.atleast_2d会判断矩阵是否是1维的矩阵,如果是的话将其转化为2维的矩阵,如果不是的话不做改变
#np.atleast2d:字面意思至少是两维
arr1_3 = np.atleast_2d(arr1)
print(arr1_3)
[[1 2 3]]
print(arr1_3.T)#(3,1)
[[1]
[2]
[3]]
arr1_4 = np.atleast_3d(arr1)
print(arr1_4)
[[[1]
[2]
[3]]]
#如果是超过2维的矩阵不做改变
arr_3d = np.random.random((3,2,3))
print(arr_3d)
[[[0.4324091 0.64994402 0.12787534]
[0.6124248 0.90403621 0.19718013]]
[[0.26517375 0.43147199 0.97764531]
[0.17105938 0.96694364 0.7580243 ]]
[[0.0946729 0.59033163 0.12797012]
[0.17993213 0.41231472 0.2179005 ]]]
arr1_3 = np.atleast_2d(arr_3d)
print(arr1_3)
[[[0.4324091 0.64994402 0.12787534]
[0.6124248 0.90403621 0.19718013]]
[[0.26517375 0.43147199 0.97764531]
[0.17105938 0.96694364 0.7580243 ]]
[[0.0946729 0.59033163 0.12797012]
[0.17993213 0.41231472 0.2179005 ]]]
目的:把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备。
Pytorch给了很方便的读取参数接口:nn.Module.parameters()
直接看demo:
from torchvision.models.alexnet import alexnet
model = alexnet(pretrained=True).eval().cuda()
parameters = model.parameters()
for p in parameters:
numpy_para = p.detach().cpu().numpy()
print(type(numpy_para))
print(numpy_para.shape)
上面得到的numpy_para就是numpy参数了~
Note:model.parameters()是以一个生成器的形式迭代返回每一层的参数。所以用for循环读取到各层的参数,循环次数就表示层数。而每一层的参数都是torch.nn.parameter.Parameter类型,是Tensor的子类,所以直接用tensor转numpy(即p.detach().cpu().numpy())的方法就可以直接转成numpy矩阵。方便又好用,爆赞~