Keras 介绍
Keras 是提供一些高可用的 Python API ,能帮助你快速的构建和训练自己的深 度学习模型,它的后端是 TensorFlow 或者 Theano 。开源神经网络库。
本文假设你已经熟悉了 TensorFlow 和卷积神经网络,如果,你还没有熟悉,那么可以先看看这个10分钟入门 TensorFlow 教程和卷积神经网络教程,
在这个教程中,我们将学习以下几个方面:
- 为什么选择 Keras?为什么 Keras 被认为是深度学习的未来?
- 在 Ubuntu上 面一步一步安装 Keras。
- Keras TensorFlow 教程:Keras基础知识。
- 了解 Keras 序列模型 4.1 实际例子讲解线性回归问题
- 使用 Keras 保存和回复预训练的模型
- Keras API 6.1 使用Keras API开发VGG卷积神经网络 6.2 使用Keras API构建并运行SqueezeNet卷积神经网络
1. 为什么选择Keras?
Keras 是 Google 的一位工程师 François Chollet 开发的一个框架,可以帮助你在 Theano 上面进行快速原型开发。后来,这被扩展为 TensorFlow 也可以作为后端。并且最近,TensorFlow决定将其作为 contrib 文件中的一部分进行提供。
Keras 被认为是构建神经网络的未来,以下是一些它流行的原因:
-
轻量级和快速 开发:Keras 的目的是在消除样板代码。几行 Keras 代码就能比原生的 TensorFlow 代码实现更多的功能。你也可以很轻松的实现 CNN 和 RNN,并且让它们运行在 CPU 或者 GPU 上面。
-
框架的“赢者”:Keras 是一个API,运行在别的深度学习框架上面。这个框架可以是 TensorFlow 或者 Theano。Microsoft 也计划让 CNTK 作为 Keras 的一个后端。目前,神经网络框架世界是非常分散的,并且发展非常快。具体,你可以看看 Karpathy 的这个推文:
想象一下,我们每年都要去学习一个新的框架,这是多么的痛苦。到目前为止,TensorFlow 似乎成为了一种潮流,并且越来越多的框架开始为 Keras 提供支持,它可能会成为一种标准。
目前,Keras 是成长最快的一种深度学习框架。因为可以使用不同的深度学习框架作为后端,这也使得它成为了流行的一个很大的原因。你可以设想这样一个场景,如果你阅读到了一篇很有趣的论文,并且你想在你自己的数据集上面测试这个模型。让我们再次假设,你对TensorFlow 非常熟悉,但是对Theano了解的非常少。那么,你必须使用TensorFlow 对这个论文进行复现,但是这个周期是非常长的。但是,如果现在代码是采用Keras写的,那么你只要将后端修改为TensorFlow就可以使用代码了。这将是对社区发展的一个巨大的推动作用。
- 用户友好 简洁 API,减少工作量
- 模块性 相互独立,没有依赖
- 容易扩展
2. 怎么安装 Keras,并且把 TensorFlow 作为后端
a) 依赖安装
安装 h5py,用于模型的保存和载入:
pip install h5py
还有一些依赖包也要安装。
pip install numpy scipy pillow
如果你还没有安装TensorFlow,那么你可以按照这个教程先去安装TensorFlow。一旦,你安装完成了 TensorFlow,你只需要使用 pip 很容易的安装 Keras。
sudo pip install keras
使用以下命令来查看 Keras 版本。
import keras
Using TensorFlow backend.
keras.__version__
'2.0.4'
一旦,Keras 被安装完成,你需要去修改后端文件,也就是去确定,你需要 TensorFlow 作为后端,还是 Theano 作为后端,修改的配置文件位于 ~/.keras/keras.json 。具体配置如下:
{
"floatx": "float32",
"epsilon": 1e-07,
"backend": "tensorflow",
"image_data_format": "channels_last"
}
请注意,参数 image_data_format 是 channels_last ,也就是说这个后端是 TensorFlow。因为,在TensorFlow中图像的存储方式是[height, width, channels],但是在Theano中是完全不同的,也就是 [channels, height, width]。因此,如果你没有正确的设置这个参数,那么你模型的中间结果将是非常奇怪的。对于Theano来说,这个参数就是channels_first。
那么,至此你已经准备好了,使用Keras来构建模型,并且把TensorFlow作为后端。
3. Keras基础知识
Keras 模块 - keras.layers - 用于生成神经网络层,如全连接、RNN、CNN等 - keras.models - 用于生成模型 - keras.optimizers - 用于生成优化器, 如SGD、Adam等 - keras.activated - 用于生成激活函数,如relu、softmax等 - keras.datasets - 用于生成数据集,如mnist手写数字数据集、cifar10等 - keras.applications - 提供了带有预训练全职的深度学习模型,这些模型可以用来进行预测、特征提取和微调 fine-tuning
在Keras中主要的数据结构是 model ,该结构定义了一个完整的图。你可以向已经存在的图中加入任何的网络结构。
import keras
Keras 有两种不同的建模方式:
-
**Sequential models:**这种方法用于实现一些简单的模型。你只需要向一些存在的模型中添加层就行了。
-
**Functional API:**Keras的API是非常强大的,你可以利用这些API来构造更加复杂的模型,比如多输出模型,有向无环图等等。
在本文的下一节中,我们将学习Keras的Sequential models 和 Functional API的理论和实例。
4. Keras Sequential models
在这一部分中,我将来介绍Keras Sequential models的理论。我将快速的解释它是如何工作的,还会利用具体代码来解释。之后,我们将解决一个简单的线性回归问题,你可以在阅读的同时运行代码,来加深印象。
以下代码是如何开始导入和构建序列模型。
from keras.models import Sequential
models = Sequential()
接下来我们可以向模型中添加 Dense(full connected layer),Activation,Conv2D,MaxPooling2D函数。
from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten, Dropout
model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))
\# This ads a Convolutional layer with 64 filters of size 3 * 3 to the graph
以下是如何将一些最流行的图层添加到网络中。我已经在卷积神经网络教程中写了很多关于图层的描述。
1. 卷积层
这里我们使用一个卷积层,64个卷积核,维度是33的,之后采用 relu 激活函数进行激活,输入数据的维度是 100100*32。注意,如果是第一个卷积层,那么必须加上输入数据的维度,后面几个这个参数可以省略。
model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))
2. MaxPooling 层
指定图层的类型,并且指定赤的大小,然后自动完成赤化操作,酷毙了!
model.add(MaxPooling2D(pool_size=(2,2)))
3. 全连接层
这个层在 Keras 中称为被称之为 Dense 层,我们只需要设置输出层的维度,然后Keras就会帮助我们自动完成了。
model.add(Dense(256, activation='relu'))
4. Dropout
model.add(Dropout(0.5))
5. 扁平层
model.add(Flatten())
数据输入
网络的第一层需要读入训练数据。因此我们需要去制定输入数据的维度。因此,input_shape参数被用于制定输入数据的维度大小。
model.add(Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)))
在这个例子中,数据输入的第一层是一个卷积层,输入数据的大小是 224*224*3 。
以上操作就帮助你利用序列模型构建了一个模型。接下来,让我们学习最重要的一个部分。一旦你指定了一个网络架构,你还需要指定优化器和损失函数。我们在Keras中使用compile函数来达到这个功能。比如,在下面的代码中,我们使用 rmsprop 来作为优化器,binary_crossentropy 来作为损失函数值。
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
如果你想要使用随机梯度下降,那么你需要选择合适的初始值和超参数:
from keras.optimizers import SGD
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
现在,我们已经构建完了模型。接下来,让我们向模型中输入数据,在Keras中是通过 fit 函数来实现的。你也可以在该函数中指定 batch_size 和 epochs 来训练。
model.fit(x_train, y_train, batch_size = 32, epochs = 10, validation_data(x_val, y_val))
最后,我们使用 evaluate 函数来测试模型的性能。
score = model.evaluate(x_test, y_test, batch_size = 32)
这些就是使用序列模型在Keras中构建神经网络的具体操作步骤。现在,我们来构建一个简单的线性回归模型。
4.1 实际例子讲解线性回归问题
问题陈述
在线性回归问题中,你可以得到很多的数据点,然后你需要使用一条直线去拟合这些离散点。在这个例子中,我们创建了100个离散点,然后用一条直线去拟合它们。
a) 创建训练数据
TrainX 的数据范围是 -1 到 1,TrainY 与 TrainX 的关系是3倍,并且我们加入了一些噪声点。
import keras
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
trX = np.linspace(-1, 1, 101)
trY = 3 * trX + np.random.randn(*trX.shape) * 0.33