转换后 TFLite 模型中缺少层
Missing layer in TFLite model after conversion
所以我使用 tensorflow 和 python 训练了一个模型,现在我正尝试在 C++ 程序中使用它。我使用这段代码将我的模型转换为 tflite(我在转换过程中没有任何错误):
model.load_weights('training_weights.h5', by_name=True)
model.save('saved_model/model')
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model/model")
tflite_model = converter.convert()
with tf.io.gfile.GFile('model.tflite', 'wb') as f:
f.write(tflite_model)
然后我在 C++ 中加载模型并尝试使用它,但输出与我的网络的输出不匹配。 python 中网络的最后一层是:
X = Lambda(lambda x: K.expand_dims(x, axis=2), name='deconv_expand_dim')(input_tensor)
X = Conv2DTranspose(filters, (kernel_size, 1), strides=(strides, 1), padding=padding,
activation=activation, kernel_initializer=kernel_initializer,
bias_initializer=bias_initializer, name='deconv')(X)
X = Lambda(lambda x: K.squeeze(x, axis=2), name='deconv_reduce_dim')(X)
在 C++ 中加载的模型的最后一层是:
1227 model/deconv_expand_dim/ExpandDims;StatefulPartitionedCall/model/deconv_expand_dim/ExpandDims
1228 model/deconv/Shape;StatefulPartitionedCall/model/deconv/Shape
1229 model/deconv/strided_slice;StatefulPartitionedCall/model/deconv/strided_slice1
1230 model/deconv/strided_slice_1;StatefulPartitionedCall/model/deconv/strided_slice_1
1231 model/deconv/strided_slice_2;StatefulPartitionedCall/model/deconv/strided_slice_22
1232 model/deconv/stack;StatefulPartitionedCall/model/deconv/stack
1233 model/deconv/conv2d_transpose;StatefulPartitionedCall/model/deconv/conv2d_transpose1
1234 model/deconv/BiasAdd;StatefulPartitionedCall/model/deconv/BiasAdd
1235 Identity
我刚刚对 interpreter->tensors_size() 做了一个 for 循环来列出层。问题:
- interpreter->tensors_size() returns 一个更大的数字,因一次测试而异(大约 1300)。
- interpreter->outputs()[0] returns Identity (1235) 的索引。
- 我在 C++ 中有层 deconv_expand_dim 和 deconv 但我没有层 deconv_reduce_dim.
- interpreter->tensor(outputIndex)->dims->size等于0,这是有问题的,因为这是网络的输出。我在转换过程中错过了一个步骤吗?如何获得有效输出?
非常感谢任何帮助,谢谢。
我想我找到了它不起作用的原因。正如您在最后一层中看到的那样,我使用了运算符 :
K.squeeze(x, axis=2)
似乎还不支持指定的轴(“tf.squeeze — 只要未提供轴。”,最后访问时间:2020 年 7 月 28 日,link)。
这就是为什么我在 C++ 中没有与 Python 中相同的输出,Tensorflow Lite 目前不支持我的网络。
所以我使用 tensorflow 和 python 训练了一个模型,现在我正尝试在 C++ 程序中使用它。我使用这段代码将我的模型转换为 tflite(我在转换过程中没有任何错误):
model.load_weights('training_weights.h5', by_name=True)
model.save('saved_model/model')
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model/model")
tflite_model = converter.convert()
with tf.io.gfile.GFile('model.tflite', 'wb') as f:
f.write(tflite_model)
然后我在 C++ 中加载模型并尝试使用它,但输出与我的网络的输出不匹配。 python 中网络的最后一层是:
X = Lambda(lambda x: K.expand_dims(x, axis=2), name='deconv_expand_dim')(input_tensor)
X = Conv2DTranspose(filters, (kernel_size, 1), strides=(strides, 1), padding=padding,
activation=activation, kernel_initializer=kernel_initializer,
bias_initializer=bias_initializer, name='deconv')(X)
X = Lambda(lambda x: K.squeeze(x, axis=2), name='deconv_reduce_dim')(X)
在 C++ 中加载的模型的最后一层是:
1227 model/deconv_expand_dim/ExpandDims;StatefulPartitionedCall/model/deconv_expand_dim/ExpandDims
1228 model/deconv/Shape;StatefulPartitionedCall/model/deconv/Shape
1229 model/deconv/strided_slice;StatefulPartitionedCall/model/deconv/strided_slice1
1230 model/deconv/strided_slice_1;StatefulPartitionedCall/model/deconv/strided_slice_1
1231 model/deconv/strided_slice_2;StatefulPartitionedCall/model/deconv/strided_slice_22
1232 model/deconv/stack;StatefulPartitionedCall/model/deconv/stack
1233 model/deconv/conv2d_transpose;StatefulPartitionedCall/model/deconv/conv2d_transpose1
1234 model/deconv/BiasAdd;StatefulPartitionedCall/model/deconv/BiasAdd
1235 Identity
我刚刚对 interpreter->tensors_size() 做了一个 for 循环来列出层。问题:
- interpreter->tensors_size() returns 一个更大的数字,因一次测试而异(大约 1300)。
- interpreter->outputs()[0] returns Identity (1235) 的索引。
- 我在 C++ 中有层 deconv_expand_dim 和 deconv 但我没有层 deconv_reduce_dim.
- interpreter->tensor(outputIndex)->dims->size等于0,这是有问题的,因为这是网络的输出。我在转换过程中错过了一个步骤吗?如何获得有效输出?
非常感谢任何帮助,谢谢。
我想我找到了它不起作用的原因。正如您在最后一层中看到的那样,我使用了运算符 :
K.squeeze(x, axis=2)
似乎还不支持指定的轴(“tf.squeeze — 只要未提供轴。”,最后访问时间:2020 年 7 月 28 日,link)。
这就是为什么我在 C++ 中没有与 Python 中相同的输出,Tensorflow Lite 目前不支持我的网络。