TensorFlow版本:1.10.0 > Guide > Keras
Keras 简介
Keras 是建立和训练深度学习模型的高级 API。它被用于快速原型、高级研究和生产。Keras 具有三个主要优点:
- 好用的 API
Keras API 简单、稳定、容易调试。 - 高度模块化
Keras API 可以像搭积木一样来构建深度学习系统。 - 易于扩展
可以很容易地实现研究过程中的各种新奇想法。
比如:自定义层、自定义损失函数、提升state of art 模型的性能等。
文章目录
1. 导入 tf.keras
¶
tf.keras
是 Keras API 在 TensorFlow 里的实现。Keras 是一个高级 API,用于构建和训练模型,同时兼容 TensorFlow 的绝大部分功能,比如,eager execution,tf.data
模块,及 Estimators。
tf.keras
使得 TensorFlow 更容易使用,且保持 TF 的灵活性和性能。
使用 tf.keras
,首先需要在您的代码开始时导入tf.keras
:
import tensorflow as tf
from tensorflow import keras
tf.keras
与 keras
绝对兼容,但请注意:
tf.keras
与keras
版本相同时,才绝对兼容。可以通过tf.keras.__version__
.来查看tf.keras
的版本。- 保存模型参数时,
tf.keras
默认保存成 checkpoint 格式。可以通过设置save_format=‘h5’
来保存成 HDF5 格式。
2. 建立简单模型 ¶
2.1 使用 Sequential API 建立简单模型 ¶
在 Keras 里,你用 layers 来搭建模型。一个模型(通常)是一个 layer 组成的图(Graph)。最常见的模型类型一般是由多个 layer 堆叠体:tf.keras.Sequential
模型
以构建一个简单的全连接网络(比如:多层感知器)为例:
model = keras.Sequential()
# Adds a densely-connected layer with 64 units to the model:
model.add(keras.layers.Dense(64, activation='relu'))
# Add another:
model.add(keras.layers.Dense(64, activation='relu'))
# Add a softmax layer with 10 output units:
model.add(keras.layers.Dense(10, activation='softmax'))
2.2 设置层的参数 ¶
在 tf.keras.layers
中有很多层,下面是一些通用的构造函数的参数:
activation
:设置层使用的激活函数。
指定方法:名称 或 可调用对象
默认为空。kernel_initializer
和bias_initializer
:设置层创建时,权重和偏差的初始化方法。
指定方法:名称 或 可调用对象
默认为"Glorot uniform"
initializer。kernel_regularizer
和bias_regularizer
:设置层的权重、偏差的正则化方法。比如:L1 或 L2 正则。
默认为空。
下面是一个实例,例子中对层的参数进行了指定:
# Create a sigmoid layer:
layers.Dense(64, activation='sigmoid')
# Or:
layers.Dense(64, activation=tf.sigmoid)
# A linear layer with L1 regularization of factor 0.01 applied to the kernel matrix:
layers.Dense(64, kernel_regularizer=keras.regularizers.l1(0.01))
# A linear layer with L2 regularization of factor 0.01 applied to the bias vector:
layers.Dense(64, bias_regularizer=keras.regularizers.l2(0.01))
# A linear layer with a kernel initialized to a random orthogonal matrix:
layers.Dense(64, kernel_initializer='orthogonal')
# A linear layer with a bias vector initialized to 2.0s:
layers.Dense(64, bias_initializer=keras.initializers.constant(2.0))
3. 建立复杂模型 ¶
3.1 使用 Function API 建立复杂模型 ¶
tf.keras.Sequential
模型只适用于多层简单堆叠网络,不能表示复杂模型。使用 Keras functional API 可以构建有复杂拓扑结构的模型。比如:
- 多个输入的模型(Multi-input models)
- 多个输出的模型(Multi-output models)
- 有共享层的模型(Models with shared layers (the same layer called several times))
- 有 non-sequential 数据流的模型(Models with non-sequential data flows (例如,残差连接))
函数式 API 特点:
- 层是可调用的,返回值是一个 tensor。
- 输入 tensors 和输出 tensors 被用来定义一个
tf.keras.Model
实例。 - 函数式 API 构建的模型的训练同
Sequential
模型。
下面的代码使用函数式 API 构建了一个简单的全连接网络:
inputs = keras.Input(shape=(32,)) # Returns a placeholder tensor
# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)
# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)
# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# Trains for 5 epochs
model.fit(data, labels, batch_size=32, epochs=5)
3.2 编写 Model 的子类来构建模型(Model subclassing) ¶
通过编写 tf.keras.Model
的子类来构建一个自定义模型,并且定义你的模型的前向传播。在 init
方法里创建 layers。在 call
方法里定义前向传播过程。
当使用 eager execution 时,Model subclassing 方法特别有用(pytorch 里确实也是这么干的)。
提示: 根据工作的不同,请使用不同的 API。虽然 model subclassing 提供了灵活性,但也更复杂、更容易出错。如果可能,请尽量使用 function API。
下面是 model subclassing 例子:
class MyModel(keras.Model):
def __init__(self, num_