一个小例子带你轻松Keras图像分类入门

简介: 本文通过一个具体的小例子带你入门Keras图像分类,希望各位能够通过这篇文章能够学习到一些图像分类的基本操作。

这篇文章主要介绍一些在Keras中需要的常见操作。这些常见操作包括:如何保存模型并在稍后使用它们进行预测,显示数据集中的图像以及从系统中加载图像并预测其类别。

18bd8c2e2d3f2ef9cc88ae98f70c1e9c05ce009c

训练模型是一个循序渐进的过程,十分缓慢。但是,在这里,我们需要训练我们的模型一次,然后保存,这样我们就可以随时加载,并用它来预测新的图像。Keras将模型保存为.h5格式,如果你在作者发布的第一个教程中已经安装过h5py,请跳过,如果没有,请运行:

pip3 install h5py   

我们还需要matplotlib来形象化我们的图像,因此,运行:

pip3 install matplotlib

这是第一个小例子的代码:

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255
print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)
print("Accuracy: ",accuracy[1])

想保存模型,需要在model.fit()之后添加:

model.save("mnist-model.h5")

2.推理:

推理是指使用我们的模型预测新图像的过程。在你的代码中,注释上:model.fit

用以替换以下的内容:model.load_weights("mnistmodel.h5")

我们的代码现在看起来像这样:

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255
print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnist-model.h5")
#model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)
#model.save("mnistmodel.h5")
accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)
print("Accuracy: ",accuracy[1])

我们在这里所做的是从保存的模型文件中加载出模型的参数,评估函数在测试数据集上运行预测,并给出预测的准确性。

截止到目前,以上演示了如何保存模型并使用它们进行预测。真正需要解决的问题是加载出一个特定的图像,并确定它是属于什么类型的。

第一步是添加下面的代码来获得测试中的特定图像的预测:

img = test_x[130]
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)

在这里,我们只是选择一个随机图像,在这种情况下,在测试集的索引130处,我们创建一个平整的副本,重新整形:(1,784)。

我们将这个副本加入到我们的模型中,然后我们获得预测并打印出来。

在代码中注释掉model.evaluate,添加上面的代码并运行它。

你将会输出  class :6

现在我们已经预测了,接下来我们就需要使用matplolib来显示图像及其预测的类型:

img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

这些操作是非常必要的,因为使用matplotlib将会非常直观的显示我们的预测结果是否正确。

这样我们的代码就会变成:

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
(train_x, train_y) , (test_x, test_y) = mnist.load_data()
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")
img = test_x[130]
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

运行这段代码,你的输出应该是下面这张图片,这意味着我们已经建立了一个基本的数字识别系统,你也可以尝试不同的测试图像索引,看看将得到些什么。

fafe73a850e58a4da4e59da213a35811eedefd5a

但是,如果想引入测试集中没有的图像,那么你需要将以下图像保存到你的系统中,并将其复制到python文件所在的目录中。

运行下面的代码:

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
from keras.preprocessing import image
(train_x, train_y) , (test_x, test_y) = mnist.load_data()
train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)
train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)
model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))
model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")
img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)
test_img = img.reshape((1,784))
img_class = model.predict_classes(test_img)
prediction = img_class[0]
classname = img_class[0]
print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

你可能会注意到我们使用了一些新的东西,首先我们从Keras.preprocessing中导入了图像,然后加了:

img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)

在第一行中,我们从磁盘加载图像,并指定它应该调整大小为28*28*1,请记住,这是原始mnist图像的尺寸,它的作用是让我们保持图像识别过程中的稳定。接下来,我们将图像转换为一个像素数组,这才是我们真正要识别的。运行它并自己检查结果,预测其结果是否是3。

1870e27b48d7c7a1842c6cf0a1a79478be6e01ff

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《Basics of image classification with Keras》

作者:John Olafenwa

译者:乌拉乌拉,审校:袁虎。

文章为简译,更为详细的内容,请查看原文文章

