Keras官方中文版文档正式发布

机器之心整理

参与:思源

今年 1 月 12 日,Keras 作者 François Chollet‏ 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目。而昨日,François Chollet‏ 再一次在推特上表示 Keras 官方文档已经基本完成!他非常感谢翻译和校对人员两个多月的不懈努力,也希望 Keras 中文使用者能继续帮助提升文档质量。

这一次发布的是 Keras 官方中文文档,它得到了严谨的校对而提升了整体质量。但该项目还在进行中,虽然目前已经上线了很多 API 文档和使用教程,但仍然有一部分内容没有完成。其实早在官方中文文档出现以前,就有开发者构建了 Keras 的中文文档,而且很多读者都在使用 MoyanZitto 等人构建的中文文档。

  • Keras 官方文档:https://keras.io/zh/
  • Keras 第三方文档:http://keras-cn.readthedocs.io/en/latest/

以下我们将简要介绍这次官方发布的 Keras 文档。

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow、CNTK、或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

如果你有如下需求,请选择 Keras:

  • 允许简单而快速的原型设计(用户友好,高度模块化,可扩展性)。
  • 同时支持卷积神经网络和循环神经网络,以及两者的组合。
  • 在 CPU 和 GPU 上无缝运行与切换。

Keras 兼容的 Python 版本: Python 2.7-3.6。

Keras 相对于其它深度学习库非常容易构建:首先它提供一致和简单的 API;其次,它提供独立的、完全可配置的模块构成序列或图表以完成模型;最后,作为新的类和函数,新的模块很容易扩展。这样说可能比较抽象,但正如文档中所描述的,我们甚至在 30 秒就能快速上手 Keras。所以在坑外徘徊或准备入坑 Keras 的小伙伴可以开心地开始你们的 30 秒。

快速开始:30 秒上手 Keras

Keras 的核心数据结构是 model,一种组织网络层的方式。最简单的模型是 Sequential 模型,它是由多网络层线性堆叠的栈。对于更复杂的结构,你应该使用 Keras 函数式 API,它允许构建任意的神经网络图。

Sequential 模型如下所示:

from keras.models import Sequential model = Sequential()

可以简单地使用 .add() 来堆叠模型:

from keras.layers import Dense model.add(Dense(units=64, activation='relu', input_dim=100)) model.add(Dense(units=10, activation='softmax'))

在完成了模型的构建后, 可以使用 .compile() 来配置学习过程:

model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

如果需要,你还可以进一步地配置优化器。Keras 的一个核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性)。

model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))

现在,你可以批量地在训练数据上进行迭代了:

# x_train and y_train are Numpy arrays --just like in the Scikit-Learn API. model.fit(x_train, y_train, epochs=5, batch_size=32)

或者,你可以手动地将批次的数据提供给模型:

model.train_on_batch(x_batch, y_batch)

只需一行代码就能评估模型性能:

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

或者对新的数据生成预测:

classes = model.predict(x_test, batch_size=128)

构建一个问答系统,一个图像分类模型,一个神经图灵机,或者其他的任何模型,就是这么的快。深度学习背后的思想很简单,那么它们的实现又何必要那么痛苦呢?

使用简介

Keras 模型的使用一般可以分为顺序模型(Sequential)和 Keras 函数式 API,顺序模型是多个网络层的线性堆叠,而 Keras 函数式 API 是定义复杂模型(如多输出模型、有向无环图,或具有共享层的模型)的方法。以下将简要介绍两种模型的使用方法:

1.Keras 顺序模型

你可以通过将层的列表传递给 Sequential 的构造函数,来创建一个 Sequential 模型:

from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential([ Dense(32, input_shape=(784,)), Activation('relu'), Dense(10), Activation('softmax'), ])

也可以使用 .add() 方法将各层添加到模型中:

model = Sequential() model.add(Dense(32, input_dim=784)) model.add(Activation('relu'))

如下展示了一个完整的模型,即基于多层感知器 (MLP) 的 softmax 多分类:

import keras from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.optimizers import SGD # 生成虚拟数据 import numpy as np x_train = np.random.random((1000, 20)) y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10) x_test = np.random.random((100, 20)) y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10) model = Sequential() # Dense(64) 是一个具有 64 个隐藏神经元的全连接层。 # 在第一层必须指定所期望的输入数据尺寸,在这里是一个 20 维的向量。 model.add(Dense(64, activation='relu', input_dim=20)) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) model.fit(x_train, y_train, epochs=20, batch_size=128) score = model.evaluate(x_test, y_test, batch_size=128)

