2.3 Keras基础入门
2.3.1 Keras简介与安装
Keras(见图2-13)是目前深度学习研究领域非常流行的框架,相比于前面介绍的TensorFlow,Keras是一种更高层次的深度学习API。Keras使用Python编写而成,包含了大量模块化的接口,有很多常用模型仅需几行代码即可完成,大大提高了深度学习的科研效率。它是一个高级接口,后端可支持TensorFlow、Theano、CNTK等多种深度学习基础框架,默认为TensorFlow,其他需要单独设置。目前,谷歌已经将Keras库移植到TensorFlow中,也让Keras成了TensorFlow中的高级API模块。
图2-13 Keras项目Logo
Keras具备了三个核心特点:
- 允许研究人员快速搭建原型设计。
- 支持深度学习中最流行的卷积神经网络与循环神经网络,以及它们两者的组合。
- 可以在CPU与GPU上无缝运行。
Keras的口号是“为人类服务的深度学习”,在整体的设计上坚持对开发者友好,在API的设计上简单可读,将用户体验放在首位,希望研发人员可以以尽可能低的学习成本来投入深度学习的开发中。Keras的API设计是模块化的,用户可以基于自己设想的模型对已有模块进行组装,其中如神经网络层、损失函数、优化器、激活函数等都可以作为模块组合成新的模型。与此同时,Keras的扩展性非常强大,用户可以轻松创建新模块用于科学研究。
目前最简单的引入Keras的方法就是直接使用最新版本的TensorFlow,可以通过以下引入方式在代码中使用Keras。
from tensorflow import keras
此外,Keras具有一个非常活跃的开发者社区,每天都会有大量的开源代码贡献者为Keras提供各种各样的功能。其中Keras-contrib是一个官方的Keras社区扩展版本,包含了很多社区开发者提供的新功能,为Keras的用户提供了更多选择。
Keras-contrib的新功能通过审核后都会整合到Keras核心项目中,如果现在就想在项目中使用,需要单独安装,同样,可以使用pip工具直接安装。
$ sudo pip install git+https://www.github.com/keras-team/keras-contrib.git
随着Karas加入TensorFlow,为了更好地进行代码上的整合,Keras-contrib项目被整合进了TensorFlow Addons。TensorFlow Addons是一个针对TensorFlow核心库功能的补充,集成了社区最新的一系列方法。由于AI领域发展的速度快,一些最新的算法无法立刻移植到TensorFlow核心库中,所以会优先在TensorFlow Addons中进行发布。可以使用pip的方式方便地安装TensorFlow Addons,从而使用一些高级的API接口。
$ pip install tensorflow-addons
2.3.2 Keras使用入门
Keras包含两种模型类型,第一种是序列模型,第二种是函数式模型。其中后者属于Keras的进阶型模型结构,适用于多入多出、有向无环图或具备共享层的模型,具体可参考Keras官方文档。本节中主要通过介绍序列模型来带读者学习Keras的使用方法。
所谓序列模型是指多个网络层线性堆叠的模型,结构如下列代码所示,该序列模型包含了一个784×32的全连接层、ReLU激活函数、32×10的全连接层以及softmax激活函数。
from tensorflow.keras.models import Sequential from tensorflow.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'))
下面我们来看一个用Keras实现的神经网络二分类示例,网络结构非常简单,由两个全连接层构成。示例中包含了网络模型的搭建、模型的编译以及训练,读者可以在自己的设备上尝试运行此代码以熟悉Keras的使用。
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense data = np.random.random((1000,100)) labels = np.random.randint(2,size=(1000,1)) model = Sequential() model.add(Dense(32, activation='relu', input_dim=100)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy']) model.fit(data,labels,epochs=10,batch_size=32) predictions = model.predict(data)
下面我们根据Keras官网的示例来尝试搭建一个类似VGG网络的卷积神经网络模型。首先引入需要使用的模块,其中包括Keras库中的全连接层、卷积层等。
import numpy as np from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.layers import Conv2D, MaxPooling2D from tensorflow.keras.optimizers import SGD
为了实现模型,我们需要先准备一些训练和测试数据,这里使用随机方法进行数据的准备。
x_train = np.random.random((100, 100, 100, 3)) y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10) x_test = np.random.random((20, 100, 100, 3)) y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
整体上可以按照VGG的结构来搭建整个网络,包括叠加卷积层、池化层、Dropout层、Max Pooling层、全连接网络层等。
model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3))) model.add(Conv2D(32, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256, 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) model.fit(x_train, y_train, batch_size=32, epochs=10) score = model.evaluate(x_test, y_test, batch_size=32)
同样地,我们也可以使用Keras的序列模型实现基于LSTM的循环神经网络模型。
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Embedding,LSTM model = Sequential() model.add(Embedding(20000,128)) model.add(LSTM(128,dropout=0.2,recurrent_dropout=0.2)) model.add(Dense(1,activation='sigmoid'))
下面则是对于该循环神经网络模型的编译与训练,同时最终评估了训练模型的效果。
model.compile(loss='binary_crossentropy', optimizer='adam', metrics= ['accuracy']) model.fit(x_train, y_train, batch_size=32, epochs=15, verbose=1, validation_data= (x_test,y_test)) score = model.evaluate(x_test, y_test, batch_size=32)
最终我们可以将模型保存到本地的model文件夹路径下。
model.save('./model')
当在业务中需要使用对应模型时,只需要使用加载模型的方法从model路径中进行模型的加载即可。
from tensorflow.keras.models import load_model my_model = load_model('./model')
通过这几个示例我们会发现,使用Keras来实现那些复杂的深度学习网络像是搭建积木一样,把一些非常复杂的工作简单化了。在下一节中,会通过一个简明的案例带领大家了解如何使用Keras解决实际的应用问题。
2.3.3 Keras实例:文本情感分析
本小节中我们通过学习Keras官方的一个实例[1]来熟悉一下Keras的使用方法。
情感分析是自然语言处理领域的研究热点,也是一项非常实用的技术,可以利用这项技术来分析用户在互联网上的观点和态度,同时也可以分析企业或商品在互联网上的口碑。
在深度学习中,循环神经网络(RNN)是处理像文本这样的序列模型的最好方式,但传统的RNN存在的问题是,当序列变长后,RNN无法记住之前的重要信息,并且会存在梯度消失的问题。为了解决上述问题,研究者提出了一种长短期记忆网络(LSTM),这也是目前业内处理文本序列非常流行的一种模型(见图2-14)。
图2-14 LSTM网络结构示意图
Keras官方已经为大家准备好了LSTM模型的API,并且提供了IMDB电影评论数据集,其中包含了评论内容和打分。下面让我们来看如何使用Keras来解决情感分析的问题。首先引入所有需要的模块。
from __future__ import print_function from tensorflow.keras.preprocessing import sequence from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Embedding, LSTM from tensorflow.keras.datasets import imdb
准备好数据,选择最常用的20 000个词作为特征数据,并将数据分为训练集和测试集。对于文本数据,这里需要进行长度统一,设置最大长度为80个词,如果超过则截断,不足则补零。
max_features = 20000 maxlen = 80 batch_size = 32 (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features) x_train = sequence.pad_sequences(x_train, maxlen=maxlen) x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
数据处理完成后就可以搭建模型了。首先使用嵌入层作为模型的第一层,将输入的20 000维的文字向量转换为128维的稠密向量。接着就是利用LSTM模型进行文本序列的深度学习训练。最终使用全连接层加上Sigmoid激活函数作为最终的判断输出。搭建完毕后还需要为模型设置编译的损失函数和优化器。
model = Sequential() model.add(Embedding(max_features, 128)) model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
然后就可以训练和评估情感分析的模型了。在Keras的帮助下,通过简单的几步就可以完成基于深度学习的文本情感分析的任务。
model.fit(x_train, y_train, batch_size=batch_size, epochs=15, validation_data=(x_test, y_test)) score, acc = model.evaluate(x_test, y_test, batch_size=batch_size) print('Test score:', score) print('Test accuracy:', acc)
在使用Keras框架训练完模型以后,可以通过Keras的save方法将模型保存下来。为了能够更好地让机器学习投入真实世界的应用中去,我们可以为模型封装一个外部的应用程序。在互联网时代,使用网络接入AI模型是对于用户来说成本最低的方式。为此我们可以搭建一个基于Web的AI应用程序,将模型投入生产环境中为互联网用户提供即时的网页服务。在Python中常用的Web编程框架是Flask,它是一个非常流行的Python服务端程序框架,相比于在Python领域非常流行的Django,它的特点在于更为精简,去除了一些封装好的服务,只保留了最基本的服务器程序,而其余的扩展可以通过用户自己添加第三方包实现。
[1] https://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py