gpt4 book ai didi

python - 训练后量化权重的keras模型评估

转载 作者:行者123 更新时间:2023-11-28 19:00:50 24 4
gpt4 key购买 nike

我有一个在 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)

最佳答案

抱歉,我对 tensorflow 不熟悉,所以我不能给你代码,但也许我在量化 caffe 模型方面的经验可能有意义。

如果我没理解错的话,你有一个 tensorflow 模型 (float32),你想将其量化为 int8 并将其保存在 numpy.array 中。

首先,你应该读取每一层的所有权重,这可能是 python 列表或 numpy.array 或其他东西,这并不重要。

然后,量化算法将显着影响准确性,您必须选择最适合您模型的算法。但是,这些算法有一个共同的核心——尺度。您需要做的就是将所有权重缩放到 -127 到 127(int8),就像没有 biasscale 层一样,并记录比例因子。

同时,如果要在FPGA上实现,数据也要量化。这里我们遇到了一个新问题——int8 * int8 的结果是一个 int16,这是明显的溢出。

为了解决这个问题,我们创建了一个新参数 -- shift -- 将 int16 结果移回 int8。注意,shift 参数不会是常量 8,假设我们有 0 * 0 = 0,我们根本不需要移动结果。

我们最后要考虑的问题是,如果网络太深,层结果可能会溢出,因为一些不合理的scale参数,所以我们不能不考虑直接量化每个单层其他层。

在 FPGA 上完成所有网络后,如果你想将 int8 反量化为 float32,只需使用最后一个比例参数(最终结果)做一些 mul/div(取决于你如何定义 scale).

这是一个基本的量化算法,其他像 tf.quantization 可能有更高的精度。现在我们有了量化模型,你可以把它保存成你喜欢的任何东西,这并不难。

附言为什么 NumPy ? bin 文件是 FPGA 的最佳选择,不是吗?

而且,您对在 FPGA 上实现 softmax 有什么想法吗?我对此感到困惑...

关于python - 训练后量化权重的keras模型评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52819066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com