首页 文章

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

提问于
浏览
1

我有一个在keras训练的模型,并保存为.h5文件 . 使用具有张量流后端的单精度浮点值训练模型 . 现在我想实现一个硬件加速器,它在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)

1 回答

  • 0

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

    如果我理解正确,你有一个张量流模型(float32),你想将它量化为int8并将其保存在 numpy.array 中 .

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

    然后,量化算法将显着影响准确性,您必须为您的模型选择最佳的一个 . 但是,这些算法具有相同的核心规模 . 您需要做的就是将所有权重扩展到-127到127(int8),就像没有 biasscale 层一样,并记录比例因子 .

    意思是,如果想在FPGA上实现它,数据也应该被量化 . 这里我们有一个新问题 - int8 * int8的结果是一个int16,这是明显的溢出 .

    为了解决这个问题,我们创建了一个新参数--shift - 将int16结果转换回int8 . 注意, shift 参数赢了't be constant 8, suppose we have 0 * 0 = 0, we don' t需要根据结果移动结果 .

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

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

    这是一种基本的量化算法,其他像 tf.quantization 可能具有更高的准确度 . 现在我们有了量化模型,您可以将它保存到您喜欢的任何地方,这不是一项艰苦的工作 .

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

    而且,您对在FPGA上实现softmax有所了解吗?我很困惑......

相关问题