0

当我们使用 tf 1.15 的 PReLU 转换 tf.keras 模型时,PReLU 层变为 ReLU,并且似乎与以前的运算符融合在一起。结果,28 MB 的 keras h5 文件大小变为 1.3 MB。看起来参数数量明显减少,因为我没有在 PReLU 中使用共享权重轴选项。那么,这种转换是否可以正常工作而没有任何精度损失?PReLU 的权重是否完全丢弃?同样,融合是否考虑了转置卷积层的偏差(在 netron 中没有将偏差作为输入属性提及)。这些融合是否在内部保留了训练后的权重参数,它们是否会影响 tflite 的推理准确性?

Prelu 融合:-

input = Input(shape=(512,512,3), name='ip')
x = Conv2D(filters=8, kernel_size=2, strides=2, padding='valid')(input)
x = PReLU()(x) # shared_axes not used

在此处输入图像描述

它在输出属性中显示prelu/ReLU

转置转换:-

cout1 = Conv2DTranspose(filters=8, kernel_size=2, strides=2, padding = 'same' )(pout1) # Bias is true by default

在此处输入图像描述

它没有显示输出属性的偏差

那么,融合是通过组合权重正常工作还是被丢弃?

4

1 回答 1

0

如果权重中的所有值都为零,它会在融合/转换期间自动丢弃它们。所以,PReLU融合后变成了ReLU,transpose conv+bias变成了transpose conv。当您在训练之前将模型转换为 tflite 格式时会出现问题,因为权重具有其默认值(零)。

于 2020-04-11T02:03:49.327 回答