[英]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),就像沒有bias
的scale
圖層一樣,並記錄比例因子。
意思是,如果想在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.