在深度學習和各種運算中會經常使用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
未完待續…