当前位置: 首页 > news >正文

使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南

使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南
一、前言:为什么选择CNN进行图像分类?
在人工智能领域,图像分类是计算机视觉的基础任务。传统的机器学习方法需要人工设计特征提取器,而深度学习通过卷积神经网络(CNN)实现了端到端的学习。CNN能够自动从原始像素中提取多层次特征,这种特性使其在图像处理任务中表现出色。

对于初学者来说,CNN可能听起来复杂,但其实它的核心思想非常直观。想象一下人类识别物体时,首先会关注边缘、纹理等局部特征,然后组合这些特征形成整体认知——这正是CNN的工作原理。

二、深度学习基础知识准备
2.1 卷积神经网络核心组件
卷积层(Convolution Layer)
使用滤波器(Filter)扫描输入图像
提取局部特征(边缘、纹理等)
参数共享机制大幅减少参数量
池化层(Pooling Layer)
通过下采样减少空间维度
增强平移不变性
常用最大池化(Max Pooling)
全连接层(Fully Connected Layer)
将高级特征映射到分类结果
通常出现在网络末端
2.2 为什么需要激活函数?
ReLU(Rectified Linear Unit)是最常用选择
引入非线性因素,增强模型表达能力
数学表达式:f(x) = max(0, x)
三、实战准备:环境搭建与数据准备
3.1 环境配置

需要安装的库

!pip install tensorflow matplotlib numpy
3.2 数据集介绍
我们使用经典的MNIST手写数字数据集:

60,000张训练图像
10,000张测试图像
28x28像素灰度图
10个类别(0-9)
from tensorflow.keras.datasets import mnist

加载数据集

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

数据预处理

train_images = train_images.reshape((60000, 28, 28, 1)).astype(‘float32’) / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype(‘float32’) / 255

标签编码

from tensorflow.keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
四、构建CNN模型
4.1 模型架构设计
from tensorflow.keras import layers
from tensorflow.keras import models

model = models.Sequential([
# 卷积部分
layers.Conv2D(32, (3, 3), activation=‘relu’, input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation=‘relu’),
layers.MaxPooling2D((2, 2)),

# 分类部分 
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')

])
4.2 模型结构解析
Model: “sequential”


Layer (type) Output Shape Param #

conv2d (Conv2D) (None, 26, 26, 32) 320
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
max_pooling2d_1 (MaxPooling (None, 5, 5, 64) 0
flatten (Flatten) (None, 1600) 0
dense (Dense) (None, 64) 102464
dropout (Dropout) (None, 64) 0
dense_1 (Dense) (None, 10) 650

Total params: 121,930
Trainable params: 121,930
Non-trainable params: 0
五、模型训练与评估
5.1 编译模型
model.compile(optimizer=‘adam’,
loss=‘categorical_crossentropy’,
metrics=[‘accuracy’])
5.2 训练过程
history = model.fit(train_images, train_labels,
epochs=10,
batch_size=64,
validation_split=0.2)
5.3 训练结果分析
Epoch 1/10
750/750 [] - 25s 32ms/step - loss: 0.2460 - accuracy: 0.9255 - val_loss: 0.0838 - val_accuracy: 0.9752

Epoch 10/10
750/750 [
] - 24s 32ms/step - loss: 0.0158 - accuracy: 0.9956 - val_loss: 0.0484 - val_accuracy: 0.9878
5.4 模型评估
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f’测试集准确率: {test_acc:.4f}')

输出结果:测试集准确率: 0.9902

六、模型优化技巧
6.1 数据增强
from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
rotation_range=10,
zoom_range=0.1,
width_shift_range=0.1,
height_shift_range=0.1)

使用生成器训练模型

model.fit(datagen.flow(train_images, train_labels, batch_size=32),
epochs=20)
6.2 正则化方法

在Dense层添加L2正则化

layers.Dense(64, activation=‘relu’,
kernel_regularizer=keras.regularizers.l2(0.001))
6.3 学习率调整
from tensorflow.keras.callbacks import ReduceLROnPlateau

reduce_lr = ReduceLROnPlateau(monitor=‘val_loss’,
factor=0.2,
patience=3,
min_lr=1e-6)

model.fit(…, callbacks=[reduce_lr])
七、可视化分析
7.1 特征图可视化
layer_outputs = [layer.output for layer in model.layers[:4]]
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)

activations = activation_model.predict(test_images[0:1])
7.2 训练过程可视化
import matplotlib.pyplot as plt

plt.plot(history.history[‘accuracy’], label=‘训练准确率’)
plt.plot(history.history[‘val_accuracy’], label=‘验证准确率’)
plt.title(’ 模型训练过程’)
plt.ylabel(’ 准确率’)
plt.xlabel(‘Epoch’)
plt.legend()
plt.show()
八、模型部署与应用
8.1 保存训练好的模型
model.save(‘mnist_cnn.h5’)
8.2 实际应用示例
from tensorflow.keras.preprocessing import image
import numpy as np

