任务
我有两个应该等效的模型。第一个使用keras构建,第二个使用tensorflow构建。两种变体自动编码器均在其模型中使用tf.random.normal
方法。而且,它们产生相似的结果。一切都通过每晚构建(1.15)进行测试。
当我尝试将它们转换为带有训练后量化的tensorflow lite模型时,就会产生困惑。我对两个模型使用相同的命令:
converter = tf.compat.v1.lite.TFLiteConverter... # from respective save file
converter.representative_dataset = representative_dataset_gen
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
open('vae.tflite', 'wb').write(tflite_model)
错误
对于keras模型,一切顺利,最后我得到了一个可用的tflite模型。但是,如果尝试使用tensorflow版本执行此操作,则会遇到错误,指出未实现RandomStandardNormal
:
标准不支持模型中的某些运算符 TensorFlow Lite运行时。如果这些是本机TensorFlow运算符,则您 通过传递以下信息可能可以使用扩展的运行时 --enable_select_tf_ops,或通过在调用时设置target_ops = TFLITE_BUILTINS,SELECT_TF_OPS tf.lite.TFLiteConverter()。否则,如果您有一个自定义 为他们实施,您可以通过禁用此错误 --allow_custom_ops,或通过在调用tf.lite.TFLiteConverter()时设置allow_custom_ops = True。这是您内置的运算符的列表 使用:ADD,EXP,FULLY_CONNECTED,LEAKY_RELU,LOG,MUL。这是清单 您将需要自定义实现的运营商: RandomStandardNormal。
问题
这对我来说没有意义,因为显然这已经与keras一起使用了。 keras是否知道我必须明确告诉我的tensorflow模型的东西?
模型
tensorflow
fc_layer = tf.compat.v1.layers.dense
# inputs have shape (90,)
x = tf.identity(inputs, name='x')
# encoder
outputs = fc_layer(x, 40, activation=leaky_relu)
self.z_mu = fc_layer(outputs, 10, activation=None)
self.z_sigma = fc_layer(outputs, 10, activation=softplus)
# latent space
eps = tf.random.normal(shape=tf.shape((10,)), mean=0, stddev=1, dtype=tf.float32)
outputs = self.z_mu + eps * self.z_sigma
# decoder
outputs = fc_layer(outputs, 40, activation=leaky_relu)
# prediction
x_decoded = fc_layer(outputs, 90, activation=None)
keras
x = keras.layers.Input(shape=(90,))
h = keras.layers.Dense(40, activation=leakyrelu)(x)
z_mu = keras.layers.Dense(10)(h)
z_sigma = keras.layers.Dense(10, activation=softplus)(h)
eps = tf.random.normal(shape=tf.shape((10,)), mean=0, stddev=1, dtype=tf.float32)
z = z_mu + eps * z_sigma
h_decoded = keras.layers.Dense(40, activation=leakyrelu)(z)
x_decoded = keras.layers.Dense(90)(h_decoded)
train_model = keras.models.Model(x, x_decoded)
答案 0 :(得分:0)
!pip install tensorflow == 1.15
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model_file('model.h5')
converter.allow_custom_ops = True
tfmodel = converter.convert()
open ("model.tflite" , "wb") .write(tfmodel)