模型量化的本質就是將模型中的引數按照一定的規則 把32位或者64位浮點數 轉化位16位浮點數或者8位定點數。這裡我用keras和numpy實現了16位和8位的量化,未考慮量化的科學合理性,僅僅是搞清楚量化本質的一次實驗。
量化"""#coding:utf-8
__project_ = 'tf2learning'
__file_name__ = 'quantization'
__author__ = 'qilibin'
__time__ = '2021/3/17 9:18'
__product_name = pycharm
"""import
h5py
import
pandas as pd
import
numpy as np
'''讀取原來的只包含權重的h5模型,按層遍歷,對每層的每個權重進行16位或8位量化,將量化後的權重數值重新儲存在h5檔案中
'''def
quantization16bit(old_model_path,new_model_path,bit_num):
''':param old_model_path: 未量化的模型路徑 模型是只儲存了權重未儲存網路結構
:param new_model_path: 量化過後的模型路徑
:param bit_num: 量化位數
:return:
'''f = h5py.file(old_model_path,'r'
) f2 = h5py.file(new_model_path,'w'
)
for layer in
f.keys():
#layer : 層的名稱
(layer)
## 每層裡面的權重名稱 有的層沒有引數
#name_of_weight_of_layer = f[layer].attrs['weight_names']
## 有的層是沒有引數的 比如 relu
#length = len(name_of_weight_of_layer)
length =len(list(f[layer].keys()))
if length >0:
g1 =f2.create_group(layer)
g1.attrs[
"weight_names
"] =layer
g2 =g1.create_group(layer)
for weight in
f[layer][layer].keys():
print ("
wieght name is :
" +weight)
oldparam =f[layer][layer][weight][:]
print ('
-----------------------------------------old-----------------------')
(oldparam)
if type(oldparam) ==np.ndarray:
if bit_num == 16:
newparam =np.float16(oldparam)
if bit_num == 8:
min_val =np.min(oldparam)
max_val =np.max(oldparam)
oldparam = np.round((oldparam - min_val) / (max_val - min_val) * 255)
newparam =np.uint8(oldparam)
else
: newparam =oldparam
print ('
-----------------------------------------new-----------------------')
#print (newparam)
#f[key][key][weight_name][:] = newparam 在原來模型的基礎上修改 行不通
if bit_num == 16:
d = g2.create_dataset(weight, data=newparam,dtype=np.float16)
if bit_num == 8:
d = g2.create_dataset(weight, data=newparam, dtype=np.uint8)
else
: g1 =f2.create_group(layer)
g1.attrs[
"weight_names
"] =layer
f.close()
f2.close()
old_model_path = '
./model_0_.h5
'new_model_path = '
./new_model.h5
'quantization16bit(old_model_path,new_model_path,8)
#print (f['batch_normalization']['batch_normalization']['gamma:0'][:])
檢查量化後的檔案
"""#coding:utf-8
__project_ = 'tf2learning'
__file_name__ = 'readnewmodel'
__author__ = 'qilibin'
__time__ = '2021/3/17 13:27'
__product_name = pycharm
"""'''
用來列印量化之後的模型 檢視其各個權重的引數
'''import
h5py
modelpath = '
./new_model.h5'#
modelpath = './model_0_.h5'
f = h5py.file(modelpath,'r'
)for layer in
f.keys():
#key : 層的名稱
print ("
layer name is :
"+layer)
#有些層是沒有引數的 比如relu
length =len(list(f[layer].keys()))
#print (length)
if length >0:
for weight in
f[layer][layer].keys():
print("
wieght name is :
" +weight)
param =f[layer][layer][weight][:]
(param)
f.close()
#print (f['batch_normalization']['batch_normalization']['gamma:0'][:])
模型輕量化
1.輕量化網路 參考 mobilenet v1核心是把卷積拆分為depthwise pointwise兩部分。圖5為了解釋mobilenet,假設有 的輸入,同時有 個的卷積。如果設定 且,那麼普通卷積輸出為 如圖6。圖6 普通3x3卷積,k 2 depthwise是指將 的輸入分為 組,然後每一組...
keras評估模型
當建立好模型並且用來訓練之後,如何評估模型的好壞,準確度又如何呢?三種常用方法 1 使用自動驗證方法 在 fit 函式中增加乙個validation split引數,該引數用來進行驗證效果 該引數可以自由設定,一般設定為20 或者30 也就是測試集佔總資料集的20 或者30 的資料用來進行驗證,其餘...
keras載入模型
說明 該程式是乙個包含兩個隱藏層的神經網路。演示如何載入乙個儲存好的模型。資料集 mnist from future import print function python提供了 future 模組,把下乙個新版本的特性匯入到當前版本,於是我們就可以在當前版本中測試一些新版本的特性。import ...