相关文章
|
7月前
|
机器学习/深度学习 数据采集 安全
大模型应用:联邦学习融合本地大模型:隐私合规推荐的核心流程与实践.62
本文探讨联邦学习与本地大模型(如Qwen1.5-1.8B)融合的推荐方案:在数据不出域前提下,通过加密参数协同训练,破解隐私合规与推荐精度的矛盾,实现“数据可用不可见”,已验证可显著提升稀疏数据门店的推荐准确率。
452 15
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
教育行业如何做GEO?让AI成为你的课程推荐官
过去,学生找课程靠搜索;现在,他们直接问AI:“附近有哪些性价比高的编程课?”或“商科最好的在线大学?”——AI不会简单罗列链接,而是直接推荐答案。如果你的教育机构没被AI“看见”,可能已经错过了新一轮流量红利。 作为深耕GEO领域的实战团队,数聚酷科技结合教育行业特性,总结出以下可落地的GEO优化策略,帮助你的课程和…
755 6
|
10月前
|
弹性计算 Kubernetes 安全
已上线!云监控 2.0 面向实体的全链路日志审计与风险溯源
在云端,一次 API 调用背后可能隐藏着一场数据泄露;一个异常进程背后,或许是 AK 泄露引发的链式攻击。传统日志“看得见却看不懂”,而云监控 2.0 日志审计通过 UModel 实体建模,将分散在 ACS、K8s、主机各层的日志自动串联。
634 92
|
6月前
|
缓存 数据建模 BI
企业内训系统搭建:自建平台与第三方SaaS的核心差异
企业内训系统搭建,自建与SaaS本质是战略选择:自建掌控架构、数据、权限与扩展能力,支撑集团化、智能化长期发展;SaaS虽快但受限于多租户架构,难沉淀数据资产、适配复杂组织。三年后,稳定性与数据价值高下立现。(239字)
|
6月前
|
监控 算法 搜索推荐
真题解密:从阿里到腾讯,2026届大厂笔试题库背后的“潜规则”与筛人逻辑
2026届大厂笔试非“考能力”,而是“筛DNA”:阿里重业务落地(如签到积分题考规则理解),腾讯严控代码质量(命名/注释/规范),字节拼手速与取舍,美团考场景设计能力。四家逻辑迥异,精准匹配公司基因。
|
人工智能 自然语言处理 前端开发
【CodeBuddy】三分钟开发一个实用小功能之:动态文字路径动画
通过CodeBuddy,一个AI编程助手,将模糊创意转化为精美动画。本文记录了如何用SVG和GSAP实现“文字沿曲线流动”的过程:从自然语言描述需求到AI生成代码并实时调试优化。最终效果生动灵动,文字不仅沿路径移动还带弹跳感。整个开发体验流畅高效,AI不仅提供代码还解释逻辑、引导细节决策,让编程新手也能轻松实现复杂动画,展现了AI编程在降低技术门槛、激发创意方面的巨大潜力。附完整代码供参考。
492 1
【CodeBuddy】三分钟开发一个实用小功能之:动态文字路径动画
|
10月前
|
Apache
Excel工具-HUTOOL-读取Excel
基于Hutool和Apache POI,封装Excel读取工具,支持读取为List、Map或Bean;提供SAX模式高效解析大文件,避免内存溢出,适用于Excel 2003/2007格式,支持按行处理数据。
436 0
|
12月前
|
数据采集 缓存 大数据
【赵渝强老师】大数据日志采集引擎Flume
Apache Flume 是一个分布式、可靠的数据采集系统,支持从多种数据源收集日志信息,并传输至指定目的地。其核心架构由Source、Channel、Sink三组件构成,通过Event封装数据,保障高效与可靠传输。
611 1
|
传感器 编解码 数据挖掘
ASTER 全球数字高程模型 V003
ASTER全球数字高程模型V003(ASTGTM)由NASA与日本METI合作生成,覆盖北纬83°至南纬83°,空间分辨率约30米。基于2000–2013年ASTER立体影像自动处理,融合超188万场景,优化水体与地形精度,提供DEM与场景数量图层,数据无显著空隙,适用于多领域地形分析。
760 7
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
1387 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】