python numpy

本文介绍了如何将Pytorch模型的参数转换为numpy矩阵,包括读取与保存npy文件,以及从.pth模型文件中提取参数。通过nn.Module.parameters()接口获取模型参数,并利用Tensor的转换方法转为numpy格式,便于在边缘设备部署。
摘要由CSDN通过智能技术生成

npy文件是numpy专用的二进制文件

读取与保存npy文件

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 : <class 'numpy.ndarray'>
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 ]]]

从Pytorch模型pth文件中读取参数成numpy矩阵

目的:把训练好的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矩阵。方便又好用,爆赞~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值