手写数字图片识别——DL 入门案例
Deep Learning Demo of Primary
下面介绍一个入门案例,如何使用TensorFlow和Keras构建一个CNN模型进行手写数字识别,以及如何使用该模型对自己的图像进行预测。尽管这是一个相对简单的任务,但它涵盖了深度学习基本流程,包括:
- 数据准备
- 模型构建
- 模型训练
- 模型预测
输入:
import tensorflow as tf
from tensorflow import keras
import numpy as np
from PIL import Image
# 加载MNIST数据集(用于训练模型)
# 这部分代码加载了MNIST数据集,这是一个广泛使用的手写数字图像数据集,包含60,000个训练样本和10,000个测试样本。
# 我们将像素值除以255.0,将它们归一化到0-1的范围内,这是神经网络输入的标准做法。
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 规范化像素值
train_images, test_images = train_images / 255.0, test_images / 255.0
# 构建CNN模型
# 这部分代码构建了一个卷积神经网络(CNN)模型。我们使用Keras的Sequential API,它允许我们按顺序堆叠不同的层。
# 我们添加了两个卷积层和两个最大池化层,用于从图像中提取特征。
# 然后,我们添加了一个展平层,将特征映射到一个一维向量。
# 最后,我们添加了两个全连接层,第一个具有128个神经元,第二个具有10个神经元,用于对手写数字进行分类。
# 最后一层使用softmax激活函数输出每个数字的概率。
model = keras.Sequential([
keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), activation='relu'),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
# 编译模型
# 这部分代码构建了一个卷积神经网络(CNN)模型。我们使用Keras的Sequential API,它允许我们按顺序堆叠不同的层。
# 我们添加了两个卷积层和两个最大池化层,用于从图像中提取特征。然后,我们添加了一个展平层,将特征映射到一个一维向量。
# 最后,我们添加了两个全连接层,第一个具有128个神经元,第二个具有10个神经元,用于对手写数字进行分类。
# 最后一层使用softmax激活函数输出每个数字的概率。
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=5)
# 函数:预测手写数字图像
# 在构建模型之后,我们需要编译它。
# 我们指定了使用Adam优化器,稀疏分类交台熵损失函数(适用于整数标签),并监控准确率指标。
# 然后,我们使用model.fit函数在训练数据上训练模型,迭代5个epoch。
def predict_digit(img_path):
# 加载图像
img = Image.open(img_path).convert('L')
img = img.resize((28, 28))
img_array = np.array(img) / 255.0
img_array = np.expand_dims(img_array, axis=-1)
img_array = np.expand_dims(img_array, axis=0)
# 进行预测
predictions = model.predict(img_array)
predicted_digit = np.argmax(predictions)
return predicted_digit
# 测试
# 这个 predict_digit 函数用于预测手写数字图像。它接受一个图像文件路径作为输入。
# 首先,它使用PIL库加载图像,将其转换为灰度模式,并调整大小为28x28像素。
# 然后,它将图像转换为NumPy数组,并进行与训练数据相同的归一化处理。
# 由于CNN模型需要一个4D张量作为输入(batch_size, height, width, channels),
# 我们需要使用 np.expand_dims 在最后两个维度上扩展数组形状。
#
# 接下来,我们使用训练好的模型的 predict 方法对预处理后的图像数据进行预测,得到一个包含10个概率值的列表,每个值对应一个数字(0-9)的概率。
# 我们使用 np.argmax 找到概率值最大的索引,即模型预测的数字。
# 最后,函数返回预测的数字。
digit = predict_digit('image-8.png')
print(f'预测的数字是: {digit}')
输出:
预测的数字是: 8
但是完全不知道程序都做了什么...,那就学习它的流程吧。
Process:
- 首先,我们加载内置的MNIST数据集,并将像素值归一化到0-1之间。
- 然后,我们使用Keras的Sequential API构建一个CNN模型。该模型包含两个卷积层、两个最大池化层、一个展平层和两个全连接层。
最后一层使用softmax激活函数输出10个数字的概率。 - 我们使用稀疏分类交叉熵损失函数和Adam优化器编译模型。
- 接下来,我们使用训练数据train_images和train_labels训练模型5个epoch。
- 我们定义了一个predict_digit函数,用于预测手写数字图像。这个函数接受一个图像文件路径作为输入。
- 在predict_digit函数中,我们首先使用Pillow库加载图像,并将其转换为灰度模式和28x28大小。
然后,我们将图像数据转换为Numpy数组,并进行相同的归一化处理。
由于模型的输入维度为(批次大小, 高度, 宽度, 通道数),我们需要使用np.expand_dims在最后两个维度上扩展数组形状。 - 接下来,我们使用训练好的模型的predict方法对预处理后的图像数据进行预测,得到一个包含10个概率值的列表,每个值对应一个数字(0-9)的概率。
我们使用np.argmax找到概率值最大的索引,即模型预测的数字。 - 最后,我们调用predict_digit函数,传入你自己的图像文件路径,并打印预测结果。
手写数字图片识别——DL 入门案例的更多相关文章
- 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)
# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...
- caffe+opencv3.3dnn模块 完成手写数字图片识别
最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...
- 用Keras搭建神经网络 简单模版(四)—— RNN Classifier 循环神经网络(手写数字图片识别)
# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) from keras.datasets import mnist fro ...
- 吴裕雄 python神经网络 手写数字图片识别(5)
import kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers impo ...
- 吴裕雄 python 神经网络——TensorFlow 卷积神经网络手写数字图片识别
import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_N ...
- 一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)
笔记整理者:王小草 笔记整理时间2017年2月24日 原文地址 http://blog.csdn.net/sinat_33761963/article/details/56837466?fps=1&a ...
- 机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别
1.机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别 1.1 LDA算法简介和应用 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种 ...
- Tensorflow学习教程------模型参数和网络结构保存且载入,输入一张手写数字图片判断是几
首先是模型参数和网络结构的保存 #coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist impor ...
- opencv实现KNN手写数字的识别
人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...
- LSTM用于MNIST手写数字图片分类
按照惯例,先放代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 ...
随机推荐
- win32 - 监视网络流量
可以从Windows Sockets 2开始, 虽然微软提供了官方工具, Microsoft Network Monitor 3.4, 不过我们如果能够通过相关的代码和api的调用来深入研究的话,那就 ...
- [BUUCTF][WEB][极客大挑战 2019]Upload 1
打开靶机url,看到一个页面可以上传文件 上传一个图片试一下,发现上传的路径是 http://a7661b03-4852-41de-9ea4-d48c47cb50f0.node4.buuoj.cn:8 ...
- docker自定义bridge网络
>>> docker network create -d bridge bridge-net # 创建一个名为bridge-net的网络 # 测试,启动两个容器,并且接入到bridg ...
- django学习第十四天--Forms和ModelForm
Forms和ModelForm 进行数据校验,先看数据校验的过程 注册页面图解: 前端为了用户体验会做一些校验,不满足校验要求会报错 服务端也会对数据进行一些校验,不满足校验要求会报错 数据库也会对数 ...
- 阿尔萨斯(Arthas)入门
目录 简介 Arthas(阿尔萨斯) 能为你做什么 安装 快速安装 全量安装 卸载 使用 启动arthas 查看dashboard 通过thread命令来获取到arthas-demo进程的Main C ...
- 【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
问题描述 如何查看App Service Java堆栈JVM相关的参数默认配置值? 问题解答 可以通过App Service的高级管理工具(kudu:)来查看JVM的相关参数,使用命令:java -X ...
- C#多线程(11):线程等待
目录 前言 volatile 关键字 三种常用等待 再说自旋和阻塞 SpinWait 结构 属性和方法 自旋示例 新的实现 SpinLock 结构 属性和方法 示例 等待性能对比 前面我们学习了很多用 ...
- 【架构师视角系列】QConfig配置中心系列之Server端(三)
声明 原创文章,转载请标注.https://www.cnblogs.com/boycelee/p/17993697 <码头工人的一千零一夜>是一位专注于技术干货分享的博主,追随博主的文章, ...
- Rsync 备份服务搭建
Rsync 备份服务搭建 目录 Rsync 备份服务搭建 一. 前言 二. rsync 和 sersync 2.1 rsync 基本语法 2.2 本地文件传输 2.3 ssh 远程文件传输 2.4 基 ...
- IDE中使用Git提交代码报错:Push to origin/release-V2 was rejected
一.问题由来 当前项目开发好之后,已经正常稳定运行一两个月,在使用过程中基本上没在出现什么BUG.因此公司在讨论准备开发二期项目,自己 就在之前的基础之上,使用git创建了分支,一个分支release ...