def predict_digit(img_path):
img = image.load_img(img_path, color_mode=‘grayscale’, target_size=(28, 28))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0) / 255.0
prediction = model.predict(img_array)
return np.argmax(prediction)

示例使用

print(predict_digit(‘test_digit.png’)) # 输出预测结果
九、常见问题解答
Q1:为什么我的模型准确率不高?
检查数据预处理是否正确
尝试增加网络深度
调整学习率和训练轮次
添加正则化防止过拟合
Q2:如何选择卷积核数量?
通常从32/64开始,逐层加倍
根据任务复杂度调整
使用自动架构搜索(NAS)方法
十、总结与展望
通过本教程,我们完成了从理论到实践的完整CNN实现过程。当前模型在MNIST数据集上达到了99%+的准确率,但实际应用场景通常更加复杂。建议下一步:

尝试更复杂的数据集(CIFAR-10/100)
学习现代网络架构(ResNet, MobileNet)
探索迁移学习技术
了解模型解释性方法
深度学习的世界充满挑战和机遇,保持实践和理论学习的平衡,你将很快成长为优秀的AI工程师!

相关文章:

使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南

使用TensorFlow和Keras构建卷积神经网络:图像分类实战指南 一、前言:为什么选择CNN进行图像分类? 在人工智能领域,图像分类是计算机视觉的基础任务。传统的机器学习方法需要人工设计特征提取器,而深度学习通过卷积神经…...

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…...

20.<Spring图书管理系统①(登录+添加图书)>

PS:关于接口定义 接口定义,通常由服务器提供方来定义。 1.路径:自己定义 2.参数:根据需求考虑,我们这个接口功能完成需要哪些信息。 3.返回结果:考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…...

关于图像锐化的一份介绍

在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…...

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释: Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …...

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…...

CentOS服务器部署Docker+Jenkins持续集成环境

一、准备工作 一台运行 CentOS 的服务器,确保有足够的磁盘空间、内存资源,并且网络连接稳定。建议使用 CentOS 7 或更高版本,本文以 CentOS 7 为例进行讲解。 拥有服务器的 root 权限,因为后续安装软件包、配置环境等操作需要较…...

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…...

【Android】Android开发应用如何开启任务栏消息通知

Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置&#xff0c;如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...

上传文件报错:the request was rejected because no multipart boundary was found

后端使用的springboot的MultipartFile上传文件&#xff0c;接口使用apifox调试过没有问题&#xff0c;但前端调接口报错。前端使用了fetch发送formData数据。 the request was rejected because no multipart boundary was found 前端使用的请求头是 multipart/form-data 没有…...

大模型—Dify本地化部署实战

Dify本地化部署实战 系统要求 安装 Dify 之前, 请确保你的机器已满足最低安装要求: CPU >= 2 CoreRAM >= 4 GiB本地部署 开始前先简单介绍下部署Dify需要用到的组件,稍微有点多,但放心,有Docker你怕啥? 关系数据库:postgres缓存:Redis向量数据库:支持weaviate…...

功能架构元模型

功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…...

常用工具类——Collections集合框架

常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类&#xff0c;提供了一系列静态方法&#xff0c;分类来复习&#xff01; 1.排序操作 reverse(List list) :反转顺序shuffle(List list) &#xff1a; 洗牌&#xff0c;将顺序打乱sort(List list) &…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆

雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂&#xff0c;其末端执行器的位置可以表示为&#xff1a; 其中&#xff1a; L1​ 和 L2 是机器人臂的长度。θ1​ 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…...

网络爬虫js逆向之异步栈跟栈案例

【注意&#xff01;&#xff01;&#xff01;】 前言&#xff1a; 1. 本章主要讲解js逆向之异步栈跟栈的知识&#xff08;通过单步执行调试&#xff09; 2. 使用关键字搜定位加密入口 3. 本专栏通过多篇文章【文字案例】的形式系统化进行描述 4. 本文章全文进行了脱敏处理 5. 详…...

使用Ollama本地部署deepseek

1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包&#xff0c;如同安装软件一样&#xff0c;直接安装即可 win中默认为C盘&#xff0c;如果需要修改到其他盘&#xff0c;查找具体教程 运行list命令&#xff0c;检查是否安装成功 2、修改模型下载的…...

Rust错误处理:从灭火器到核按钮的生存指南

开篇&#xff1a;错误处理的生存哲学 在Rust的平行宇宙里&#xff0c;错误分为两种人格&#xff1a; panic! → 核按钮&#x1f4a3;&#xff08;不可恢复&#xff0c;全系统警报&#xff09;Result → 灭火器&#x1f9ef;&#xff08;可控制&#xff0c;局部处理&#xff0…...

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…...

