LeNet卷积神经网络,手写数字识别

news2024/12/24 2:11:15

 1. LeNet卷积神经网络的概念

先看看GPT的回答

 

 有的资料中分层为

 他们之间得差别就在于gpt的卷积层c5和上图中的全连接层1是同一种概念,因为该层使用的是5*5的卷积核,步长为一,根据公式可以算出输出的大小即是1X1的大小

 训练参数是卷积核的大小乘以个数加上与个数相等的偏置

2.  数字识别模型的构建

 1 导包

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt

 2 预处理数据

# 加载和预处理数据
# 加载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

# 将标签转换为one-hot编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

3 构建LeNet模型

 

 一开始在网上搜索资料时很多的模型使用的激活函数是sigmoid,这里使用的是relu激活函数

ReLU(Rectified Linear Unit)激活函数更为常用。ReLU激活函数在很多情况下被证明可以提高训练速度并减少梯度消失问题。因此,许多现代实现会使用ReLU替代Sigmoid。

# 构建LeNet-5模型
model = models.Sequential()

# 第一层卷积层:6个5x5的卷积核,激活函数使用ReLU,输入形状为28x28x1,使用same填充保持尺寸
model.add(layers.Conv2D(6, (5, 5), activation='relu', input_shape=(28, 28, 1), padding='same'))

# 第一层池化层:2x2的平均池化
model.add(layers.AveragePooling2D((2, 2)))

# 第二层卷积层:16个5x5的卷积核,激活函数使用ReLU,使用same填充保持尺寸
model.add(layers.Conv2D(16, (5, 5), activation='relu', padding='same'))

# 第二层池化层:2x2的平均池化
model.add(layers.AveragePooling2D((2, 2)))

# 第三层卷积层:120个5x5的卷积核,激活函数使用ReLU,使用same填充保持尺寸
model.add(layers.Conv2D(120, (5, 5), activation='relu', padding='same'))

# 将多维特征图展开成一维向量
model.add(layers.Flatten())

# 全连接层:84个神经元,激活函数使用ReLU
model.add(layers.Dense(84, activation='relu'))

# 输出层:10个神经元(对应0-9十个数字),激活函数使用softmax
model.add(layers.Dense(10, activation='softmax'))

 4 编译训练保存

# 编译模型
# 使用Adam优化器,损失函数为交叉熵,评价指标为准确率
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
# 使用训练数据训练模型,设置迭代次数为10,批次大小为64,验证集比例为20%
model.fit(train_images, train_labels, epochs=10, batch_size=64, validation_split=0.2)

# 保存训练好的模型
model.save('lenet_mnist.h5')

 5 对文件夹内我自己画的图进行预测

# 定义预处理输入图片的函数
def preprocess_image(img_path):
    # 加载图片,调整尺寸为28x28,并转换为灰度图
    img = image.load_img(img_path, target_size=(28, 28), color_mode='grayscale')
    # 将图片转换为数组并归一化处理
    img_array = image.img_to_array(img)
    # 将黑底白字转换为白底黑字(MNIST数据集是白底黑字)
    img_array = 1 - img_array / 255.0
    # 调整数组形状为(1, 28, 28, 1)
    img_array = img_array.reshape((1, 28, 28, 1)).astype('float32')
    return img_array

# 加载保存的模型
model = load_model('lenet_mnist.h5')

# 设置要预测的图片路径
img_path = 'image.png'

# 预处理输入图片
img_array = preprocess_image(img_path)

# 使用模型进行预测
predictions = model.predict(img_array)

# 获取预测结果(概率最大的类别)
predicted_digit = np.argmax(predictions)

# 打印预测结果
print(f'The predicted digit is: {predicted_digit}')

# 可视化输入图片并显示预测结果
plt.imshow(img_array.reshape(28, 28), cmap='gray')
plt.title(f'Predicted: {predicted_digit}')
plt.show()

 

 3. 利用网站仿真数字识别测试

 

 4. 运行结果

 预测值为3,与图片相符合, 还有每一轮的loss值,准确率

 更换图片同样正确

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sentinel 服务流量控制 、熔断降级

1、什么是 sentinel,可以用来干什么 sentinel是用来在微服务系统中保护微服务对的作用,如何避免服务的雪崩、熔断、降级,说白了就是用来替换hystrix。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 官网:GitHub - alibaba/Se…

Python从0到100(四十三):数据库与Django ORM 精讲

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

08 capture软件新建原理图 09 原理图添加元器件 10 原理图信号连通 11 原理图电源和地连通

08 capture软件新建原理图 && 09 原理图添加元器件 && 10 原理图信号连通 && 11 原理图电源和地连通 第一部分 08 capture软件新建原理图第二部分 09 原理图添加元器件第三部分 10 原理图信号连通第四部分 11 原理图电源和地连通 第一部分 08 capture软…

服务器重启了之后就卡在某个页面了,花屏,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

LC61----1374. 生成每种字符都是奇数个的字符串(字符串)---java版

1.题目 2.思路 (1)题目要生成每种字符是奇数个的字符串。 (2)所以直接用参数n%2来判断。 (3)返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。 (4)感觉题目不是很规范哈…

云服务器部署vite前端项目

本篇博客将详述眨眼睛部署前端项目遇到的问题和解决方法 打包vite项目 输入指令会生成一个dist文件夹 npx vite build 如果我们使用liveServer打开这个html会发现报错 细看一下,是生成的路径都是以/开头,按理我们应该使用相对路径 当然它默认这么生成肯定…

lambda表达式,真题示例

Lambda表达式 它使代码更加简洁、易读,函数式编程增强了代码的表达力。常用于对集合的操作,如遍历、过滤、转换等。 Lambda表达式的形式: 参数, 箭头(->) 以及一个表达式: (String first, String sec…

如何找到最快解析速度的DNS

如何找到最快解析速度的DNS DNS,即域名系统(Domain Name System),是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用记住能够被机器直接读取的IP数串。 在浏览网页时,我们通常使用域名,而不是IP地址。当域名在…

虚拟机复制后网络不可用,报错“network.service - LSB: Bring up/down networking”

查询IP地址,eth33 没有显示IP地址 尝试重启,有报错,并且有提示,按照提示执行下看看 解决办法 chkconfig NetworkManager offsystemctl disable NetworkManager.serviceservice NetworkManager stopservice network restart 之后检…

堆(c++)

堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。 堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。 常见的堆有二叉堆、斐波那契堆等。 堆是非线性数据结构&#…

hugging face 使用教程———快速入门

概述 本篇存在的意义是快速介绍hugging face使用,梳理主要部件,梳理易混淆概念。原因是:目前hugging face的使用,官方放在了3个地方(参考链接部分):使用文档、NLP教程、Transformers git的readm…

洛谷P1910题解

思路 一个变型的DP 这道题增加了一个维度&#xff0c;其他地方和其他的01背包没有任何区别 只是状态转移方程由变成了 dp[j][k]max(dp[j][k],dp[j-c[i]][k-b[i]]a[i]); 还要注意一点&#xff0c;不能开三维的数组&#xff0c;会MLE。 代码 #include<bits/stdc.h>…

【llama3.1】ollama的使用--本地部署使用llama3.1模型

快速入门 安装完成ollama后,在命令行窗口输入 ollama run llama3 上图表示 Ollama 正在下载 llama3 任务所需的资源文件,并显示了当前的下载进度、速度和预计剩余时间。这是 Ollama 在准备运行 llama3 任务之前所需的步骤。 上面的步骤完成后,就可以在本地进行聊天了,…

USB枚举过程记录和个人认识以及设备程序的框架简述

主机和从机认识 参考 主机 从机 从usb设备连接usb口整个过程概述 参考&#xff1b;参考1 枚举过程简单说就是usb设备插入电脑接口后建立最初的识别设备通信的过程 参考 参考下面的分析是从开始对默认地址第一次发送Get_Descriptors开始的 主机和设备断开或连接以及高速…

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…

【精通Redis】Redis入门介绍

引言 本文作为笔者研究学习Redis的开篇之作&#xff0c;主要是对redis做一个简单系统的介绍&#xff0c;日常开发中都只是集成使用其缓存的功能&#xff0c;没有更深入的学习了解它的特性。笔者作为一个有五年Java开发经验的程序员&#xff0c;把大量时间都花在了编码上&#…

从零入手人工智能(6)—— 聚类

1.小故事 有一家零售连锁店&#xff0c;他们以其精准的市场定位和个性化的顾客服务而闻名&#xff0c;随着市场竞争的加剧和顾客需求的多样化&#xff0c;他们的管理层开始意识到&#xff0c;只有更加深入地了解他们的顾客群体&#xff0c;以便更好地满足他们的需求。 他们定…

渗透测试——利用公网反弹shell到本地的两种方式,vmware虚拟机与主机的端口转发,本地ssh无法上线的问题解决

解决问题&#xff1a; 因长期使用本地模拟靶场&#xff0c;实战护网时并非模拟靶场&#xff0c;shell反弹需要利用公网测试。解决目标站无法反弹到本地的情况。解决本地是windows&#xff0c;虚拟机是kail、linux&#xff0c;无法相互转换流量的情况。 环境搭建 靶机 centOS7 …

HarmonyOS(45) 控件拖动或者拖拽PanGesture

PanGesture实现控件拖动的效果&#xff0c;通过拖动的坐标位置调用position或者translate方法来更新UI的位置。效果见下图&#xff1a; 具体代码如下&#xff1a; // xxx.ets Entry Component struct PanGestureExample {State offsetX: number 0State offsetY: number 0pos…

做视频混剪都是去哪里找高清素材的?分享10个高清视频素材库

提升视频混剪质感的10个高清素材库推荐 在这个视觉体验至上的时代&#xff0c;视频的视觉质量对吸引观众至关重要。如果你正在寻找高清素材以提升视频混剪作品的层次&#xff0c;那么你来对地方了。今天&#xff0c;我将为你揭秘10个视频混剪达人常用的高清素材库&#xff0c;…