[深度学习入门案例1]基于Keras的手写数字图像识别

news2024/12/23 23:25:19

文章目录

 一、工具与环境

二、深度学习环境的搭建

1.安装Anaconda

2.创建虚拟环境

第1步:打开Anaconda的命令窗口,即Anaconda Prompt

 第2步:使用命令创建指定版本的python环境(这里以py36命令环境名称举例)

3.切换环境

4.下载项目所需的工具包

 5.设置Pycharm的环境为创建好的环境

三、基于Keras的手写数字图像识别项目运行与测试

1.核心代码

2.识别的手写图片集合

3.识别的基本原理

4.运行与测试

 四、分析与小结

 参考文章


 一、工具与环境

  • Pycharm 2022.1.4
  • conda version : 4.5.4
  • python version : 3.6.5.final.0
  • platform : win-64

二、深度学习环境的搭建

1.安装Anaconda

        Anaconda是一个开源的Python发行版本,用来管理Python相关的包,使用anaconda可以很方便的切换到不同的python环境,使用不同的深度学习框架来开发项目,非常高效!

具体下载与安装步骤,请参照这位大佬的文章

史上最全Anaconda安装与使用教程icon-default.png?t=N4P3https://blog.csdn.net/wq_ocean_/article/details/103889237?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168594896716800180669116%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168594896716800180669116&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-103889237-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=Anaconda%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187

2.创建虚拟环境

第1步:打开Anaconda的命令窗口,即Anaconda Prompt

Anaconda安装成功后会附带,在开始栏处

 第2步:使用命令创建指定版本的python环境(这里以py36命令环境名称举例)

conda create -n py36 python=3.6

3.切换环境

        默认环境是base,我们需要创建一个指定版本的环境供我们使用,可以理解为开发一个项目所需要创建的指定环境,这样不同项目之间环境是相互隔离开的 。使用命令activate +环境名即可实现环境的切换。

activate py36

切换到py36环境后,输入conda info 命令,出现如下信息即表面环境创建成功!

4.下载项目所需的工具包

        在成功切换到py36(自己创建的环境)之后,依次在Anaconda Prompt中执行下面的命令来下载所需工具包,注意:由于默认下载源在国外,所以下载速度会很慢,我们可以使用国内的一些镜像来下载,速度很快。只需要在下面每一个命令后面加上 -i 镜像地址 即可。

我使用的是清华大学的镜像源: -i  https://pypi.tuna.tsinghua.edu.cn/simple

pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplolib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install keras==2.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tensorflow==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

 5.设置Pycharm的环境为创建好的环境

点击Pycharm右下角Add Interpreter

如下图所示,选择Anaconda安装目录下 Scripts文件夹下的conda.exe

(有些也会出现在根目录下,选择根目录下的conda.exe也行,根据Pycharm不同版本会有区别)

 

 Pycharm切换解释器之后,至此,环境准备工作完成了


三、基于Keras的手写数字图像识别项目运行与测试

1.核心代码

train_cnn.py

#步骤01 入所需要的模块
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
import numpy as np
np.random.seed(10)

#步骤02 下载mnist数据集、读取数据集
(x_Train, y_Train) , (x_Test, y_Test) = mnist.load_data()

#步骤03 将图像特征值转化为6000,28,28,1的4维矩阵
x_Train4D = x_Train.reshape(x_Train.shape[0], 28, 28,1).astype('float32')
x_Test4D = x_Test.reshape(x_Test.shape[0], 28, 28, 1).astype('float32')

#步骤04 进行标准化
#将像素范围设置在【0,1】
x_Train4D_normalize = x_Train4D / 255
x_Test4D_normalize = x_Test4D / 255

#步骤05 label进行一位有效编码转换
#将标签转成读热码
y_TrainHot = np_utils.to_categorical(y_Train)
y_TestHot = np_utils.to_categorical(y_Test)

#=>建立模型
#步骤01 定义模型
model = Sequential()

#步骤02 建立卷积层1
model.add(Conv2D(filters=16, # filter = 16 建立16个滤镜
# kernel_size = (5,5) 每一个滤镜是5 × 5的大小
kernel_size=(5,5), 
    # padding = 'same' 设置卷积运算产生的图像大小不变
padding='same', 
#输入的图像形状为28*28,1代表单色灰度,3代表RGB
input_shape= (28, 28, 1),
# activation设置激活函数为relu建立池化层1
activation='relu'))

#步骤03 建立池化层1
model.add(MaxPooling2D(pool_size=(2,2)))#缩减采样,输出16个14*14图像

