
Tensorflow.org提供的概述指南的翻译。 本指南将为您提供Keras入门的基础知识。 阅读需要10分钟。
导入tf.keras
tf.keras
是TensorFlow Keras API规范的实现。 这是用于构建和训练模型的高级API,包括对TensorFlow特定功能的一流支持,例如
急切执行 ,
tf.data
管道和
Estimators 。
tf.keras
使TensorFlow的使用更加轻松,而又不牺牲灵活性和性能。
首先,将
tf.keras
作为TensorFlow设置的一部分导入:
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf from tensorflow import keras
tf.keras
可以执行任何与
tf.keras
兼容的代码,但请记住:
- TensorFlow最新发行版中的
tf.keras
版本可能与PyPI中最新的keras
版本不同。 查看tf.keras.__version__
。 - 保存模型权重时,
tf.keras
默认情况下以检查点格式执行此操作。 传递save_format='h5'
参数以使用HDF5(或在文件.h5
添加.h5
扩展.h5
)。
建立一个简单的模型
顺序模型
在Keras中,您收集用于构建
模型的 图层 。 模型是(通常)层图。 最常见的模型类型是层堆栈:
tf.keras.Sequential
模型。
我们构建一个简单的完全连接的网络(即多层感知器):
from tensorflow.keras import layers model = tf.keras.Sequential()
自定义图层
可以使用多种
tf.keras.layers
图层。 它们大多数使用通用的参数构造函数:
activation
:设置图层的激活功能。 此参数指定内置函数或被调用对象的名称。 该参数没有默认值。kernel_initializer
和bias_initializer
:创建层权重(核心和移位)的初始化方案。 此参数可以是名称或被调用对象。 默认的初始化程序是"Glorot uniform"
。kernel_regularizer
和bias_regularizer
:添加到层权重(核心和移位)的正则化方案,例如L1或L2正则化。 默认情况下,未设置正则化。
以下tf.keras.layers.Dense层实例的示例使用构造函数参数:
培训与评估
训练设置
构建模型后,通过调用
compile
方法配置学习过程:
model = tf.keras.Sequential([
tf.keras.Model.compile
接受三个重要参数:
optimizer
:此对象定义培训过程。 将tf.keras.optimizers
模块中的优化程序实例(例如tf.keras.optimizers.Adam
或tf.keras.optimizers.SGD
。 如果只想使用默认选项,则还可以使用诸如'adam'
或'sgd'
关键字指定优化器。loss
:此功能在学习过程中被最小化。 其中常见的变化是标准误差( mse
), categorical_crossentropy
和binary_crossentropy
。 损失函数可以通过名称指定,也可以通过从tf.keras.losses
模块传递被调用的对象来tf.keras.losses
。metrics
:用于监视培训。 这些是字符串名称或来自tf.keras.metrics
模块的称为对象。- 此外,为确保模型得到了正确的训练和评估,请检查是否已将参数
run_eagerly=True
传递给编译器
接下来,我们将看到一些用于训练的模型配置示例:
从NumPy数据中学习
对于较小的数据集,请使用NumPy的内存数组来训练和评估模型。 使用`fit`方法对训练数据进行“训练”:
import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) model.fit(data, labels, epochs=10, batch_size=32)
tf.keras.Model.fit
接受三个重要参数:
epochs
:学习分为*时代*。 这个时代是所有输入数据的一次迭代(这是小批量完成的)。batch_size
:传输NumPy数据时,模型将数据分成较小的块(批),并在训练期间在这些块上进行迭代。 该数字表示每个数据块的大小。 请记住,如果记录总数未除以批处理大小,则最后一个块可能会更小。validation_data
:在对模型进行原型制作时,您希望轻松地在验证数据上跟踪其性能。 使用此参数传递输入数据和标签的元组,可使模型在每个时代结束时传输的数据的输出模式下显示损失函数和度量的值。
这是使用
validation_data
的示例:
import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) val_data = np.random.random((100, 32)) val_labels = np.random.random((100, 10)) model.fit(data, labels, epochs=10, batch_size=32, validation_data=(val_data, val_labels))
使用tf.data数据集进行训练
使用Datasets API可以扩展大型数据库或在多个设备上进行训练。 将tf.data.Dataset的实例传递给
fit
方法:
由于
Dataset
批量提供数据,因此这段代码不需要
batch_size
参数。
数据集还可用于验证:
dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels)) val_dataset = val_dataset.batch(32) model.fit(dataset, epochs=10, validation_data=val_dataset)
评估与预测
tf.keras.Model.evaluate
和
tf.keras.Model.predict
可以使用NumPy和
tf.data.Dataset
。
您可以通过以下方式
估算输出模式下
的损失以及所提供数据的指标:
以下是如何以NumPy数组的形式针对提供的数据在输出模式下
预测最后一级的输出:
建立复杂的模型
功能性API
tf.keras.Sequential
模型是一个简单的层堆栈,您无法想象其中的任意模型。 使用Keras功能API构建复杂的模型拓扑,例如:
- 多种输入模型
- 具有多个输出的模型
- 具有公共层的模型(同一层被多次调用),
- 数据流不一致的模型(例如残差关系)。
使用功能性API构建模型的工作方式如下:
- 图层实例是可调用的,并返回张量。
- 输入和输出张量用于确定
tf.keras.Model
的实例 - 该模型的训练就像“顺序”模型一样。
以下示例使用功能性API构建简单的完全连接的网络:
inputs = tf.keras.Input(shape=(32,))
使用这些输入和输出创建模型的实例。
model = tf.keras.Model(inputs=inputs, outputs=predictions)
子类化模型
使用子类
tf.keras.Model
并定义您自己的直接分布来创建完全可定制的模型。 在
__init__
方法中创建图层,并将其设置为类实例的属性。 在
call
方法中定义直接传播。
在启用急切执行时,对模型进行子类化特别有用,因为它使您能够强制性地编写直接分布。
注意:如果希望模型
始终按命令执行,则可以在调用
super
构造函数时将
dynamic=True
设置
dynamic=True
。
关键点:使用正确的API即可工作。 尽管对模型进行子类化可以提供灵活性,但是您必须为模型付出更多的复杂性和更大的自定义错误可能性。 如果可能,请选择功能性API。
以下示例显示了使用自定义直接分发的子类tf.keras.Model模型,这不是必须的:
class MyModel(tf.keras.Model): def __init__(self, num_classes=10): super(MyModel, self).__init__(name='my_model') self.num_classes = num_classes
创建新模型类的实例:
model = MyModel(num_classes=10)
自定义图层
通过
tf.keras.layers.Layer
并实现以下方法来创建自定义层:
__init__
:可选地指定要在该层中使用的子层。- *
build
:创建图层权重。 使用add_weight
方法添加权重 call
:定义直接分配。- (可选)可以通过实现
get_config
方法和from_config
类from_config
来序列化该层。
以下是一个用户层示例,该示例将输入到输入的矩阵(
matmul
)与内核矩阵相乘:
class MyLayer(layers.Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape):
使用您的自定义层创建模型:
model = tf.keras.Sequential([ MyLayer(10), layers.Activation('softmax')])
科尔贝基
Kolbek是转移到模型的对象,用于在训练期间自定义和扩展其行为。 您可以编写自己的自定义回调或使用内置的
tf.keras.callbacks
,其中包括:
tf.keras.callbacks.ModelCheckpoint
:定期保存模型断点。
tf.keras.callbacks.LearningRateScheduler
:动态更改学习步骤。
tf.keras.callbacks.EarlyStopping
:当验证结果停止改善时,停止训练。
tf.keras.callbacks.TensorBoard:
使用
tf.keras.callbacks.TensorBoard:
监视模型行为
张量板
要使用
tf.keras.callbacks.Callback
,请将其传递给
fit
模型方法:
callbacks = [
保存和还原
仅保存重量值
使用
tf.keras.Model.save_weights
保存和加载模型权重:
model = tf.keras.Sequential([ layers.Dense(64, activation='relu', input_shape=(32,)), layers.Dense(10, activation='softmax')]) model.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])
默认情况下,模型权重以TensorFlow检查点格式保存。 权重也可以Keras HDF5格式保存(Keras通用实现的默认值):
仅保存模型配置
可以保存模型的配置-这无需任何权重就可以序列化模型的体系结构。 即使没有代码定义原始模型,保存的配置也可以还原和初始化相同的模型。 Keras支持JSON和YAML序列化格式:
import json import pprint pprint.pprint(json.loads(json_string))
从JSON还原模型(重新初始化):
fresh_model = tf.keras.models.model_from_json(json_string)
将模型序列化为YAML需要
在导入TensorFlow之前安装`pyyaml`:
yaml_string = model.to_yaml() print(yaml_string)
从YAML还原模型:
fresh_model = tf.keras.models.model_from_yaml(yaml_string)
注意:子类模型不可序列化,因为其体系结构是由`call`方法主体中的Python代码定义的。
将整个模型保存在一个文件中
整个模型可以保存到包含权重值,模型配置甚至优化器配置的文件中。 这将使您可以设置模型断点,并在以后即使不访问源代码也可以从完全相同的位置继续进行训练。
# model = tf.keras.Sequential([ layers.Dense(10, activation='softmax', input_shape=(32,)), layers.Dense(10, activation='softmax') ]) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(data, labels, batch_size=32, epochs=5) # HDF5 model.save('my_model.h5') # . model = tf.keras.models.load_model('my_model.h5')
急于执行
急切的执行是必须立即执行操作的命令式编程环境。
tf.keras
不需要此功能,但
tf.keras
支持
tf.keras
,这对于检查程序和调试很有用。
`tf.keras` API的所有构建模型都与热切执行兼容。 尽管可以使用`Sequential`和功能性API,但是在
对模型进行
子类化和构建
自定义层时,急切执行特别有用-这些API要求您以代码形式编写直接分发(而不是通过组装现有层来创建模型的API)。
经销
多个GPU
tf.keras
模型可以使用
tf.distribute.Strategy
在多个GPU上运行。 该API提供了跨多个GPU的分布式学习,而对现有代码的更改很少甚至没有更改。
当前,
tf.distribute.MirroredStrategy
唯一受支持的分发策略。
MirroredStrategy
复制图
一台机器上使用全归约同步学习。 要使用`
distribute.Strategy
,请将模型的优化器安装,设计和编译嵌套在`
Strategy
.scope()
`中,然后训练模型。
以下示例在同一台计算机上的多个GPU之间分配
tf.keras.Model
。
首先,我们在分布式策略范围内定义一个模型:
strategy = tf.distribute.MirroredStrategy() with strategy.scope(): model = tf.keras.Sequential() model.add(layers.Dense(16, activation='relu', input_shape=(10,))) model.add(layers.Dense(1, activation='sigmoid')) optimizer = tf.keras.optimizers.SGD(0.2) model.compile(loss='binary_crossentropy', optimizer=optimizer) model.summary()
然后我们像往常一样在数据上训练模型:
x = np.random.random((1024, 10)) y = np.random.randint(2, size=(1024, 1)) x = tf.cast(x, tf.float32) dataset = tf.data.Dataset.from_tensor_slices((x, y)) dataset = dataset.shuffle(buffer_size=1024).batch(32) model.fit(dataset, epochs=1)
经过验证后,翻译也将出现在Tensorflow.org上。 如果您想参与将Tensorflow.org网站的文档翻译成俄语,请以个人身份或评论联系。 任何更正或评论表示赞赏。