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

Python Tensorflow.keras的项目组织。应该有一个子类tf.keras.Model吗?,python,tensorflow,tensorflow-estimator,tf.keras,Python,Tensorflow,Tensorflow Estimator,Tf.keras,我正在使用Tensorflow 1.14和tf.kerasAPI构建大量(>10)个不同的神经网络。(我还对使用Tensorflow 2回答这个问题感兴趣)。我在想我该如何组织我的项目 我使用tf.keras.estimator.model_to_estimator和Tensorboard将keras模型转换为估计器,以便可视化。我有时还使用model.summary()。我的每个模型都有许多(>20)超参数,并将三种类型的输入数据中的一种作为输入。我有时使用超参数优化,因此我经常手动删除模型,

我正在使用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()

目前,我使用的函数将超参数作为参数,并返回各自编译的keras模型以转换为估计器。我使用三种不同的“Main_Datatype.py”脚本来训练三种不同输入数据类型的模型。所有数据都是从.tfrecord文件加载的,每个数据类型都有一个输入函数,所有将该类型数据作为输入的估计器都使用该函数。我在主脚本中切换模型(即返回模型的函数)。我还有一些构建块,它们是多个模型的一部分,对于这些构建块,我使用helper函数返回它们,并使用Keras函数API将最终结果拼接在一起

不同模型之间的轻微不兼容开始让我感到困惑,我决定用类来组织这个项目。我计划为每个模型创建一个类,跟踪每个模型及其模型目录的超参数和正确命名。然而,我想知道在Tensorflow中是否有既定或推荐的方法来实现这一点

问题:我应该子类化
tf.keras.Model
而不是使用函数来构建模型或封装它们的python类吗?子类化keras.Model会破坏(或需要大量工作才能实现)我在keras估计器和tensorboard中使用的任何功能吗?我看到了人们在使用自定义模型类时遇到的许多问题,我有点不愿意投入到这项工作中,结果却发现它不适合我。你对如何更好地组织我的项目还有其他建议吗


事先非常感谢。

似乎是一个合理的做法:

只有在绝对需要时才使用子类。我个人更倾向于遵循以下实施顺序。如果您正在设计的模型的复杂性无法通过使用前两个选项来实现,那么子类化当然是唯一剩下的选项

  • tf.keras顺序API
  • tf.keras函数API
  • 子类tf.keras.Model

  • 谢谢你的回答!我的模型的复杂性可以通过使用函数API来实现。我想知道子类化模型是否会使我的项目更加结构化。教程(例如,在模型中:合成层)似乎建议有时这样做。例如,深度网络中的循环块会获得自己的类。对于我的案例,您的建议是继续使用返回模型或普通python类的函数来组织项目?这取决于:如果您的目标是通过TF.keras提供的所有TF向导的当前分类,以简洁、快速的方式生成工作解决方案,那么请按照我的建议进行操作。然而,如果出于某种原因,您真的想知道模型的内部工作原理和类似的手工操作,那么尽管这可能会很痛苦,但还是使用模型子类化。我建议您参考密集层的源代码,查看并将其与模型中的手动编码层进行比较。这是一条较长的路径,但随着时间的推移,这将为您提供更多的里程来调整/开发代码。