#步骤04建立卷积层2
model.add(Conv2D(filters=36,#建立36个滤镜
kernel_size=(5,5),#每一个滤镜是5 × 5的大小
padding='same',#Convolution完成后的图像大小不变
activation='relu'#输出36个14*14的图像
))

#步骤05 建立池化层2,加入Dropout避免Overfitting
model.add(MaxPooling2D(pool_size=(2,2)))#图像大小变为7*7
# 加入DropOut(0.25),每次训练时,会在神经网络中随机放弃25%的神经元,避免过拟合建立神经网络(平坦层,隐藏层,输出层)建立平坦层
model.add(Dropout(0.25))

#步骤06 建立平坦层
model.add(Flatten())#长度是36*7*7个神经元

#步骤07 建立隐藏层
model.add(Dense(128, activation='relu'))
# 把DropOut加入模型中,DropOut(0.5)在每次迭代时候会随机放弃50%的神经元,避免过拟合
model.add(Dropout(0.5))
# 建立输出层,一共10个单元,对应0-9一共10个数字。使用softmax进行激活
model.add(Dense(10, activation='softmax'))
# 查看模型摘要
print(model.summary())

#=>进行训练
#步骤01 定义训练方式
# 定义训练方式compile
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

#步骤02 开始训练
train_history = model.fit(x = x_Train4D_normalize, y = y_TrainHot,
validation_split=0.2,
#将80%作为训练数据,20%作为测试数据
epochs=10,#执行10个训练周期
batch_size=300,#每一批300项数据
verbose=2#参数为2表示显示训练过程
)

train_cnn_model.py

from keras.datasets import mnist
from keras.utils import np_utils
import numpy as np
np.random.seed(10)

(x_Train, y_Train) , (x_Test, y_Test) = mnist.load_data()

x_Train4D = x_Train.reshape(x_Train.shape[0], 28, 28,1).astype('float32')
x_Test4D = x_Test.reshape(x_Test.shape[0], 28, 28, 1).astype('float32')

x_Train4D_normalize = x_Train4D / 255
x_Test4D_normalize = x_Test4D / 255
y_TrainHot = np_utils.to_categorical(y_Train)
y_TestHot = np_utils.to_categorical(y_Test)

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

model = Sequential()
model.add(Conv2D(filters=16, kernel_size=(5,5), padding='same', input_shape = (28, 28, 1), activation='relu'))
# 参数说明
# filter = 16 建立16个滤镜
# kernel_size = (5,5) 每一个滤镜是5 × 5的大小
# padding = 'same' 设置卷积运算产生的图像大小不变
# input_shape = (28, 28, 1) 第一二维代表输入图像的形状是28 × 28,第三维因为是单色灰度图像,所以最后维数值是1
# activation设置激活函数为relu建立池化层1
model.add(MaxPooling2D(pool_size=(2,2)))
# 输入参数为pool_size=(2,2),执行第一次缩减采样,将16个28 ×28的图像缩小为16个14 × 14的图像建立卷积层2,将16个图像转化为36个图像,不改变图像大小,仍为14 × 14
model.add(Conv2D(filters=36, kernel_size=(5,5), padding='same', activation='relu'))
# 加入池化层2,并加入DropOut避免过拟合
model.add(MaxPooling2D(pool_size=(2,2)))
# 执行第二次缩减采样,将14 × 14图像转换为7 × 7图像
model.add(Dropout(0.25))
# 加入DropOut(0.25),每次训练时,会在神经网络中随机放弃25%的神经元,避免过拟合建立神经网络(平坦层,隐藏层,输出层)建立平坦层
model.add(Flatten())
# 将之前步骤建立的池化层2,一共有36个7 × 7的图像转化为一维向量,长度是36 × 7 × 7 = 1764, 也就是1764个float数,对应1764个神经元建立隐藏层,一共128个神经元
model.add(Dense(128, activation='relu'))
# 把DropOut加入模型中,DropOut(0.5)在每次迭代时候会随机放弃50%的神经元,避免过拟合
model.add(Dropout(0.5))
# 建立输出层,一共10个单元,对应0-9一共10个数字。使用softmax进行激活
model.add(Dense(10, activation='softmax'))
# 查看模型摘要
print(model.summary())
# # 进行训练
# 定义训练方式

# # 加载之前训练的模型
try:
    # model.load_weights("SaveModel/minist_model.h5")
    model.load_weights("SaveModel/minist_model_graphic.h5")
    print("加载模型成功!继续训练模型")
except :
    print("加载模型失败!开始训练一个新模型")

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 开始训练
train_history = model.fit(x = x_Train4D_normalize, y = y_TrainHot,
                          validation_split=0.2, epochs=10, batch_size=300, verbose=2)

# model.save_weights("SaveModel/minist_model.h5")
model.save("SaveModel/minist_model_graphic.h5")

print("Saved model to disk")

predict_one_img.py

import cv2
from keras.models import load_model

img = cv2.imread("./pic/6.jpg")
print(img.shape)
grey_img = img[:,:,0:1]
print(grey_img.shape)
shape_img= (grey_img.reshape(1, 28, 28, 1)).astype('float32')/255

# model = load_model('SaveModel/minist_model.h5')  #选取自己的.h模型名称
model = load_model('SaveModel/minist_model_graphic.h5')  #选取自己的.h模型名称
prediction = model.predict_classes(shape_img)
print('该手写数字图像为:'+'%d'%prediction[0])

2.识别的手写图片集合

 

3.识别的基本原理

        采用的数据集是MNIST数据集。在该数据集中每张图片由28x28个像素点构成,每个像素点用一个灰度值表示。如下是数字1的一个例子,我们的目的是做出一个模型,将这784个数值输入这个模型,然后它的输出结果就为1。

4.运行与测试

  • 先读取数据集

  •  训练数据模型

  • 识别手写数字图像

 四、分析与小结

        本次通过基于Keras手写数字图像识别这一经典案例,初步学习了机器学习中另一个重要的分支领域——深度学习的内容,采用的数据集是MNIST数据集。在该数据集中每张图片由28x28个像素点构成,每个像素点用一个灰度值表示。首先是要使用pip命令行下载程序所要导入的工具包,同时使用activate py36 指令将python环境切换到我们创建并导入相关工具包的环境下,编译器采用pycharm,将程序跑起来。首先要进行数据集的训练,然后再用训练好的模型去识别6.jpg这个手写数字图像,控制台打印出识别的结果。

        经过这个入门案例的学习,让我对机器学习领域产生了浓厚的学习兴趣,本质上是用海量的数据作为输入,让计算机去训练分析出一个模型,我们可以将其视为一个函数,一个“黑盒子”,然后用它去识别指定的数据,给出分析的结果,该过程类比于人脑总结以往经验,来预测未来指导行动的过程是异曲同工的,非常奇妙!!

 参考文章

深度学习实例——Keras实现手写数字识别icon-default.png?t=N4P3https://blog.csdn.net/yjw123456/article/details/103811112?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168594730916800222827149%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168594730916800222827149&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-103811112-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=Keras%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB&spm=1018.2226.3001.4187【深度学习实战—1】:基于Keras的手写数字识别(非常详细、代码开源)icon-default.png?t=N4P3https://blog.csdn.net/qq_42856191/article/details/121420268?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168594730916800222827149%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168594730916800222827149&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-121420268-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=Keras%E6%89%8B%E5%86%99%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB&spm=1018.2226.3001.4187

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

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

相关文章

深度解析MethodHandle方法句柄之findspecial方法的原理

网上看过太多关于MethodHandle方法句柄的文章,但是基本上没有人能把其中的findspecial方法讲清楚,特别是findspecial的第四个参数specialCaller, 相信大家都不明白是干嘛用的,网上给出的水文是很多都是说: 执行到specialCaller的父…

kafka二

练一练 需求:写一个生产者,不断的去生产用户行为数据,写入到kafka的一个topic中 生产的数据格式: 造数据 {"guid":1,"eventId":"pageview","timestamp":1637868346789} isNew 1 {&quo…

面了一个32岁的程序员,只因这一点,一眼看穿是培训班出来的,简历都是假的.....

首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情。 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的…

Kafka安装及架构

kafka的特点 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, 由多个consumer group 对partition进行consume操作。可扩展性:kafka集群支持热扩展持久性、可靠性&#xf…

机智云的离线语音识别模组,让家电变得更加智能和便捷

随着人们对智能化生活的需求不断增加,离线语音模组越来越受到欢迎。它可以为家庭、工作和娱乐提供更加智能和便捷的服务,例如通过语音指令控制家居设备、查询天气信息、播放音乐等。 “小智同学,打开灯光” “调到最亮” “正转一档” 人工智…

Golden Gate (GGX) ZK 预编译: 彻底改变游戏玩法,成本降低千倍

Golden Gate (GGX) 作为一种新型跨链基础设施协议,解决了困扰 Web3.0 Layer1 和 Layer2 的跨链通信和流动性转换难题。 其解决方案主要涉及两个核心: 1) 与协议无关的通信,可以实现主流标准消息的传递,包括 IBC、XCMP 和 LayerZero 等标准。 …

2023 华为 Datacom-HCIE 真题题库 10/12--含解析

