TF Lite 多模型量化

时间:2021-04-12 15:34:02

标签: tensorflow keras deep-learning

我正在研究一个分类问题,目的是在固定大小的帧序列中识别手势。 该模型由三个较小的模型组成:

  • 从一帧中提取特征的 CNN
  • TCN 考虑从多个帧中提取的特征(与一维卷积没有太大区别)
  • FC 分类器生成最终标签。

模型按如下方式连接以生成用于训练的集成模型:

  • 将 CNN 应用于 16 个不同的帧,为每帧生成大小为 256 的平面特征向量。然后将这 16 个特征向量连接起来以获得 TCN 的输入,形状为 (16, 256)。因此,集成模型对 CNN 有 16 个输入,每帧一个。
input_frames = [tf.keras.Input(shape=cnn_input_shape) for i in range(num_frames)]
features_out = list()
for i in input_frames:
    features_out.append(cnn(i))     # generate CNN outputs, cnn is a keras.Model
  • TCN 应用于连接的特征
  • FC 层应用于 TCN 的输出以生成标签。

经过几个时期后,这是集成模型的混淆矩阵。

pre-quantization confusion matrix

虽然这个集成模型用于训练,但我实际上对三个子模型感兴趣,我必须对它们进行量化,但我没有找到合适的方法。我遵循 TensorFlow 指南的标准程序,该程序使用代表性数据集进行量化

我首先尝试将集成网络作为一个整体进行量化。这会导致准确度下降约 15%(我相信可以通过一些归一化或其他技术来降低,但稍后会出现问题),但最终我没有得到我希望的三个量化子模型。混淆矩阵看起来还是挺有意义的。

ensemble quantized network

我还注意到每个输入(对于每一帧)都有自己的量化scale,我觉得这很奇怪(毕竟 CNN 是一样的)。

然后我尝试自己量化三个子模型。为此,我必须为三个子模型中的每一个提供“代表性数据集”。 我使用了以下内容:

  • 对于 CNN,我可以只使用我数据集中的数据
  • 对于 TCN,我首先通过 CNN 运行来自我的数据集的数据,并将其输出用作 TCN 的“代表性数据集”
  • 对于分类器,我通过 TCN 运行数据并按上述步骤进行。

我尝试了量化和非量化的 CNN 和 TCN 模型来生成我用于代表性数据集的数据,最终结果几乎没有差异。这种方法导致几乎随机的准确性,其中预测倾向于仅针对任何输入的一个/两个标签崩溃(混淆矩阵本质上是一条水平线)。

有没有更好的方法来做到这一点?我刚刚开始使用 TensorFlow,所以我也愿意改变网络的设计,前提是功能得到维护。

谢谢。

0 个答案:

没有答案
相关问题