当前位置:   article > 正文

Keras入门必读教程:手把手从安装到解决实际问题

from tensorflow.keras.models import sequential

导读:Keras是目前深度学习研究领域非常流行的框架。

作者:史丹青

来源:大数据DT(ID:hzdashuju)

52e42ac595ce6cde928edaf16ee373d3.png

01 Keras简介与安装

Keras是目前深度学习研究领域非常流行的框架,相比于TensorFlow,Keras是一种更高层次的深度学习API。

Keras使用Python编写而成,包含了大量模块化的接口,有很多常用模型仅需几行代码即可完成,大大提高了深度学习的科研效率。它是一个高级接口,后端可支持TensorFlow、Theano、CNTK等多种深度学习基础框架,默认为TensorFlow,其他需要单独设置。

目前,谷歌已经将Keras库移植到TensorFlow中,也让Keras成了TensorFlow中的高级API模块。

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

02 Keras使用入门

Keras包含两种模型类型,第一种是序列模型,第二种是函数式模型。其中后者属于Keras的进阶型模型结构,适用于多入多出、有向无环图或具备共享层的模型,具体可参考Keras官方文档。本节中主要通过介绍序列模型来带读者学习Keras的使用方法。

所谓序列模型是指多个网络层线性堆叠的模型,结构如下列代码所示,该序列模型包含了一个784×32的全连接层、ReLU激活函数、32×10的全连接层以及softmax激活函数。

  1. from tensorflow.keras.models import Sequential
  2. from tensorflow.keras.layers import Dense, Activation
  3. model = Sequential([
  4. Dense(32, input_shape=(784,)),
  5. Activation('relu'),
  6. Dense(10),
  7. Activation('softmax'),
  8. ])

也可以使用add() 方法进行序列模型中网络层的添加。

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

下面我们来看一个用Keras实现的神经网络二分类示例,网络结构非常简单,由两个全连接层构成。示例中包含了网络模型的搭建、模型的编译以及训练,读者可以在自己的设备上尝试运行此代码以熟悉Keras的使用。

  1. import numpy as np
  2. from tensorflow.keras.models import Sequential 
  3. from tensorflow.keras.layers import Dense
  4. data = np.random.random((1000,100))
  5. labels = np.random.randint(2,size=(1000,1))
  6. model = Sequential()
  7. model.add(Dense(32,activation='relu', input_dim=100))
  8. model.add(Dense(1, activation='sigmoid'))
  9. model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
  10. model.fit(data,labels,epochs=10,batch_size=32)
  11. predictions = model.predict(data)

下面我们根据Keras官网的示例来尝试搭建一个类似VGG网络的卷积神经网络模型。首先引入需要使用的模块,其中包括Keras库中的全连接层、卷积层等。

  1. import numpy as np
  2. from tensorflow import keras
  3. from tensorflow.keras.models import Sequential
  4. from tensorflow.keras.layers import Dense, Dropout, Flatten
  5. from tensorflow.keras.layers import Conv2D, MaxPooling2D
  6. from tensorflow.keras.optimizers import SGD

为了实现模型,我们需要先准备一些训练和测试数据,这里使用随机方法进行数据的准备。

  1. x_train = np.random.random((1001001003))
  2. y_train = keras.utils.to_categorical(np.random.randint(10, size=(1001)),
  3. num_classes=10)
  4. x_test = np.random.random((201001003))
  5. y_test = keras.utils.to_categorical(np.random.randint(10, size=(201)),
  6. num_classes=10)

整体上可以按照VGG的结构来搭建整个网络,包括叠加卷积层、池化层、Dropout层、Max Pooling层、全连接网络层等。

  1. model = Sequential()
  2. model.add(Conv2D(32, (33), activation='relu', input_shape=(1001003)))
  3. model.add(Conv2D(32, (33), activation='relu'))
  4. model.add(MaxPooling2D(pool_size=(22)))
  5. model.add(Dropout(0.25))
  6. model.add(Conv2D(64, (33), activation='relu'))
  7. model.add(Conv2D(64, (33), activation='relu'))
  8. model.add(MaxPooling2D(pool_size=(22)))
  9. model.add(Dropout(0.25))
  10. model.add(Flatten())
  11. model.add(Dense(256, activation='relu'))
  12. model.add(Dropout(0.5))
  13. model.add(Dense(10, activation='softmax'))

最后我们进行模型的优化设置以及对模型进行编译,并可以在训练数据上进行学习。

  1. sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
  2. model.compile(loss='categorical_crossentropy', optimizer=sgd)
  3. model.fit(x_train, y_train, batch_size=32, epochs=10)
  4. score = model.evaluate(x_test, y_test, batch_size=32)

同样地,我们也可以使用Keras 的序列模型实现基于LSTM 的循环神经网络模型。

  1. from tensorflow.keras.models import Sequential 
  2. from tensorflow.keras.layers import Dense,Embedding,LSTM
  3. model = Sequential()
  4. model.add(Embedding(20000,128))
  5. model.add(LSTM(128,dropout=0.2,recurrent_dropout=0.2))
  6. model.add(Dense(1,activation='sigmoid'))