2. Keras 函数式 API

利用函数式 API,可以轻易地重用训练好的模型:可以将任何模型看作是一个层,然后通过传递一个张量来调用它。注意,在调用模型时,您不仅重用模型的结构,还重用了它的权重。

以下是函数式 API 的一个很好的例子:具有多个输入和输出的模型。函数式 API 使处理大量交织的数据流变得容易。

来考虑下面的模型。我们试图预测 Twitter 上的一条新闻标题有多少转发和点赞数。模型的主要输入将是新闻标题本身,即一系列词语,但是为了增添趣味,我们的模型还添加了其他的辅助输入来接收额外的数据,例如新闻标题的发布的时间等。该模型也将通过两个损失函数进行监督学习。较早地在模型中使用主损失函数,是深度学习模型的一个良好正则方法。

模型结构如下图所示:

让我们用函数式 API 来实现它(详细解释请查看中文文档):

from keras.layers import Input, Embedding, LSTM, Dense from keras.models import Model # 标题输入:接收一个含有 100 个整数的序列,每个整数在 1 到 10000 之间。 # 注意我们可以通过传递一个 `name` 参数来命名任何层。 main_input = Input(shape=(100,), dtype='int32', name='main_input') # Embedding 层将输入序列编码为一个稠密向量的序列,每个向量维度为 512。 x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input) # LSTM 层把向量序列转换成单个向量,它包含整个序列的上下文信息 lstm_out = LSTM(32)(x) auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out) auxiliary_input = Input(shape=(5,), name='aux_input') x = keras.layers.concatenate([lstm_out, auxiliary_input]) # 堆叠多个全连接网络层 x = Dense(64, activation='relu')(x) x = Dense(64, activation='relu')(x) x = Dense(64, activation='relu')(x) # 最后添加主要的逻辑回归层 main_output = Dense(1, activation='sigmoid', name='main_output')(x) model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output]) model.compile(optimizer='rmsprop', loss='binary_crossentropy', loss_weights=[1., 0.2]) model.fit([headline_data, additional_data], [labels, labels], epochs=50, batch_size=32) model.compile(optimizer='rmsprop', loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'}, loss_weights={'main_output': 1., 'aux_output': 0.2}) # 然后使用以下方式训练: model.fit({'main_input': headline_data, 'aux_input': additional_data}, {'main_output': labels, 'aux_output': labels}, epochs=50, batch_size=32)

以上只是一个简单的案例,Keras 函数式 API 还有非常多的应用案例,包括层级共享、有向无环图和残差网络等顶尖视觉模型,读者可以继续阅读中文文档了解更多

文档的后一部分更多是描述 Keras 中常用的函数与 API,包括 Keras 模型、层级函数、预处理过程、损失函数、最优化方法、数据集和可视化等。这些 API 和对应实现的功能其实很多时候可以在实际使用的时候再查找,当然最基本的 API 我们还是需要了解的。以下将简要介绍 Keras 模型和层级 API,其它的模块请查阅原中文文档。

Keras 模型

在 Keras 中有两类模型,顺序模型 和 使用函数式 API 的 Model 类模型。这些模型有许多共同的方法:

  • model.summary(): 打印出模型概述信息。它是 utils.print_summary 的简捷调用。
  • model.get_config(): 返回包含模型配置信息的字典。通过以下代码,就可以根据这些配置信息重新实例化模型:

config = model.get_config() model = Model.from_config(config) # or, for Sequential: model = Sequential.from_config(config)

  • model.get_weights(): 返回模型权重的张量列表,类型为 Numpy array。
  • model.set_weights(weights): 从 Nympy array 中为模型设置权重。列表中的数组必须与 get_weights() 返回的权重具有相同的尺寸。
  • model.to_json(): 以 JSON 字符串的形式返回模型的表示。请注意,该表示不包括权重,只包含结构。你可以通过以下代码,从 JSON 字符串中重新实例化相同的模型(带有重新初始化的权重):

from keras.models import model_from_json json_string = model.to_json() model = model_from_json(json_string)

  • model.to_yaml(): 以 YAML 字符串的形式返回模型的表示。请注意,该表示不包括权重,只包含结构。你可以通过以下代码,从 YAML 字符串中重新实例化相同的模型(带有重新初始化的权重):

