项目组织 Tensorflow.keras。应该一个子类tf.keras.Model?

Project organization with Tensorflow.keras. Should one subclass tf.keras.Model?

我正在使用 Tensorflow 1.14 和 tf.keras API 构建多个(>10)不同的神经网络。 (我也对使用 Tensorflow 2 回答这个问题很感兴趣)。我想知道我应该如何组织我的项目。

我使用 tf.keras.estimator.model_to_estimator 和 Tensorboard 将 keras 模型转换为估算器以进行可视化。我有时也会使用 model.summary()。我的每个模型都有一定数量(>20)的超参数,并将三种类型的输入数据中的一种作为输入。我有时会使用超参数优化,这样我经常在尝试下一组超参数之前手动删除模型并使用 tf.keras.backend.clear_session()

目前我正在使用将超参数作为参数的函数,return 将相应的已编译 keras 模型转换为估算器。我使用三种不同的 "Main_Datatype.py" 脚本来训练三种不同输入数据类型的模型。所有数据都从 .tfrecord 文件加载,并且每种数据类型都有一个输入函数,所有估计器都使用该函数将该类型的数据作为输入。我在主脚本中切换模型(即函数 returning 模型)。我还有一些构建块是多个模型的一部分,为此我使用辅助函数 returning 它们,使用 Keras 函数 API.

拼凑最终结果

不同模型的轻微不兼容性开始让我感到困惑,我决定使用 classes 组织项目。我计划为每个模型制作一个 class 来跟踪超参数并正确命名每个模型及其模型目录。但是,我想知道在 Tensorflow 中是否有既定或推荐的方法来执行此操作。

问题:我应该subclassing tf.keras.Model而不是使用函数来构建模型还是python class是封装它们的吗? subclassing keras.Model 会破坏(或需要大量工作才能启用)我在 keras 估算器和 tensorboard 中使用的任何功能吗?我已经看到人们在使用自定义模型 classes 时遇到的许多问题,我有点不愿意投入工作,只是发现它对我不起作用。您对如何更好地组织我的项目有其他建议吗?

非常感谢您。

似乎是合理的做法:https://www.tensorflow.org/guide/keras/custom_layers_and_models https://www.tensorflow.org/api_docs/python/tf/keras/Model guide

仅在绝对需要时才进行子类化。我个人更喜欢遵循以下实施顺序。如果您设计的模型很复杂,使用前两个选项无法实现,那么子类化当然是唯一的选择。

  1. tf.keras 顺序 API
  2. tf.keras 函数式 API
  3. 子类tf.keras.型号