使用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 里加上权限配置,如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…...
上传文件报错:the request was rejected because no multipart boundary was found
后端使用的springboot的MultipartFile上传文件,接口使用apifox调试过没有问题,但前端调接口报错。前端使用了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 提供的一个工具类,提供了一系列静态方法,分类来复习! 1.排序操作 reverse(List list) :反转顺序shuffle(List list) : 洗牌,将顺序打乱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 <机器人基础>雅可比矩阵计算 雅可比伪逆
雅可比矩阵计算 雅可比矩阵的定义 假设我们有一个简单的两个关节的平面机器人臂,其末端执行器的位置可以表示为: 其中: L1 和 L2 是机器人臂的长度。θ1 和 θ2是关节的角度。 计算雅可比矩阵 雅可比矩阵 JJ 的定义是将关节速度与末…...

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

使用Ollama本地部署deepseek
1、下载安装Ollama 前往下载页面 https://ollama.com/download下载好安装包,如同安装软件一样,直接安装即可 win中默认为C盘,如果需要修改到其他盘,查找具体教程 运行list命令,检查是否安装成功 2、修改模型下载的…...
Rust错误处理:从灭火器到核按钮的生存指南
开篇:错误处理的生存哲学 在Rust的平行宇宙里,错误分为两种人格: panic! → 核按钮💣(不可恢复,全系统警报)Result → 灭火器🧯(可控制,局部处理࿰…...

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

电脑运行黑屏是什么原因?原因及解决方法
电脑运行黑屏是指电脑在正常开机或使用过程中,突然出现屏幕变黑,无法显示任何内容的现象。这种现象可能会给用户带来很多不便,甚至造成数据丢失或硬件损坏。那么,电脑运行黑屏是什么原因呢?下面我们将分析几种可能的原…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...