keras模型量化

2022-07-02 20:57:09 字數 3567 閱讀 8938

模型量化的本質就是將模型中的引數按照一定的規則 把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 : 層的名稱

print

(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-----------------------')

print

(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][:]

print

(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 ...