Keras 作者 François Chollet 近日发表了一系列推文,如果你使用 TensorFlow 2.0 Keras 做深度学习研究,这里有你需要知道的一切。
TensorFlow 2.0 前几天新鲜出炉,Alpha 版可以抢先体验。新版本主打简单易用可扩展,大大简化了 API。
Keras 作者 François Chollet 今天发表了一系列推文,用12个示例解释了使用TensorFlow 2.0 Keras 的一些重要技巧。
如果你使用 TF 2.0 Keras 做深度学习研究,这里有你需要知道的一切。
Keras 作者 François Chollet
1)你需要知道的第一个类是 “Layer”。一个 Layer 封装了一个状态 (权重) 和一些计算 (在 “call” 方法中定义)。
2)“add_weight” 方法提供了创建权重的快捷方式。
3)最好在一个单独的 “build” 方法中创建权重,使用你的 layer 看到的第一个输入的形状来调用该方法。这种模式让我们不用必须指定’ input_dim ‘:
4)你可以通过在 GradientTape 中调用 layer 来自动检索该层权重的梯度。使用这些梯度,你可以手动或使用优化器对象来更新 layer 的权重。当然,你也可以在使用梯度之前修改它们。
5)由 layers 创建的权重可以是可训练的,也可以是不可训练的。是否可训练可以在 layer 的属性 “trainable_weights” 和 “non_trainable_weights” 中看到。比如,这是一个具有不可训练权重的层:
6)层可以递归地嵌套,以创建更大的计算块。每一层将跟踪其子层的权重 (包括可训练的和不可训练的)。
7)层会在前向传递时创建损失。这对于正则化损失特别有用。子层创建的损失由父层递归跟踪。
8)这些损失在每次向前传递开始时由顶层清除 —— 它们不会累积。“layer.losses” 总是只包含在 “最后一次” 前向传递时产生的损失。在编写训练循环时,你通常需要将这些损失累加起来使用。
9)TF 2.0 默认情况下是 eager。但是通过将计算编译成静态图,将能够获得更好的性能。静态图是研究人员最好的朋友!你可以通过将其包装在一个 tf.function 中来编译任何函数:
10)有些层,特别是 “BatchNormalization” 层和 “退 Dropout” 层,在训练和推理过程中会表现出不同的行为。对于这样的层,标准做法是在 “call” 方法中加入一个 “training”(boolean) 参数。
11)有很多内置层是可用的,从 Dense 层到 Conv2D 层到 LSTM 层,再到 Conv2DTranspose 或 ConvLSTM2D。你要学会好好重用这些内置函数。
12)要构建深度学习模型,你不必总是使用面向对象编程。到目前为止,我们看到的所有层都可以按函数组合,就像这样 (我们称之为 “Functional API”):
函数式 API 往往比 subclassing 更简洁,并且还有其他优点。
了解关于 Functional API 的更多信息:
https://www.tensorflow.org/alpha/guide/keras/functional
但是,请注意,函数式 API 只能用于定义层的 DAGs—— 递归网络应该定义为 “Layer” 子类。
在研究工作中,你可能经常发现自己混合匹配了 OO 模型和函数式模型。
以上,就是使用 TensorFlow 2.0 Keras 来重新实现大多数深度学习研究论文所需要的全部内容!
现在让我们来看一个非常简单的例子:hypernetworks。
hypernetwork 是一个深度神经网络,它的权重由另一个网络 (通常较小) 生成。
让我们实现一个非常简单的 hypernetwork:我们将使用前面定义的 “Linear” 层,并使用它生成另一个 “Linear” 层。
另一个快速示例:以任何一种风格实现 VAE,可以是 subclassing,或者函数式 API。找到最适合你的方法吧!
subclassing
Functional API
最后,你可以在这个 Colab 笔记本中使用这些代码示例:
https://colab.research.google.com/drive/17u-pRZJnKN0gO5XZmq8n5A2bKGrfKEUg