如何引用 Keras?
如果 Keras 有助于您的研究,请在你的出版物中引用它。以下是 BibTeX 条目引用的示例:
如何在 GPU 上运行 Keras?
如果你以 TensorFlow 或 CNTK 后端运行,只要检测到任何可用的 GPU,那么代码将自动在 GPU 上运行。
如何在多 GPU 上运行 Keras 模型?
我们建议使用 TensorFlow 后端来执行这项任务。有两种方法可在多个 GPU 上运行单个模型:数据并行和设备并行。
在大多数情况下,你最需要的是数据并行。
数据并行
数据并行包括在每个设备上复制一次目标模型,并使用每个模型副本处理不同部分的输入数据。Keras 有一个内置的实用函数 keras.utils.multi_gpu_model,它可以生成任何模型的数据并行版本,在多达 8 个 GPU 上实现准线性加速。
有关更多信息,请参阅 multi_gpu_model 的文档。这里是一个快速的例子:
设备并行
设备并行性包括在不同设备上运行同一模型的不同部分。对于具有并行体系结构的模型,例如有两个分支的模型,这种方式很合适。
这种并行可以通过使用 TensorFlow device scopes 来实现。这里是一个简单的例子:
“sample”, “batch”, “epoch” 分别是什么?
为了正确地使用 Keras,以下是必须了解和理解的一些常见定义:
- Sample: 样本,数据集中的一个元素,一条数据。
例1: 在卷积神经网络中,一张图像是一个样本。
例2: 在语音识别模型中,一段音频是一个样本。 - Batch: 批,含有 N 个样本的集合。
每一个 batch 的样本都是独立并行处理的
。
在训练时,一个 batch 的结果只会用来更新一次模型。 一个 batch 的样本通常比单个输入更接近于总体输入数据的分布,batch 越大就越近似
。然而,每个 batch 将花费更长的时间来处理,并且仍然只更新模型一次。在推理(评估/预测)时,建议条件允许的情况下选择一个尽可能大的 batch,(因为较大的 batch 通常评估/预测的速度会更快
)。 - Epoch: 轮次,通常被定义为 「在整个数据集上的一轮迭代」,用于训练的不同的阶段,这有利于记录和定期评估。 当在 Keras 模型的
fit 方法中使用 validation_data 或 validation_split 时,评估将在每个 epoch 结束时运行。 在Keras 中,可以添加专门的用于在 epoch 结束时运行的 callbacks 回调。例如学习率变化和模型检查点(保存)。
如何保存 Keras 模型?
保存/加载整个模型(结构 + 权重 + 优化器状态)
只保存/加载模型的结构
如果只需要保存模型的结构,而非其权重或训练配置项,则可以执行以下操作:
你可以从这些数据建立一个新的模型:
只保存/加载模型的权重
如果只需要模型的权重,可以使用下面的代码以 HDF5 格式进行保存。
请注意,我们首先需要安装 HDF5
和 Python 库 h5py
,它们不包含在 Keras 中。
假设你有用于实例化模型的代码,则可以将保存的权重加载到具有相同结构的模型中:
为什么训练误差比测试误差高很多?
Keras 模型有两种模式:训练和测试。正则化机制,如 Dropout 和 L1/L2 权重正则化,在测试时是关闭的。
此外,训练误差是每批训练数据的平均误差。由于你的模型是随着时间而变化的,一个 epoch 中的第一批数据的误差通常比最后一批的要高。另一方面,测试误差是模型在一个 epoch 训练完后计算的,因而误差较小。
如何用 Keras 处理超过内存的数据集?
可以使用 model.train_on_batch(x,y) 和 model.test_on_batch(x,y)
进行批量训练与测试。请参阅 模型文档。
或者,可以编写一个生成批处理训练数据的生成器,然后使用 model.fit_generator(data_generator,steps_per_epoch,epochs)
方法。
可以在 CIFAR10 example 中找到实践代码。
在验证集的误差不再下降时,如何中断训练?
可以使用 EarlyStopping
回调:
验证集划分是如何计算的?
如果将 model.fit
中的 validation_split
参数设置为 0.1,那么使用的验证数据将是最后 10% 的数据。如果设置为 0.25,就是最后 25% 的数据。注意,在提取分割验证集之前,数据不会被混洗,因此验证集仅仅是传递的输入中最后一个 x% 的样本。
所有 epoch 都使用相同的验证集(在同一个 fit 中调用)。
在训练过程中数据是否会混洗?
是的,如果 model.fit中的 shuffle参数设置为 True(默认值),则训练数据将在每个 epoch 混洗。
验证集永远不会混洗。
如何在每个 epoch 后记录训练集和验证集的误差和准确率?
model.fit 方法返回一个 History 回调,它具有包含连续误差的列表和其他度量的 history 属性。
如何「冻结」网络层?
「冻结」一个层意味着将其排除在训练之外,即其权重将永远不会更新。这在微调模型或使用固定的词向量进行文本输入中很有用。
可以将 trainable 参数(布尔值)传递给一个层的构造器,以将该层设置为不可训练的:
如何从 Sequential 模型中移除一个层?
可以通过调用 .pop() 来删除 Sequential 模型中最后添加的层:
如何在 Keras 中使用预训练的模型?
Keras中提供了以下图像分类模型的代码和预训练的权重:
Xception
VGG16
VGG19
ResNet50
Inception v3
Inception-ResNet v2
MobileNet v1
DenseNet
NASNet
MobileNet v2
它们可以使用 keras.applications
模块进行导入:
如何在 Keras 中使用 HDF5 输入?
你可以使用 keras.utils.io_utils 中的 HDF5Matrix 类。有关详细信息,请参阅 HDF5Matrix文档。
你也可以直接使用 HDF5 数据集: