在深度学习和各种运算中会经常使用numpy库,这里记录自己在学习过程中经常使用的函数和示例。
官方文档下载页面: https://docs.scipy.org/doc/
作者CSDN分享连接: https://download.csdn.net/download/u010472607/10418032
文件存取
在深度学习的学习过程中,看到过很多时候,需要将网络保存为非框架默认格式,虽然不同框架都提供了快捷的模型序列化方法保存模型参数到特定格式, 如tensorflow
的ckpt
格式, PyTorch
的pt
格式, 因为这样做保存的训练结果很难直接迁移到新的框架下 或者 新的模型中 方便使用.
save函数
将numpy
格式的变量直接存储为*.npy
格式, 一个限制是: 只能在文件中保存一个
变量.
示例:
>>> import numpy as np
>>> x = np.random.rand(2,4)
>>> x
array([[ 0.03118105, 0.15653145, 0.3858033 , 0.92774142],
[ 0.39441842, 0.10563577, 0.4003588 , 0.39920514]])
np.save('x.npy', x)
这样就完成了变量的本地保存,可以在当前执行路径下看到x.npy
文件. 当然, 如果我们在给定文件名的时候不给出扩展名,则函数会自动帮我们添加. 还需要注意的是, 这种方式保存的文件是二进制的,无法直接打开查看.
load函数
将使用np.save()
方法保存的文件通过np.load()
方法加载, 可以得到保存的np.ndarray
变量
示例:
>>> import numpy as np
>>> x = np.load('x.npy')
>>> x
array([[ 0.03118105, 0.15653145, 0.3858033 , 0.92774142],
[ 0.39441842, 0.10563577, 0.4003588 , 0.39920514]])
此时就得到了我们上一步保存的x变量.
save, load 在模型保存时的应用
通过上面的介绍, 我们已经了解到, 使用 np.save()
方法保存变量到文件只能保存一个变量, 所以我们使用一个字典变量将模型各层参数进行保存, 最后在使用np.save()
方法保存.
在使用np.load()
方法进行加载时, 如果变量里只包含一个元素(item)
, 即 (1x1x…x1), 那么就可以通过ndarray.item()
方法将其转换为一个标量(scalar)
一个示例:
>>> import numpy as np
>>> x = {'conv_1': np.random.rand(3,3), 'fc_1': np.random.rand(32)}
>>> x
{'conv_1': array([[ 0.05540144, 0.46888816, 0.76508324],
[ 0.09527619, 0.03357439, 0.76838422],
[ 0.6086968 , 0.16039761, 0.78455757]]),
'fc_1': array([ 0.68438637, 0.54501269, 0.48208714, 0.67772137, 0.85089517,
0.60036447, 0.15253074, 0.74487022, 0.04308577, 0.57887682,
0.43993034, 0.92150712, 0.07067633, 0.9204343 , 0.93995161,
0.37799341, 0.62816175, 0.26181036, 0.39731716, 0.79923516,
0.47060778, 0.39672584, 0.93192817, 0.67885068, 0.47151288,
0.93326192, 0.9359753 , 0.47459049, 0.89973424, 0.36861164,
0.37622372, 0.54349513])}
>>> np.save('t-net.npy', x)
>>> y = np.load('t-net.npy')
>>> y # 此时为 numpy.ndarray 类型, size=(1,)
array({'fc_1': array([ 0.68438637, 0.54501269, 0.48208714, 0.67772137, 0.85089517,
0.60036447, 0.15253074, 0.74487022, 0.04308577, 0.57887682,
0.43993034, 0.92150712, 0.07067633, 0.9204343 , 0.93995161,
0.37799341, 0.62816175, 0.26181036, 0.39731716, 0.79923516,
0.47060778, 0.39672584, 0.93192817, 0.67885068, 0.47151288,
0.93326192, 0.9359753 , 0.47459049, 0.89973424, 0.36861164,
0.37622372, 0.54349513]), 'conv_1': array([[ 0.05540144, 0.46888816, 0.76508324],
[ 0.09527619, 0.03357439, 0.76838422],
[ 0.6086968 , 0.16039761, 0.78455757]])}, dtype=object)
>>> y.item() # 此时的返回值类型为 Python的标准 dict字典 类型
{'conv_1': array([[ 0.05540144, 0.46888816, 0.76508324],
[ 0.09527619, 0.03357439, 0.76838422],
[ 0.6086968 , 0.16039761, 0.78455757]]),
'fc_1': array([ 0.68438637, 0.54501269, 0.48208714, 0.67772137, 0.85089517,
0.60036447, 0.15253074, 0.74487022, 0.04308577, 0.57887682,
0.43993034, 0.92150712, 0.07067633, 0.9204343 , 0.93995161,
0.37799341, 0.62816175, 0.26181036, 0.39731716, 0.79923516,
0.47060778, 0.39672584, 0.93192817, 0.67885068, 0.47151288,
0.93326192, 0.9359753 , 0.47459049, 0.89973424, 0.36861164,
0.37622372, 0.54349513])}
>>> # y = np.load('t-net.npy').item() # 注: 内部变量size 乘积必须为1, 即只有一个item
未完待续…