from keras.models import model_from_yaml yaml_string = model.to_yaml() model = model_from_yaml(yaml_string)

  • model.save_weights(filepath): 将模型权重存储为 HDF5 文件。
  • model.load_weights(filepath, by_name=False): 从 HDF5 文件(由 save_weights 创建)中加载权重。默认情况下,模型的结构应该是不变的。如果想将权重载入不同的模型(部分层相同),设置 by_name=True 来载入那些名字相同的层的权重。

Keras 层级

所有 Keras 层都有很多共同的函数:

  • layer.get_weights(): 以 Numpy 矩阵的形式返回层的权重。
  • layer.set_weights(weights): 从 Numpy 矩阵中设置层的权重(与 get_weights 的输出形状相同)。
  • layer.get_config(): 返回包含层配置的字典。此图层可以通过以下方式重置:

layer = Dense(32) config = layer.get_config() reconstructed_layer = Dense.from_config(config)

如果一个层具有单个节点 (i.e. 如果它不是共享层), 你可以得到它的输入张量,输出张量,输入尺寸和输出尺寸:

  • layer.input
  • layer.output
  • layer.input_shape
  • layer.output_shape

如果层有多个节点,您可以使用以下函数:

  • layer.get_input_at(node_index)
  • layer.get_output_at(node_index)
  • layer.get_input_shape_at(node_index)
  • layer.get_output_shape_at(node_index)

这些是 Keras 模型与层级基本的函数,文档的中心内容也是这一部分和下面描述的 API 用途与参数,它包括完整模型所需要的各个模块,包括数据、预处理、网络架构、训练、评估和可视化等。但这一部分我们并不会介绍,因为很多时候我们只有在遇到未知的函数时才会详细查阅。

Keras 官方中文文档,欢迎各位徘徊者入坑。

原文发布于微信公众号 - 目标检测和深度学习(The_leader_of_DL_CV)

原文发表时间:2018-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

NIPS 2018 | 将RNN内存占用缩小90%:多伦多大学提出可逆循环神经网络

循环神经网络(RNN)在语音识别 [1]、语言建模 [2,3] 和机器翻译 [4,5] 等多种任务上都取得了极优的性能。然而,训练 RNN 需要大量的内存。标准...

10540
来自专栏专知

【干货】计算机视觉实战系列01——用Python做图像处理

【导读】在当今互联网飞速发展的社会中,数量庞大的图像和视频充斥着我们的生活,让我们需要对图片进行检索、分类等操作时,利用人工手段显然是不现实的,于是,计算机视觉...

1.1K120
来自专栏Spark学习技巧

译:Tensorflow实现的CNN文本分类

18750
来自专栏人工智能

机器学习入门之HelloWorld(Tensorflow)

本文介绍一些机器学习的入门知识,从安装环境到跑通机器学习入门程序MNIST demo。

2.7K400
来自专栏Spark学习技巧

SparkMllib主题模型案例讲解

一 本文涉及到的算法 1, LDA主题模型 符号定义 文档集合D,m篇,topic集合T,k个主题 D中每个文档d看作一个单词序列< w1,w2,...,wn...

28750
来自专栏AI

Keras作为TensorFlow的简化界面:教程

周日 2016年4月24日 由弗朗索瓦Chollet 在教程中。

1.9K100
来自专栏素质云笔记

keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)

之前在博客《keras系列︱图像多分类训练与利用bottleneck features进行微调(三)》一直在倒腾VGG16的fine-tuning,然后因为其...

1.4K100
来自专栏用户2442861的专栏

Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写

http://www.cnblogs.com/denny402/p/5073427.html

9210
来自专栏技术翻译

回归问题的深层神经网络

众所周知,神经网络可用于解决分类问题,例如,它们被用于手写体数字分类,但问题是,如果我们将它们用于回归问题,它会有效果吗?

1.2K20
来自专栏量子位

如何优雅地用TensorFlow预测时间序列:TFTS库详细教程

作者:何之源 转载自知乎专栏:AI Insight 量子位 已获授权编辑发布 这篇文章中,作者详细介绍了TensorFlow Time Series(TFTS)...

86260

扫码关注云+社区

领取腾讯云代金券