引言
上一篇文章《深度学习框架探秘|Keras:深度学习的魔法钥匙》 我们初步学习了 Keras,包括它是什么、具备哪些优势(简洁易用的 API、强大的兼容性、广泛的应用领域),以及基本使用方法。本文,我将会带大家了解 Keras 在图像处理与自然语言处理领域的应用案例。以及 Keras 和 TensorFlow 及 PyTorch 的对比。话不多说,下面我们先从 Keras 的应用案例开始。
一、Keras 应用案例解析

(一)图像分类
在自动驾驶的浪潮中,交通标志识别作为关键技术,其重要性不言而喻。它就像是车辆的 "眼睛",帮助车辆快速准确地理解道路规则,为安全行驶提供有力保障。接下来,让我们以交通标志识别为例,深入了解 Keras 在图像分类任务中的应用。
1、数据准备
巧妇难为无米之炊,构建模型的第一步是准备高质量的数据。在交通标志识别中,常用的数据集是德国交通标志识别基准(GTSRB) ,它就像是一个装满各种交通标志图片的大宝库,包含了 43 种不同类别的交通标志,图片尺寸在 15x15 到 250x250 像素之间 。但这些原始图片就像未经雕琢的璞玉,需要进行一系列预处理才能使用。
首先,要对图像进行缩放,使它们具有相同的尺寸,就像给所有图片穿上统一尺寸的 "衣服",方便后续处理。这里我们将图像统一调整为 48x48 像素。代码实现如下:
from skimage import transform
import cv2
def preprocess_img(img):
img = transform.resize(img, (48, 48))
return img
img = cv2.imread('traffic_sign.jpg')
img = preprocess_img(img)
其次,由于数据集中的图像拍摄时间和环境不同,导致图像的亮度和对比度存在差异。为了让模型能够更好地学习交通标志的特征,需要对图像进行直方图归一化处理,使不同光照条件下的图像具有相似的分布。这一步就像是给图像做了一次 "美颜",让它们的亮度更加均匀。示例代码如下:
from skimage import color, exposure
def preprocess_img(img):
hsv = color.rgb2hsv(img)
hsv[:, :, 2] = exposure.equalize_hist(hsv[:, :, 2])
img = color.hsv2rgb(hsv)
img = transform.resize(img, (48, 48))
return img
img = cv2.imread('traffic_sign.jpg')
img = preprocess_img(img)
完成图像预处理后,还需要将数据划分为训练集、验证集和测试集。一般来说,训练集用于训练模型,让模型学习交通标志的特征;验证集用于调整模型的超参数,防止模型过拟合;测试集用于评估模型的性能。通常按照 70%、15%、15% 的比例进行划分。以 Scikit - learn 库中的train_test_split
函数为例,代码如下:
from sklearn.model_selection import train_test_split
import numpy as np
# 假设imgs是预处理后的图像数组,labels是对应的标签数组
x_train, x_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.3)
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.5)
2、模型构建
有了准备好的数据,接下来就可以使用 Keras 构建卷积神经网络(CNN)模型了。CNN 就像是一个专门用来提取图像特征的 "超级探测器",非常适合处理图像分类任务。
下面是一个简单的 CNN 模型结构示例:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dropout, Flatten, Dense
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 3)))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(43, activation='softmax'))
在这个模型中,首先是两个卷积层 Conv2D
,它们通过卷积核在图像上滑动,提取图像的局部特征,就像用放大镜仔细观察图像的各个部分。激活函数 relu
为模型引入了非线性,使模型能够学习到更复杂的特征。接着是两个池化层 MaxPool2D
,它们的作用是对特征图进行下采样,减少数据量,同时保留重要的特征,就像对图像进行了一次 "压缩",去掉了一些不重要的细节。Dropout
层则是为了防止模型过拟合,它在训练过程中随机 "丢弃" 一些神经元,让模型学习到更鲁棒的特征。最后,通过 Flatten
层将多维的特征图展平为一维向量,再通过全连接层 Dense
进行分类预测,输出 43 个类别的概率分布,对应 43 种交通标志。
3、模型训练
构建好模型后,就可以对模型进行训练了。在训练之前,需要先编译模型、指定优化器、损失函数和评估指标。
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
这里 使用 adam
优化器 ,它能够自适应地调整学习率,使模型更快地收敛。对于多分类问题, 使用 categorical_crossentropy
作为损失函数 ,它可以衡量模型预测值与真实标签之间的差异。 评估指标选择accuracy
,即准确率,用于评估模型在训练和验证过程中的性能。
接下来开始训练模型:
model.fit(x_train, y_train,
batch_size=32,
epochs=10,
validation_data=(x_val, y_val))
在训练过程中,有几个参数需要我们注意:
batch_size
表示每次训练时使用的样本数量,这里设置为 32,模型会每次从训练集中取出 32 个样本进行训练。epochs
表示训练的轮数,这里设置为 10,即模型会对整个训练集进行 10 次训练。validation_data
用于指定验证数据,模型会在每一轮训练结束后,在验证集上评估模型的性能,查看模型是否过拟合。
4、模型部署
经过训练和优化,模型在测试集上达到了满意的性能后,就可以将其部署到实际应用中了。比如将模型集成到自动驾驶系统中,让车辆在行驶过程中实时识别交通标志。在部署时,需要将模型保存为合适的格式,以便在不同的环境中使用。 Keras 提供了 save
方法,可以将模型保存为 HDF5 格式的文件 :
model.save('traffic_sign_model.h5')
在实际应用中,可以使用相应的库加载模型,并对新的图像进行预测。例如,在 Python 中可以使用以下代码加载模型并进行预测:
from keras.models import load_model
import cv2
import numpy as np
//加载模型
model = load_model('traffic_sign_model.h5')
img = cv2.imread('new_traffic_sign.jpg')
img = preprocess_img(img)
img = np.expand_dims(img, axis=0)
prediction = model.predict(img)
predicted_class = np.argmax(prediction)
通过以上步骤,我们就完成了从数据准备、模型构建、训练到最终部署的全过程,成功实现了基于 Keras 的交通标志识别系统。在这个过程中,每个环节都至关重要,需要我们精心处理和优化,才能让模型达到最佳的性能。
(二)自然语言处理
在社交媒体和电商平台飞速发展的今天,用户生成的文本数据呈爆炸式增长。如何快速准确地了解用户对产品或服务的态度,成为了企业关注的焦点。情感分析作为自然语言处理中的一项重要任务,能够帮助我们从海量的文本数据中提取出用户的情感倾向,判断文本是积极、消极还是中性的。接下来,我们就 以情感分析为例,看看 Keras 在自然语言处理中的强大应用。
1、文本预处理
自然语言处理的第一步是对文本进行预处理,这一步就像是给原始文本做一次 "大扫除",去除其中的噪声和无关信息,将其转换为模型能够处理的形式。
假设我们有一个电影评论数据集,其中包含了大量的用户评论和对应的情感标签(正面或负面)。首先,需要 读取数据。可以使用 Python 的 pandas
库来读取 CSV 格式的数据集,代码如下:
import pandas as pd
data = pd.read_csv('movie_reviews.csv')
reviews = data['review'].tolist()
labels = data['sentiment'].tolist()
读取数据后,需要对文本进行清洗,去除 HTML 标签、特殊字符和标点符号等。这里可以使用正则表达式来实现,示例代码如下:
import re
def clean_text(text):
text = re.sub(r'<.\*?>', '', text) # 去除HTML标签
text = re.sub(r'[^\w\s]', '', text) # 去除标点符号
return text
cleaned_reviews = [clean_text(review) for review in reviews]
清洗完文本后,接下来是分词,将文本拆分成单个的单词。在 Python 中,可以使用 nltk
库或 spaCy
库进行分词 。以nltk
库为例,代码如下:
from nltk.tokenize import word_tokenize
tokenized_reviews = [word_tokenize(review) for review in cleaned_reviews]
分词后,还需要将单词转换为数字序列,以便模型能够处理。这就需要用到词嵌入(Word Embedding)技术,将每个单词映射到一个低维的向量空间中。在 Keras 中,可以使用 Tokenizer
类来实现这一过程,同时还可以对序列进行填充,使所有序列具有相同的长度。示例代码如下:
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer(num_words=10000)
tokenizer.fit_on_texts(tokenized_reviews)
sequences = tokenizer.texts_to_sequences(tokenized_reviews)
maxlen = 100
padded_sequences = pad_sequences(sequences, maxlen=maxlen)
这里 num_words
表示只考虑出现频率最高的 10000 个单词,maxlen
表示将所有序列填充或截断为长度 100。
2、模型搭建
完成文本预处理后,就可以使用 Keras 搭建情感分析模型 了。在自然语言处理中,循环神经网络(RNN)及其变体 ,如长短时记忆网络(LSTM)和 门控循环单元(GRU),由于能够处理序列数据中的长期依赖关系,非常适合情感分析任务。
下面是一个使用 LSTM 搭建的情感分析模型示例:
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense
model = Sequential()
model.add(Embedding(input_dim=10000, output_dim=128, input_length=maxlen))
model.add(LSTM(units=64))
model.add(Dense(units=1, activation='sigmoid'))
在这个模型中,主要有三层:
- 首先是一个 嵌入层
Embedding
,它将单词的数字序列转换为低维的向量表示,就像给每个单词赋予了一个独特的 "数字指纹"。input_dim
表示词汇表的大小,即前面设置的 10000;output_dim
表示嵌入向量的维度,这里设置为 128;input_length
表示输入序列的长度,即前面设置的maxlen
。
- 接着是一个 LSTM 层 ,它能够捕捉文本中的长期依赖关系,学习到文本的语义信息。
- 最后是一个 全连接层
Dense
,使用sigmoid
激活函数,输出一个 0 到 1 之间的概率值,表示文本为正面情感的概率。如果概率大于 0.5,则判断为正面情感;否则为负面情感。
3、训练与评估
搭建好模型后,同样需要先编译模型,指定优化器、损失函数和评估指标 。对于二分类的情感分析任务,通常使用 binary_crossentropy
作为损失函数,adam
作为优化器,评估指标可以选择准确率 accuracy
。
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
然后开始训练模型:
model.fit(padded_sequences, labels,
batch_size=32,
epochs=10,
validation_split=0.2)
在训练过程中,
batch_size
设置为 32,即每次从训练集中取出 32 个样本进行训练;epochs
设置为 10,即对整个训练集进行 10 次训练;validation_split
设置为 0.2,表示将 20% 的训练数据作为验证集,用于评估模型在训练过程中的性能,防止模型过拟合。
训练完成后,使用测试集对模型进行评估,查看模型的性能表现:
test_sequences = tokenizer.texts_to_sequences(test_tokenized_reviews)
test_padded_sequences = pad_sequences(test_sequences, maxlen=maxlen)
test_labels = test_data['sentiment'].tolist()
loss, accuracy = model.evaluate(test_padded_sequences, test_labels)
print(f'Test loss: {loss}, Test accuracy: {accuracy}')
通过以上步骤,我们就完成了基于 Keras 的情感分析任务,从原始的文本数据中成功提取出了用户的情感倾向。在实际应用中,还可以进一步优化模型,如调整超参数、使用预训练的词向量等,以提高模型的性能。
二、Keras 与其他框架的对比
在深度学习的广阔天地里, Keras 并非独自闪耀,还有许多其他优秀的框架,如 TensorFlow、PyTorch 等,它们各自散发着独特的光芒,在不同的场景中发挥着重要作用。接下来,让我们一同深入对比 Keras 与这些主流框架,探寻它们的优势与适用场景,以便在实际项目中做出明智的选择。

