Keras FAQ: 常见问题解答
- 如何引用 Keras?
- 如何在 GPU 上运行 Keras?
- 如何在多 GPU 上运行 Keras 模型?
- "sample", "batch", "epoch" 分别是什么?
- 如何保存 Keras 模型?
- 为什么训练集误差比测试集的误差高很多?
- 如何获取中间层的输出?
- 如何用 Keras 处理超过内存的数据集?
- 在验证集的误差不再下降时,如何中断训练?
- 验证集划分是如何计算的?
- 在训练过程中数据是否会混洗?
- 如何在每个 epoch 后记录训练集和验证集的误差和准确率?
- 如何「冻结」网络层?
- 如何使用状态 RNNs (stateful RNNs)?
- 如何从 Sequential 模型中移除一个层?
- 如何在 Keras 中使用预训练的模型?
- 如何在 Keras 中使用 HDF5 输入?
- Keras 配置文件保存在哪里?
- 如何在 Keras 开发过程中获取可复现的结果?
- 如何在 Keras 中安装 HDF5 或 h5py 来保存我的模型?
如何引用 Keras?
如果 Keras 有助于您的研究,请在你的出版物中引用它。以下是 BibTeX 条目引用的示例:
@misc{chollet2015keras,
title={Keras},
author={Chollet, Fran\c{c}ois and others},
year={2015},
publisher={GitHub},
howpublished={\url{https://github.com/keras-team/keras}},
}
如何在 GPU 上运行 Keras?
如果你以 TensorFlow 或 CNTK 后端运行,只要检测到任何可用的 GPU,那么代码将自动在 GPU 上运行。
如果你以 Theano 后端运行,则可以使用以下方法之一:
方法 1: 使用 Theano flags。
THEANO_FLAGS=device=gpu,floatX=float32 python my_keras_script.py
"gpu" 可能需要根据你的设备标识符(例如gpu0,gpu1等)进行更改。
方法 2: 创建 .theanorc
: 指导教程
方法 3: 在代码的开头手动设置 theano.config.device
, theano.config.floatX
:
import theano
theano.config.device = 'gpu'
theano.config.floatX = 'float32'
如何在多 GPU 上运行 Keras 模型?
我们建议使用 TensorFlow 后端来执行这项任务。有两种方法可在多个 GPU 上运行单个模型:数据并行和设备并行。
在大多数情况下,你最需要的是数据并行。
数据并行
数据并行包括在每个设备上复制一次目标模型,并使用每个模型副本处理不同部分的输入数据。Keras 有一个内置的实用函数 keras.utils.multi_gpu_model
,它可以生成任何模型的数据并行版本,在多达 8 个 GPU 上实现准线性加速。
有关更多信息,请参阅 multi_gpu_model 的文档。这里是一个快速的例子:
from keras.utils import multi_gpu_model
# 将 `model` 复制到 8 个 GPU 上。
# 假定你的机器有 8 个可用的 GPU。
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
optimizer='rmsprop')
# 这个 `fit` 调用将分布在 8 个 GPU 上。
# 由于 batch size 为 256,每个 GPU 将处理 32 个样本。
parallel_model.fit(x, y, epochs=20, batch_size=256)
设备并行
设备并行性包括在不同设备上运行同一模型的不同部分。对于具有并行体系结构的模型,例如有两个分支的模型,这种方式很合适。
这种并行可以通过使用 TensorFlow device scopes 来实现。这里是一个简单的例子:
# 模型中共享的 LSTM 用于并行编码两个不同的序列
input_a = keras.Input(shape=(140, 256))
input_b = keras.Input(shape=(140, 256))
shared_lstm = keras.layers.LSTM(64)
# 在一个 GPU 上处理第一个序列
with tf.device_scope('/gpu:0'):
encoded_a = shared_lstm(tweet_a)
# 在另一个 GPU上 处理下一个序列
with tf.device_scope('/gpu:1'):
encoded_b = shared_lstm(tweet_b)
# 在 CPU 上连接结果
with tf.device_scope('/cpu:0'):
merged_vector = keras.layers.concatenate([encoded_a, encoded_b],
axis=-1)