首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >训练后量化权重的keras模型评估

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

Stack Overflow用户
提问于 2018-10-15 22:30:59
回答 1查看 1.2K关注 0票数 5

我有一个在keras中训练的模型,并保存为.h5文件。该模型通过tensorflow后端使用单精度浮点值进行训练。现在我想实现一个在Xilinx FPGA上执行卷积运算的硬件加速器。但是,在决定FPGA上使用的定点位宽之前,我需要通过将权重量化为8或16位数字来评估模型精度。我遇到了tensorflow quantise,但我不确定如何从每一层获取权重,量化它并将其存储在numpy数组列表中。在对所有层进行量化后,我希望将模型的权重设置为新形成的量化权重。有人能帮我做这个吗?

这就是我到目前为止一直在尝试将精度从float32降低到float16的方法。请让我知道这是不是正确的方法。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2018-10-17 17:47:45

很抱歉,我不熟悉tensorflow,所以我不能给你代码,但也许我量化咖啡因模型的经验可能会有意义。

如果我理解正确的话,您有一个tensorflow模型(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上完成所有的net后,如果你想将int8反量化为float32,只需使用最后一个缩放参数(最终结果的)来做一些mul/div(取决于你如何定义scale)。

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

附言:为什么是numpy?bin文件最适合FPGA,不是吗?

还有,你对在FPGA上实现softmax有什么想法吗?我对此感到困惑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52819066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档