簡體   English   中英

訓練后量化權重的keras模型評估

[英]keras model evaluation with quantized weights post training

我有一個在keras訓練的模型,並保存為.h5文件。 使用具有張量流后端的單精度浮點值訓練模型。 現在我想實現一個硬件加速器,它在Xilinx FPGA上執行卷積操作。 但是,在決定要在FPGA上使用的定點位寬之前,我需要通過將權重量化為8或16位數來評估模型精度。 我遇到了張量流量化,但我不確定如何從每一層獲取權重,量化它並將其存儲在numpy數組列表中。 在量化所有層之后,我想將模型的權重設置為新形成的量化權重。 有人可以幫我這么做嗎?

這是我到目前為止嘗試將float32的精度降低到float16。 如果這是正確的方法,請告訴我。

for i in range(len(w_orginal)):
temp_shape = w_orginal[i].shape
print('Shape of index: '+ str(i)+ 'array is :')
print(temp_shape)
temp_array = w_orginal[i]
temp_array_flat = w_orginal[i].flatten()
for j in range(len(temp_array)):
    temp_array_flat[j] = temp_array_flat[j].astype(np.float16)

temp_array_flat = temp_array_flat.reshape(temp_shape)
w_fp_16_test.append(temp_array_flat)

抱歉,我對tensorflow不熟悉,所以我不能給你代碼,但也許我量化caffe模型的經驗可能有意義。

如果我理解正確,你有一個張量流模型(float32),你想將它量化為int8並將其保存在numpy.array

首先,你應該讀取每一層的所有權重,可能是python list或numpy.array或其他,這沒關系。

然后,量化算法將顯着影響准確性,您必須為您的模型選擇最佳的一個。 但是,這些算法具有相同的核心規模。 您需要做的就是將所有權重縮放到-127到127(int8),就像沒有biasscale圖層一樣,並記錄比例因子。

意思是,如果想在FPGA上實現它,數據也應該被量化。 這里我們有一個新問題 - int8 * int8的結果是一個int16,這是明顯的溢出。

為了解決這個問題,我們創建了一個新參數 - shift - 將int16結果轉換回int8。 注意, shift參數不會是常數8,假設我們有0 * 0 = 0,我們根本不需要移動結果。

我們想到的最后一個問題是,如果網絡太深,層結果可能會溢出,因為一些不合理的scale參數,所以我們不能直接量化每個單層而不考慮其他層。

在FPGA完成所有網絡后,如果要將int8反量化為float32,只需使用最后一個scale參數(最終結果)來執行一些mul / div(取決於您如何定義scale )。

這是一種基本的量化算法,其他像tf.quantization可能具有更高的准確度。 現在我們有了量化模型,你可以把它保存到你喜歡的任何地方,這不是一項艱苦的工作。

PS為什么numpy? bin文件是FPGA的最佳選擇,不是嗎?

而且,您對在FPGA上實現softmax有所了解嗎? 我很困惑......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM