在{TF 2.0.0-beta1上使用tflite_convert时,“未知(自定义)损失函数”; Keras}模型

时间:2019-08-20 14:36:26

标签: tensorflow machine-learning keras deep-learning

摘要

我的问题由以下人组成:

  • 介绍项目,工作环境和工作流程的环境
  • 详细问题
  • 我代码的相关部分
  • 我试图解决问题的解决方案
  • 问题提醒

上下文

我已经编写了原始Super-Resolution GAN降级版本的Python Keras实现。现在,我想通过将其托管在Google服务器中,使用Google Firebase机器学习套件对其进行测试。因此,我必须将Keras程序转换为TensorFlow Lite。

环境和工作流程(有问题)

我正在Google Colab工作环境上训练我的程序:在那里,我已经安装了TF 2.0.0-beta1(此选择是由这个不正确的答案引起的:https://datascience.stackexchange.com/a/57408/78409)。

工作流程(和问题):

  1. 我在本地编写我的Python Keras程序,请记住它将在TF 2上运行。因此,我使用TF 2导入,例如:from tensorflow.keras.optimizers import Adam以及from tensorflow.keras.layers import Conv2D, BatchNormalization

  2. 我将代码发送到云端硬盘

  3. 我运行Google Colab Notebook毫无问题:使用了TF 2。

  4. 我在云端硬盘中获取了输出模型,然后下载了它。

  5. 我尝试通过执行以下CLI将此模型转换为TFLite格式:tflite_convert --output_file=srgan.tflite --keras_model_file=srgan.h5此处出现问题

问题

以前的CLI不会从TF(Keras)模型输出TF Lite转换模型,而是输出此错误:

  

ValueError:未知丢失函数:build_vgg19_loss_network

函数build_vgg19_loss_network是我已经实现的自定义丢失函数,必须由GAN使用。

引起此问题的代码部分

呈现自定义损失函数

自定义损失功能的实现方式如下:

def build_vgg19_loss_network(ground_truth_image, predicted_image):
    loss_model = Vgg19Loss.define_loss_model(high_resolution_shape)
    return mean(square(loss_model(ground_truth_image) - loss_model(predicted_image)))

使用我的自定义损失函数编译发电机网络

generator_model.compile(optimizer=the_optimizer, loss=build_vgg19_loss_network)

我为解决问题所做的尝试

  1. 当我在StackOverflow(此问题开头的链接)上阅读该文件时,认为TF 2足以输出Keras模型,该模型将由我的tflite_convert CLI正确处理。但这显然不是。

  2. 在GitHub上阅读时,我尝试通过添加以下行来手动设置Keras损失函数中的自定义损失函数:import tensorflow.keras.losses tensorflow.keras.losses.build_vgg19_loss_network = build_vgg19_loss_network。没用。

  3. 我在GitHub上阅读过,我可以将自定义对象与load_model Keras函数一起使用:但是我只想使用compile Keras函数。不是load_model

我的最后一个问题

我只想对我的代码做些小改动,因为它可以正常工作。因此,例如,我不想将compile替换为load_model。有了这个限制,您能帮我让CLI tflite_convert与我的自定义损失功能一起工作吗?

2 个答案:

答案 0 :(得分:1)

由于您声称TFLite转换由于自定义损失函数而失败,因此可以保存模型文件而无需保留优化器详细信息。为此,将include_optimizer参数设置为False,如下所示:

model.save('model.h5', include_optimizer=False)

现在,如果模型中的所有层都是可转换的,则应将它们转换为TFLite文件。

编辑: 然后,您可以像这样转换h5文件:

import tensorflow as tf

model = tf.keras.models.load_model('model.h5')   # srgan.h5 for you
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

documented here中,通常的做法是克服TFLite转换中不受支持的运算符。

答案 1 :(得分:0)

我有同样的错误。我建议将损失更改为“mse”,因为您已经拥有一个训练有素的模型,并且您不需要使用 .tflite 文件进行训练。