fri*_*989 5 python fpga quantization keras tensorflow
我有一个在 keras 中训练的模型并保存为 .h5 文件。该模型使用 tensorflow 后端的单精度浮点值进行训练。现在我想实现一个在 Xilinx FPGA 上执行卷积运算的硬件加速器。但是,在我决定在 FPGA 上使用的定点位宽之前,我需要通过将权重量化为 8 位或 16 位数字来评估模型的准确性。我遇到了tensorflow quantise,但我不确定如何从每一层获取权重,对其进行量化并将其存储在 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)
Run Code Online (Sandbox Code Playgroud)
小智 0
抱歉,我对张量流不熟悉,所以我不能给你代码,但也许我量化 caffe 模型的经验可能是有意义的。
如果我理解正确,您有一个张量流模型(float32),您想将其量化为 int8 并将其保存在numpy.array.
首先,你应该读取每一层的所有权重,这可能是Python列表或numpy.array其他东西,这并不重要。
然后,量化算法将显着影响精度,您必须为您的模型选择最好的一种。然而,这些算法都有相同的核心——规模。您需要做的就是将所有权重缩放到 -127 到 127(int8),就像scale没有 的图层一样bias,并记录比例因子。
同时,如果想在FPGA上实现,也需要对数据进行量化。这里我们遇到了一个新问题——int8 * int8的结果是int16,这是明显的溢出。
为了解决这个问题,我们创建一个新参数——shift——将 int16 结果移回 int8。注意,shift参数不会是常数 8,假设我们有 0 * 0 = 0,我们根本不需要移动结果。
我们要考虑的最后一个问题是,如果网络太深,层结果可能会因为一些不合理的scale参数而溢出,所以我们不能直接量化每个单层而不考虑其他层。
当所有网络在FPGA上完成后,如果你想将int8反量化为float32,只需使用最后一个比例参数(最终结果)做一些mul/div(取决于你如何定义scale)。
这是一个基本的量化算法,其他类似的算法tf.quantization可能具有更高的精度。现在我们有了量化模型,你可以将它保存成你喜欢的任何东西,这并不困难。
PS 为什么是numpy?bin 文件最适合 FPGA,不是吗?
而且,您对在 FPGA 上实现 softmax 有什么想法吗?我对此很困惑...
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |