Tensorflow &引用;未知(自定义)损失函数“;在{tf2.0.0-beta1;Keras}模型上使用tflite_convert时 总结

Tensorflow &引用;未知(自定义)损失函数“;在{tf2.0.0-beta1;Keras}模型上使用tflite_convert时 总结,tensorflow,machine-learning,keras,deep-learning,Tensorflow,Machine Learning,Keras,Deep Learning,我的问题由以下部分组成: 我展示我的项目、工作环境和工作流程的背景 细节问题 我的代码的相关部分 我试图解决我的问题的解决方案 问题提醒 上下文 我已经编写了一个Python Keras实现,它是原始超分辨率GAN的降级版本。现在我想用谷歌Firebase机器学习工具包测试它,把它放在谷歌服务器上。这就是为什么我必须将Keras程序转换为TensorFlow Lite程序 环境和工作流(有问题) 我正在谷歌Colab工作环境上培训我的程序:在那里,我安装了TF2.0.0-beta1(这个选择

我的问题由以下部分组成:

  • 我展示我的项目、工作环境和工作流程的背景
  • 细节问题
  • 我的代码的相关部分
  • 我试图解决我的问题的解决方案
  • 问题提醒
上下文 我已经编写了一个Python Keras实现,它是原始超分辨率GAN的降级版本。现在我想用谷歌Firebase机器学习工具包测试它,把它放在谷歌服务器上。这就是为什么我必须将Keras程序转换为TensorFlow Lite程序

环境和工作流(有问题) 我正在谷歌Colab工作环境上培训我的程序:在那里,我安装了
TF2.0.0-beta1
(这个选择的动机是这个不正确的答案:)

工作流程(和问题):

  • 我在本地编写Python Keras程序,记住它将在TF2上运行。因此,我使用TF2导入,例如:
    来自tensorflow.keras.optimizers导入Adam
    ,以及
    来自tensorflow.keras.layers导入Conv2D、批次标准化

  • 我将代码发送到我的驱动器

  • 我毫无问题地运行我的Google Colab笔记本:TF2被使用

  • 我在驱动器中获取输出模型,然后下载它

  • 我尝试通过执行以下CLI将此模型转换为TFLite格式:
    TFLite\u convert--output\u file=srgan.TFLite--keras\u model\u file=srgan.h5
    这里出现了问题

  • 问题 以前的CLI没有从TF(Keras)模型输出TF Lite转换模型,而是输出以下错误:

    ValueError:未知损耗函数:构建\u vgg19\u损耗\u网络

    函数
    build_vgg19_loss_network
    是我已经实现的自定义loss函数,必须由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\u model.compile(优化器=优化器,loss=build\u vgg19\u loss\u网络)

    为了解决这个问题我试着做了什么
  • 正如我在StackOverflow(本问题开头的链接)上读到的,TF2被认为足以输出Keras模型,该模型将由我的
    tflite\u convert
    CLI正确处理。但显然不是

  • 当我在GitHub上读到它时,我尝试在Keras的损失函数中手动设置我的自定义损失函数,方法是添加以下行:
    import tensorflow.Keras.loss
    tensorflow.keras.loss.build_vgg19_loss_network=build_vgg19_loss_network
    。它不起作用

  • 我在GitHub上读到,我可以使用带有
    load\u model
    Keras函数的自定义对象:但我只想使用
    compile
    Keras函数。不
    加载\u模型

  • 我的最后一个问题
    我只想对我的代码做一些小的修改,因为它工作得很好。例如,我不想将
    compile
    替换为
    load\u model
    。有了这个限制,您能否帮助我使我的CLI
    tflite\u convert
    与我的自定义丢失功能一起工作?

    既然您声称tflite转换由于自定义丢失功能而失败,您可以保存模型文件而不保留优化器详细信息。为此,请将
    include\u 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)
    

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

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

    为什么不将pb文件中的权重加载到网络中,然后使用我在回答中显示的API以h5或saved_模型格式保存模型。然后,您可以使用这个Python API本身将h5或保存的_模型格式转换为TFLite:您能告诉我错误的名称吗?我想这是一个警告。能否在目录中检查是否创建了tflite文件?如果没有,请将您的h5文件上传到某个地方并共享链接,以便检查。我已编辑代码以转换h5文件。您的h5文件正在使用上述代码进行转换。如果您需要,我可以为您上载tflite文件。这是下载该文件的链接:我无法在CPU中转换它。我使用了Google Colab中提供的免费GPU。只需添加“优化器”和“编译”对于使用模型来说根本不是必需的。优化器的唯一作用是“培训”。如果模型已经被训练,而你不再训练它,你就不需要优化器或损失。这并不能真正回答问题。如果您有不同的问题,可以单击以提问。一旦你有足够的时间,你也可以吸引更多的注意力-