(一)Keras 与 TensorFlow
Keras 与 TensorFlow 有着千丝万缕的联系,如今 Keras 已成为 TensorFlow 的官方高层 API,即 tf.keras 。但它们在很多方面仍存在差异。
从易用性来看,Keras 堪称 "新手友好型" 框架的典范。其 API 设计简洁直观,高度抽象,开发者只需关注模型的搭建和训练逻辑,无需过多操心底层细节,就像驾驶一辆配备了自动驾驶辅助系统的汽车,操作简单便捷。以构建一个简单的神经网络为例,使用 Keras 可能只需短短十几行代码,就能轻松完成模型的搭建与编译。而 TensorFlow 原生 API 则相对复杂,更像是驾驶一辆手动挡汽车,需要开发者对计算图、张量操作等底层概念有深入理解,在构建模型时需要编写更多的代码来处理各种细节,学习曲线较陡。
在灵活性方面,TensorFlow 更胜一筹。它允许开发者对模型进行深度定制,精细控制每一个计算步骤,就像一位经验丰富的工匠,可以根据自己的创意和需求,对原材料进行随心所欲的加工。而 Keras 由于其高度封装的特性,在灵活性上相对受限,不过对于大多数常见的深度学习任务,Keras 的灵活性也能满足需求。
从应用场景来看, Keras 适用于快速原型开发、初学者学习以及对模型灵活性要求不高的中小型项目。比如在一些小型创业公司的产品开发初期,需要快速验证模型的可行性,Keras 就能大显身手。而 TensorFlow 则更适合大规模机器学习、生产环境部署以及对模型性能和灵活性要求极高的复杂项目。例如,谷歌的一些大型深度学习项目,如语音识别、图像搜索等,都大量使用了 TensorFlow。
(二)Keras 与 PyTorch
Keras 和 PyTorch 也各有千秋。下面主要从设计理念、计算图构建、社区支持和生态系统以及应用场景来分别对比 Keras 和 PyTorch:
在设计理念上,Keras 追求简单易用,致力于让深度学习变得触手可及,就像一把万能钥匙,能轻松打开深度学习的大门。而 PyTorch 则强调灵活性和动态性,采用动态计算图,赋予开发者更大的自由度,如同一位自由舞者,可以根据音乐的节奏和自己的灵感,自由地变换舞姿。
在计算图构建方面,Keras 主要依赖后端(如 TensorFlow)实现计算图,通常为静态计算图,在模型构建阶段就固定下来,就像提前设计好的建筑蓝图,施工过程中很难更改。而 PyTorch 采用动态计算图,计算图在运行时构建,可根据数据和模型的变化灵活调整,就像搭建积木,随时可以根据自己的想法重新组合。这使得 PyTorch 在模型调试和实验阶段具有明显优势,开发者可以实时查看和修改计算图,快速验证新的想法。
从社区支持和生态系统来看,两者都拥有活跃的社区和丰富的资源 。但 PyTorch 在学术界更受欢迎,许多前沿的深度学习研究都基于 PyTorch 展开,就像一个学术交流的热门聚集地,吸引着众多科研人员。而 Keras 由于其易用性,在工业界和初学者群体中拥有广泛的用户基础,就像一款普及度极高的大众产品,深受大家喜爱。
在应用场景上,Keras 适合初学者快速入门深度学习,以及进行快速的模型实验和迭代。比如在高校的深度学习课程教学中,Keras 可以帮助学生快速理解和掌握深度学习的基本概念和方法。而 PyTorch 则更适合深入的研究工作和对模型灵活性要求较高的高级应用,如开发新的深度学习算法、构建复杂的生成对抗网络等。
三、总结与展望
Keras 以其简洁易用的 API、强大的兼容性和广泛的应用领域,在深度学习的舞台上占据了重要的一席之地。它就像一位贴心的伙伴,陪伴着无数开发者从深度学习的新手逐渐成长为能够独当一面的高手。无论是在图像识别领域助力我们精准识别交通标志,保障出行安全;还是在自然语言处理领域帮助我们洞察用户的情感倾向,提升服务质量,Keras 都展现出了非凡的实力。
如果你也对深度学习充满好奇,渴望在这个充满无限可能的领域一展身手,不妨从 Keras 开始你的探索之旅。相信在 Keras 的陪伴下,你能够轻松地将自己的创意和想法转化为实际的深度学习模型,实现从理论到实践的跨越。
未来,随着深度学习技术的不断发展和创新,Keras 也必将不断进化和完善。我们有理由期待,Keras 会在更多的领域中发挥重要作用,为解决各种复杂的实际问题提供更加高效、便捷的解决方案。它将继续降低深度学习的门槛,让更多的人能够受益于这一前沿技术,推动人工智能技术在各个领域的广泛应用和深入发展。
延伸阅读
深度学习框架探秘|TensorFlow:AI 世界的万能钥匙