电脑运行黑屏是什么原因?原因及解决方法

电脑运行黑屏是指电脑在正常开机或使用过程中&#xff0c;突然出现屏幕变黑&#xff0c;无法显示任何内容的现象。这种现象可能会给用户带来很多不便&#xff0c;甚至造成数据丢失或硬件损坏。那么&#xff0c;电脑运行黑屏是什么原因呢&#xff1f;下面我们将分析几种可能的原…...

如何用嘎嘎降AI处理理工科论文:公式图表密集的理工科毕业论文降AI免费完整操作流程

如何用嘎嘎降AI处理理工科论文&#xff1a;公式图表密集的理工科毕业论文降AI免费完整操作流程 帮三个不同学校的同学处理过论文降AI问题&#xff0c;每次情况不完全一样&#xff0c;但流程基本是固定的。 主推工具&#xff1a;嘎嘎降AI&#xff08;www.aigcleaner.com&#…...

汽车资讯网站|基于springboot+vue的汽车资讯网站(源码+数据库+文档)

汽车资讯网站 目录 基于springbootvue的汽车资讯网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云开…...

Deep Multiview Clustering by Contrasting Cluster Assignments

通过对比不同的聚类分配实现深度多视图聚类摘要深度学习在大规模多视图聚类上表现好&#xff0c;但是该领域如何学习不同视图的潜在表示仍是一个问题。作者认为不同视图之间应该对齐的不是中间层特征&#xff0c;而是最后的聚类分配结果。因此提出 CVCL&#xff0c;通过对比不同…...

科研人员实用:OpenClaw批量下载文献、整理参考文献格式,自动生成论文引用列表

科研利器&#xff1a;OpenClaw——自动化文献下载、格式整理与引用列表生成实战指南摘要 在科研工作中&#xff0c;文献的收集、管理与引用是耗时耗力的关键环节。面对海量的学术资源&#xff0c;如何高效地批量下载所需文献、规范整理参考文献格式、并快速生成符合要求的论文引…...

高效AI教材写作指南:借助AI工具,低查重完成40万字教材编写!

教材编写中的原创性与合规性问题及 AI 工具解决方案 在教材编写的过程中&#xff0c;如何平衡原创性与合规性是一个不可忽视的重要问题。在借鉴优秀教材中的内容时&#xff0c;创作者不可避免地会担心作品的查重率过高&#xff1b;而在尝试自行创作知识点时&#xff0c;又可能…...

再不碰数字化,文科生简历可能连初筛都过不了

我学的是汉语言文学&#xff0c;大四投简历那段时间&#xff0c;整整两个月只收到了三个面试通知。其中一个HR在电话里很直接地说&#xff1a;“你的文字功底不错&#xff0c;但我们这个岗位需要处理数据、会用AI工具&#xff0c;你简历上看不到相关经历。”电话挂掉之后&#…...

开源网络过滤工具librefang:DNS与代理混合部署实战指南

1. 项目概述&#xff1a;一个开源网络过滤与内容管理工具最近在折腾家庭网络和自建服务时&#xff0c;经常遇到一个核心需求&#xff1a;如何在不依赖商业方案或复杂硬件的前提下&#xff0c;对网络流量进行透明、高效且可定制的内容过滤与管理。无论是想给孩子一个更纯净的上网…...

从锡疫到无铅焊料失效:材料环境可靠性设计实战解析

1. 从拿破仑的纽扣说起&#xff1a;材料失效背后的工程警示在电子工程领域&#xff0c;我们每天都在与材料打交道。从PCB上的焊点&#xff0c;到芯片内部的金属互连&#xff0c;再到外壳的塑料&#xff0c;材料的可靠性直接决定了产品的成败。几年前&#xff0c;当整个行业因Ro…...

工业仿真软件推荐指南|高解析度、低成本、自主可控的长期之选

在工业数字化与AI融合的当下&#xff0c;选择一款值得长期投入的工业仿真软件&#xff0c;已成为企业研发效率与成本控制的关键。面对市场上众多CAE/CFD软件&#xff0c;如何从“能用”到“好用”&#xff0c;再到“值得长期持有”&#xff0c;需要一套清晰的评估框架。本文将从…...

14602开源|黄大年茶思屋第146期第二题:支持采集内容运动的静态3DGS重建

AI无偏差版脱敏题目标准化解题详解&#xff08;第二题&#xff1a;支持采集内容运动的静态3DGS重建&#xff09; 模块一&#xff1a;脱敏题目原文复刻 【脱敏题目原文】 支持采集内容运动的静态3DGS重建 基于3DGS及其扩展形式&#xff0c;支持动态建模和静态渲染&#xff0c;输…...