下面则是对于该循环神经网络模型的编译与训练,同时最终评估了训练模型的效果。

  1. model.compile(loss='binary_crossentropy', optimizer='adam', metrics=
  2. ['accuracy'])
  3. model.fit(x_train, y_train, batch_size=32, epochs=15, verbose=1, validation_data=
  4. (x_test,y_test))
  5. score = model.evaluate(x_test, y_test, batch_size=32)

最终我们可以将模型保存到本地的model文件夹路径下。

model.save('./model')

当在业务中需要使用对应模型时,只需要使用加载模型的方法从model 路径中进行模型的加载即可。

  1. from tensorflow.keras.models import load_model
  2. my_model = load_model('./model')

通过这几个示例我们会发现,使用Keras 来实现那些复杂的深度学习网络像是搭建积木一样,把一些非常复杂的工作简单化了。在下一节中,会通过一个简明的案例带领大家了解如何使用Keras解决实际的应用问题。

03 Keras实例:文本情感分析

本小节中我们通过学习Keras官方的一个实例来熟悉一下Keras的使用方法。

参考链接:

https://github.com/keras-team/keras/blob/master/examples/imdb_lstm.py

情感分析是自然语言处理领域的研究热点,也是一项非常实用的技术,可以利用这项技术来分析用户在互联网上的观点和态度,同时也可以分析企业或商品在互联网上的口碑。

在深度学习中,循环神经网络(RNN)是处理像文本这样的序列模型的最好方式,但传统的RNN存在的问题是,当序列变长后,RNN无法记住之前的重要信息,并且会存在梯度消失的问题。为了解决上述问题,研究者提出了一种长短期记忆网络(LSTM),这也是目前业内处理文本序列非常流行的一种模型(见图2-14)。

b0525566e2908bbc4d87909d727b2b89.png

▲图2-14 LSTM网络结构示意图

Keras官方已经为大家准备好了LSTM模型的API,并且提供了IMDB电影评论数据集,其中包含了评论内容和打分。下面让我们来看如何使用Keras来解决情感分析的问题。首先引入所有需要的模块。

  1. from __future__ import print_function
  2. from tensorflow.keras.preprocessing import sequence
  3. from tensorflow.keras.models import Sequential
  4. from tensorflow.keras.layers import Dense, Embedding, LSTM
  5. from tensorflow.keras.datasets import imdb

准备好数据,选择最常用的20000个词作为特征数据,并将数据分为训练集和测试集。对于文本数据,这里需要进行长度统一,设置最大长度为80个词,如果超过则截断,不足则补零。

  1. max_features = 20000
  2. maxlen = 80
  3. batch_size = 32
  4. (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
  5. x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
  6. x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

数据处理完成后就可以搭建模型了。首先使用嵌入层作为模型的第一层,将输入的20000维的文字向量转换为128维的稠密向量。接着就是利用LSTM模型进行文本序列的深度学习训练。最终使用全连接层加上Sigmoid激活函数作为最终的判断输出。搭建完毕后还需要为模型设置编译的损失函数和优化器。

  1. model = Sequential()
  2. model.add(Embedding(max_features, 128))
  3. model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
  4. model.add(Dense(1, activation='sigmoid'))
  5. model.compile(loss='binary_crossentropy',optimizer='adam',
  6. metrics=['accuracy'])

然后就可以训练和评估情感分析的模型了。在Keras帮助下,通过简单的几步就可以完成基于深度学习的文本情感分析的任务。

  1. model.fit(x_train, y_train,
  2. batch_size=batch_size,
  3. epochs=15,
  4. validation_data=(x_test, y_test))
  5. score, acc = model.evaluate(x_test, y_test,
  6. batch_size=batch_size)
  7. print('Test score:', score)
  8. print('Test accuracy:', acc)

在使用Keras框架训练完模型以后,可以通过Keras的save方法将模型保存下来。为了能够更好地让机器学习投入真实世界的应用中去,我们可以为模型封装一个外部的应用程序。在互联网时代,使用网络接入AI模型是对于用户来说成本最低的方式。

为此我们可以搭建一个基于Web的AI应用程序,将模型投入生产环境中为互联网用户提供即时的网页服务。

在Python中常用的Web编程框架是Flask,它是一个非常流行的Python服务端程序框架,相比于在Python领域非常流行的Django,它的特点在于更为精简,去除了一些封装好的服务,只保留了最基本的服务器程序,而其余的扩展可以通过用户自己添加第三方包实现。 

关于作者:史丹青,语忆科技联合创始人兼技术负责人,毕业于同济大学电子信息工程系。拥有多年时间的AI领域创业与实战经验,具备深度学习、自然语言处理以及数据可视化等相关知识与技能。是AI技术的爱好者,并拥抱一切新兴科技,始终坚信技术分享和开源精神的力量。

本文摘编自《生成对抗网络入门指南》(第2版),经出版方授权发布。

3bf1aaa6c1dd5c00178b2271936f978f.png

延伸阅读《生成对抗网络入门指南》(第2版)

点击上图了解及购买

转载请联系微信:DoctorData

推荐语:揭秘AI如何生成逼真人脸图像,追踪GAN前沿技术更新。

b372d0a0e402ac7fb220463e7da41ebf.gif

划重点

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47311
推荐阅读
相关标签