单项选择题 1.[试题编号:190585] (单选题)华为SD-WAN解决方案中,当CPE位 于NAT设备后的私网时,特别是两个站点的CPE同时位于NAT设备后的私网时,CPE之 间需要使用NAT穿越技术。华为SD-WAN解决方案中使用以下…

驱动开发--根文件系统

1、单片机开发属于嵌入式开发吗? 广义:单片机开发属于嵌入式开发---(嵌入式微处理器开发) 一般不带mmu(地址映射) 狭义:单片机开发不属于嵌入式 ---(Linux嵌入式开发)一…

python数据分析学习笔记之matplotlib、numpy、pandas

为了学习机器学习,在此先学习以下数据分析的matplotlib,numpy,pandas,主要是为自己的学习做个记录,如有不会的可以随时查阅。希望大家可以一起学习共同进步,我们最终都可以说:功不唐捐&#xff…

刷完这套八股文,15K不能再少了...

前言 大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿…

hive中如何计算字符串中表达式

比如 select 1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 col ,1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 result \ 现在的需求式 给你一个字符串如上述col 你要算出result。 前提式 只有和-的运算,而且只有嵌套一次 -(4-3)没有 -(-4(3-(31)))嵌套多次。 第一步我们需要将运…

springboot项目的社区/博客系统

课前导读: 你学完一篇,你就多会一项技能,多多少少对你还是有点帮助的不是吗?~~~ 这是博主网页的url:优文共享社区 开发环境:JDK1.8,IDEA2021,MySQL5.7,Windows11 开发技术…

float变量与“零值”的比较

目录 1.问题的引出&#xff1a; 2.解决方案 <1>:自定义精度 <2>:系统提供的精度 3.总结 1.问题的引出&#xff1a; 浮点数在存储的时候&#xff0c;会存在精度的损失。 那么在浮点数进行比较的时候&#xff0c;可不可以使用 来进行比较&#xff0c;测试代码…

PHP——流程控制语句

if…else语句 几乎所有程序设计语言都有if语句&#xff0c;它按照条件选择执行不同的代码片段&#xff0c;PHP的if语句格式为 if&#xff08;条件&#xff09; {if 条件返回为TRUE执行的语句体; } else {if 条件返回FALSE执行的语句体&#xff1b; } 如果条件为真&#xff0c;就…

GitOps 最佳实践(下)| 基于 Amazon EKS 构建 CI/CD 流水线

了解了 GitOps 的概念以及 CI/CD 流水线的架构&#xff0c;完成了构建 GitOps 风格的 CI/CD 流水线的前两部分&#xff0c;恭喜开发者们&#xff01;我们一起在 GitOps 最佳实践的道路上已经实现了大半。接下来&#xff0c;我们一起看看构建 CI/CD 流水线最佳实践的后两个部分&…

I/O复用———常用系统调用select、poll、epoll

上周面了个实习&#xff0c;感觉自己菜的一匹&#xff0c;唉&#xff0c;理论还是没有联系实际啊&#xff0c;继续学吧。 I/O复用使得程序能同时监听多个文件描述符&#xff0c;这对提高程序的性能至关重要。通常&#xff0c;网络程序在下列情况下需要使用I/O复用技术&#xf…

01_JVM与Java体系结构

目录 三、Java及JVM简介1、Java&#xff1a;跨平台的语言2、跨语言的平台3、多语言混合编程 四、Java发展过程中的重大事件五、虚拟机和Java虚拟机1、Java虚拟机2、Jvm的位置 六、Jvm的整体结构七、Java代码的执行流程八、Jvm的架构模型九、Jvm的生命周期十、JVM的发展历程 三、…

Jenkins重启报错解决

在Jenkins上安装了一些插件后&#xff0c;需要重启Jenkins&#xff0c;由于忘了当初是怎么重启的&#xff0c;所以就问了GPT&#xff0c;下面是它的回答&#xff1a; 我想着&#xff0c;jenkins运行的好好的&#xff0c;还看什么状态&#xff0c;直接restart&#xff0c;然后……

R语言 tidyverse系列学习笔记(系列3)具体任务的处理(成绩单为例)

score成绩单 install.packages("dplyr") library(dplyr)install.packages("tibble") library(tibble)install.packages("stringr") library(stringr)score tibble(IDc("1222-1","2001-0","3321-1","4898-0…

PS 套索选区工具(1) 套索工具基础使用

套索工具和之前的几个一样 也是用来做选区的 我们先打开ps 那么 我这边已经打开了一个视图 我们在屏幕左侧这个地方找到 套索工具 右键它 这边有三个操作工具 上一文中 我们学的矩形选框工具 在图形上是有不小的限制 有点只能画方 有点只能画圆 我们右键 套索工具 这个工…