一、引言:深度学习浪潮中的 Keras
前面的文章我们探秘了深度学习框架中的两大明星框架 —— TensorFlow 和 PyTorch 以及 两大框架的对比
在深度学习的众多框架中,还有一款框架备受开发者们的喜爱 —— Keras 。它就像是一位贴心的助手,为我们搭建起了通往深度学习世界的便捷桥梁。无论你是初涉人工智能领域的小白,还是经验丰富的技术大咖,Keras 都能凭借其独特的魅力,满足你的各种需求,助力你在深度学习的海洋中畅快遨游。
二、Keras 是什么?
Keras 是一个基于 Python 编写的开源神经网络库,它就像是一个便捷的工具箱,为我们打造深度学习模型提供了各种趁手的 “工具”。它的出现,让深度学习模型的搭建变得更加轻松和高效。它能够以 TensorFlow , Microsoft-CNTK 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
Keras 具有诸多显著优势:一是用户友好,API 设计简洁直观,新手也能快速上手,将模型构想转化为代码,如构建简单图像分类模型,用 Keras 十几行代码即可搭建基本框架,比其他复杂框架更高效。二是高度模块化,把神经网络各组件设计为独立模块,像搭积木般可按需组合搭建不同结构模型,如构建自然语言处理模型时可选择合适模块组合。三是易扩展性出色,有新需求添加模块时,仿照现有模块编写新类或函数就能轻松实现,在先进研究工作中也能发挥重要作用。下面我们来看看它的这些优势
三、Keras 的优势
(一)简洁易用的 API
Keras 的 API 设计堪称一绝,它就像是为开发者量身定制的贴心工具。以构建一个简单的手写数字识别模型为例,使用 Keras 只需短短数十行代码,就能轻松搭建起模型框架。如下是使用 Keras 搭建简单手写数字识别模型的代码示例:
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
from keras.utils import np_utils
# 加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255.0
X_test = X_test.reshape(X_test.shape[0], -1) / 255.0
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# 构建模型
model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, batch_size=128, epochs=10, validation_data=(X_test, y_test))
# 评估模型
score = model.evaluate(X_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
在这个示例中,从数据的加载与预处理,到模型的构建、编译、训练以及最后的评估,整个过程代码简洁明了,逻辑清晰易懂 。相比之下,使用其他一些深度学习框架,如 TensorFlow 原生 API,可能需要编写大量复杂的代码来处理变量初始化、计算图构建等底层细节。
就好比同样是建造一座房子,Keras 提供的是已经预制好的各种模块,你只需按照图纸进行拼接即可;而其他框架可能给你的是一堆原始材料,你需要从打地基开始,一步步地搭建,过程繁琐且容易出错。Keras 的这种简洁易用性,大大降低了深度学习的开发门槛,让更多人能够快速上手,将更多的时间和精力投入到模型的优化和业务逻辑的实现上。
(二)强大的兼容性
Keras 的兼容性令人赞叹,它支持多种后端,如 TensorFlow、CNTK、Theano 等 。这意味着开发者可以根据自己的需求和实际情况,灵活选择最适合的后端。例如,如果你的团队在 TensorFlow 生态积累了经验和资源,可选用 TensorFlow 作 Keras 后端,以利用其强大的分布式训练能力和广泛工具支持;若对微软认知工具包 CNTK 感兴趣或项目已用其功能,Keras 能无缝对接;若偏好 Theano 特性,Keras 也能满足需求。
Keras 多后端支持特性如万能钥匙,能融入各种开发环境,提供稳定高效服务,提高代码可移植性,让开发者依项目特点选合适后端,优化模型性能与开发效率。
(三)广泛的应用领域
Keras 凭借其强大的功能和出色的易用性,在众多领域都有着广泛的应用。
在图像识别领域,Keras 可以助力我们实现各种复杂的任务。比如在医疗影像分析中,通过构建基于 Keras 的深度学习模型,能够帮助医生更准确地识别 X 光、CT 等影像中的病变,辅助疾病的诊断。以皮肤癌的诊断为例,研究人员利用 Keras 搭建卷积神经网络模型,对大量的皮肤病变图像进行训练,模型能够学习到不同病变的特征,从而准确地判断出病变是否为癌症,为早期诊断和治疗提供了有力的支持。在安防监控领域,Keras 也发挥着重要作用。通过训练图像识别模型,可以实现对监控视频中的人物、车辆等目标的实时检测和识别,提高安防系统的智能化水平,保障人们的生命财产安全。
在自然语言处理领域,Keras 同样表现出色。在智能客服系统中,利用 Keras 构建的语言模型可以理解用户的提问,并给出准确的回答。例如,当用户咨询问题时,模型能够快速分析问题的语义,从知识库中检索相关信息,然后生成自然流畅的回复,大大提高了客服的工作效率和服务质量。在文本分类任务中,Keras 也能大显身手。比如对新闻文章进行分类,将其分为政治、经济、体育、娱乐等不同类别,方便用户快速获取感兴趣的信息。还可以用于情感分析,判断用户在社交媒体上发表的言论是积极、消极还是中性,帮助企业了解用户的情感倾向,优化产品和服务。
此外,在生物信息学领域,Keras 也开始崭露头角。研究人员可以利用 Keras 构建深度学习模型,对基因序列数据进行分析,预测基因的功能、疾病的发生风险等。比如通过分析大量的基因数据,预测某些基因突变与特定疾病之间的关联,为疾病的预防和治疗提供新的思路和方法。
四、Keras 的使用方法
(一)安装与配置
想要使用 Keras,首先得把它安装到你的电脑上。安装 Keras 其实并不复杂,不过在这之前,你需要确保你的系统里已经安装好了 Python,而且建议使用 Python 3.6 及以上的版本 ,就像搭建房子要先打好地基一样,Python 就是使用 Keras 的基础。
1、安装 Keras
安装 Keras 的依赖项是安装过程中的重要一步。如果你选择 TensorFlow 作为 Keras 的后端(这也是比较常见的选择),你可以在命令行中输入以下命令来安装:
pip install tensorflow
这条命令会自动帮你下载并安装 TensorFlow。安装完成后,就可以安装 Keras 了,同样在命令行中输入:
pip install keras
这样,Keras 就成功安装到你的系统中了。
2、配置 Keras
安装好之后,还需要对 Keras 进行配置。Keras 的配置主要是针对后端的选择和一些默认参数的设置。如果你想修改后端,比如从默认的 TensorFlow 后端切换到 Theano 后端,有两种方法可以实现。一种是修改 Keras 的配置文件keras.json
,这个文件通常位于$HOME/.keras/
目录下($HOME
表示你的用户主目录,在不同的操作系统中可能有所不同)。你可以使用文本编辑器打开这个文件,然后找到"backend"
字段,将其值从"tensorflow"
改为"theano"
。另一种方法是在 Python 代码中通过设置环境变量来修改后端,在导入 Keras 之前,添加以下代码:
import os
os.environ['KERAS_BACKEND'] = 'theano'
这样就可以在代码运行时临时将 Keras 的后端设置为 Theano。通过这些安装和配置步骤,你就为使用 Keras 做好了充分的准备,可以开启深度学习模型的搭建之旅啦。
(二)构建模型
在 Keras 中,构建模型主要有两种方式,分别是序贯模型和函数式模型,它们各有特点,适用于不同的场景。
1、序贯模型
序贯模型是一种最简单的模型构建方式,它就像是搭积木一样,按照顺序一层一层地堆叠网络层。每一层都只有一个输入和一个输出,前一层的输出会直接作为下一层的输入。我们以手写数字识别这个经典任务为例,来看看如何使用 Sequential 模型构建简单的神经网络。
手写数字识别,就是让计算机能够识别出图片中的手写数字是 0 - 9 中的哪一个。在这个任务中,我们使用的是 MNIST 数据集,它包含了大量的手写数字图片和对应的标签。下面是使用 Keras 的 Sequential 模型构建手写数字识别神经网络的代码示例:
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
from keras.utils import np_utils
# 加载数据
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(X_train.shape[0], -1) / 255.0
X_test = X_test.reshape(X_test.shape[0], -1) / 255.0
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# 构建模型
model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
在这段代码中,首先导入了需要的库和模块。然后使用mnist.load_data()
函数加载 MNIST 数据集,这个数据集会自动分为训练集(X_train, y_train)
和测试集(X_test, y_test)
。接下来进行数据预处理,将图片数据进行归一化处理,使其取值范围在 0 - 1 之间,同时将标签数据转换为独热编码的形式,这样更适合模型的训练。
在构建模型部分,创建了一个 Sequential 模型对象model
。然后使用model.add()
方法依次添加网络层。第一层是一个全连接层Dense(128, activation='relu', input_shape=(784,))
,其中128
表示这一层有 128 个神经元,activation='relu'
表示使用 ReLU 激活函数,input_shape=(784,)
表示输入数据的形状是 784 维,这是因为 MNIST 数据集中的每张图片是 28x28 像素的,展开成一维向量后就是 784 维。第二层也是一个全连接层Dense(10, activation='softmax')
,这里的10
表示输出层有 10 个神经元,对应 0 - 9 这 10 个数字,activation='softmax'
表示使用 softmax 激活函数,它会将输出转换为概率分布,每个神经元的输出值表示对应数字的概率。通过这样的网络结构,模型就可以学习到手写数字的特征,并进行分类预测。
2、函数式模型
函数式模型相比序贯模型更加灵活,它可以构建更复杂的模型结构,比如多输入多输出的模型。当你需要处理一些复杂的任务,序贯模型无法满足需求时,函数式模型就能派上用场。它就像是一个更高级的工具,让你可以根据具体需求自由地设计模型的连接方式。
下面通过一个多输入多输出的模型示例,来展示函数式模型的使用方法和灵活性。假设我们要构建一个模型,它有两个输入,一个输入是文本数据,另一个输入是图像数据,模型的输出有两个,一个是对文本内容的分类结果,另一个是对图像内容的分类结果。代码示例如下:
from keras.layers import Input, Dense, concatenate
from keras.models import Model
# 定义输入层
text_input = Input(shape=(100,))
image_input = Input(shape=(28, 28, 1))
# 对文本输入进行处理
text_features = Dense(64, activation='relu')(text_input)
# 对图像输入进行处理
image_features = Dense(64, activation='relu')(image_input)
# 将文本和图像特征进行合并
merged = concatenate([text_features, image_features])
# 定义输出层
text_output = Dense(10, activation='softmax')(merged)
image_output = Dense(5, activation='softmax')(merged)
# 构建模型
model = Model(inputs=[text_input, image_input], outputs=[text_output, image_output])
在这段代码中,首先使用Input()
函数定义了两个输入层,分别是text_input
和image_input
,它们的形状分别是(100,)
和(28, 28, 1)
,表示文本输入是 100 维的向量,图像输入是 28x28 像素的单通道图像。然后分别对文本输入和图像输入进行处理,通过全连接层提取特征。接着使用concatenate()
函数将文本特征和图像特征合并在一起。最后,根据合并后的特征定义了两个输出层,分别是text_output
和image_output
,用于对文本和图像进行分类。通过Model()
函数将输入和输出连接起来,构建出了完整的多输入多输出模型。这种灵活的构建方式,使得函数式模型在处理复杂任务时具有很大的优势。
(三)编译与训练
当我们使用 Keras 搭建好模型后,就需要对模型进行编译和训练,这是让模型学习数据特征、具备预测能力的关键步骤。
在模型编译阶段,我们需要设置一些重要的参数,这些参数就像是模型训练的 “指南针”,指引着模型朝着正确的方向学习。首先是优化器,它的作用是调整模型的权重,使得模型在训练过程中能够不断地降低损失函数的值。Keras 提供了多种优化器供我们选择,比如常见的随机梯度下降(SGD)、Adagrad、Adadelta、Adam 等。以 Adam 优化器为例,它结合了 Adagrad 和 Adadelta 的优点,能够自适应地调整学习率,在很多任务中都表现出色。在编译模型时,我们可以这样设置优化器:
from keras.optimizers import Adam
model.compile(optimizer=Adam(lr=0.001),...)
这里lr
参数表示学习率,设置为0.001
,它决定了模型在训练过程中权重更新的步长,学习率过大可能导致模型无法收敛,学习率过小则会使训练过程变得非常缓慢。
损失函数也是编译模型时必不可少的参数,它用于衡量模型预测值与真实值之间的差异。不同的任务需要选择不同的损失函数。在分类任务中,如果是二分类问题,常用的损失函数是二元交叉熵(binary_crossentropy);如果是多分类问题,比如前面提到的手写数字识别,通常使用分类交叉熵(categorical_crossentropy) 。以手写数字识别模型为例,编译时设置损失函数如下:
model.compile(..., loss='categorical_crossentropy',...)
评估指标用于评估模型在训练和测试过程中的性能表现。在分类任务中,我们通常会关注准确率(accuracy),它表示模型预测正确的样本数占总样本数的比例。在编译模型时,可以将准确率作为评估指标之一:
model.compile(..., metrics=['accuracy'])
完成模型编译后,就可以开始训练模型了。训练模型的过程就像是让模型在数据的海洋中不断学习和成长。在 Keras 中,使用fit()
方法进行模型训练,下面是训练手写数字识别模型的代码示例:
model.fit(X_train, y_train, batch_size=128, epochs=10, validation_data=(X_test, y_test))
在这个示例中,X_train
和y_train
是训练数据和对应的标签,batch_size
表示每次训练时使用的样本数量,设置为128
,这意味着模型每次从训练数据中取出 128 个样本进行训练,这样可以减少内存的占用,同时也能加快训练速度。epochs
表示训练的轮数,这里设置为10
,即模型会对整个训练数据进行 10 次训练。validation_data
参数用于指定验证数据,这里使用测试集(X_test, y_test)
作为验证数据,模型在每一轮训练结束后,都会在验证数据上进行评估,以查看模型的泛化能力是否良好。通过不断地调整这些训练参数,我们可以让模型达到更好的训练效果。
(四)评估与预测
当模型训练完成后,我们就需要对模型的性能进行评估,看看它是否达到了我们的预期。在 Keras 中,使用evaluate()
方法可以方便地对训练好的模型进行评估。继续以手写数字识别模型为例,评估代码如下:
score = model.evaluate(X_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
在这段代码中,model.evaluate(X_test, y_test)
会返回一个包含损失值和评估指标值的列表。这里的score[0]
表示测试集上的损失值,损失值越低,说明模型在测试集上的预测结果与真实值之间的差异越小;score[1]
表示测试集上的准确率,准确率越高,说明模型在测试集上的预测效果越好。通过这些评估指标,我们可以直观地了解模型的性能表现。
除了评估模型,我们还可以使用训练好的模型进行预测,让模型对新的数据进行判断和分类。在 Keras 中,使用predict()
方法进行预测。例如,我们想要预测测试集中前 10 个样本的数字类别,可以这样做:
predictions = model.predict(X_test[:10])
print(predictions)
model.predict(X_test[:10])
会返回一个数组,数组的每一行表示对应样本属于 0 - 9 这 10 个数字类别的概率分布。例如,predictions[0]
表示第一个样本属于各个数字类别的概率,我们可以通过argmax()
函数找到概率最大的类别索引,从而得到模型的预测结果:
import numpy as np
predicted_classes = np.argmax(predictions, axis=1)
print('Predicted classes:', predicted_classes)
通过这样的方式,我们就可以根据模型的预测结果进行分析和应用。比如在实际的手写数字识别场景中,我们可以将模型集成到一个应用程序中,让用户输入手写数字图片,模型就能快速给出识别结果,为人们的生活和工作带来便利。
结语
今天这篇文章,我们初步学习了 Keras,包括它是什么、具备哪些优势(简洁易用的 API、强大的兼容性、广泛的应用领域),以及基本使用方法。在下一篇文章里,我会带大家了解 Keras 在图像处理与自然语言处理领域的应用案例。欢迎订阅专栏->[传送门],及时获取最新文章。
延伸阅读
深度学习框架探秘|PyTorch:AI 开发的灵动画笔
深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决