使用 Tensorflow.keras 组织项目。应该是 tf.keras.Model 的一个子类吗?
Posted
技术标签:
【中文标题】使用 Tensorflow.keras 组织项目。应该是 tf.keras.Model 的一个子类吗?【英文标题】:Project organization with Tensorflow.keras. Should one subclass tf.keras.Model? 【发布时间】:2020-02-29 07:06:24 【问题描述】:我正在使用 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 文件加载的,每种数据类型都有一个输入函数,所有估计器都使用该函数将这种类型的数据作为输入。我在主脚本中的模型(即返回模型的函数)之间切换。我还有一些构建块,它们是多个模型的一部分,为此我使用帮助函数返回它们,并使用 Keras 函数式 API 拼凑最终结果。
不同模型的轻微不兼容性开始让我感到困惑,我决定使用类来组织项目。我计划为每个模型创建一个类,以跟踪超参数并正确命名每个模型及其模型目录。但是,我想知道在 Tensorflow 中是否有既定的或推荐的方法来做到这一点。
问题:我应该继承tf.keras.Model
而不是使用函数来构建模型或封装它们的python 类吗?将 keras.Model 子类化会破坏(或需要大量工作才能启用)我与 keras 估计器和张量板一起使用的任何功能吗?我已经看到人们在使用自定义模型类时遇到了很多问题,并且有点不愿意投入工作,只是发现它对我不起作用。您对如何更好地组织我的项目有其他建议吗?
非常感谢您。
【问题讨论】:
【参考方案1】:似乎是一个合理的做法:https://www.tensorflow.org/guide/keras/custom_layers_and_modelshttps://www.tensorflow.org/api_docs/python/tf/keras/Modelguide
【讨论】:
【参考方案2】:仅在绝对需要时才进行子类化。我个人更喜欢遵循以下实施顺序。如果您正在设计的模型的复杂性无法使用前两个选项来实现,那么子类化当然是唯一的选择。
-
tf.keras 顺序 API
tf.keras 函数式 API
子类 tf.keras.Model
【讨论】:
感谢您的回答!我的模型的复杂性可以使用功能 API 来实现。我想知道子类化模型是否会使我的项目更有条理。教程(例如 Models: Composing layer 中的 tensorflow.org/tutorials/customization/custom_layers)似乎表明有时会这样做。例如,深度网络中的循环块有自己的类。您对我的案例的建议是继续使用返回模型或普通 python 类的函数来组织项目? 这取决于:如果您的目标是通过 tf.keras 提供的所有 TF 魔法当前分类来生成有效解决方案的简洁快捷的路径,那么按照我的建议进行操作。但是,如果出于某种原因您确实想了解模型的内部工作原理以及类似的手工制作,那么尽管可能会很痛苦,但请使用模型子类化。我建议您参考 Dense 层的源代码,以查看并将其与模型中的手动编码层进行比较。这是一条更长的路,但随着时间的推移,这将使您有更多的时间来调整/开发代码。以上是关于使用 Tensorflow.keras 组织项目。应该是 tf.keras.Model 的一个子类吗?的主要内容,如果未能解决你的问题,请参考以下文章
基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别
如何减少 Tensorflow/Keras 使用的 CPU 数量?
Tensorflow+Keras用Tensorflow.keras的方法替代keras.layers.merge
Tensorflow+Keras用Tensorflow.keras的方法替代keras.layers.merge