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:

  1. 首先,我们加载内置的MNIST数据集,并将像素值归一化到0-1之间。
  2. 然后,我们使用Keras的Sequential API构建一个CNN模型。该模型包含两个卷积层、两个最大池化层、一个展平层和两个全连接层。

    最后一层使用softmax激活函数输出10个数字的概率。
  3. 我们使用稀疏分类交叉熵损失函数和Adam优化器编译模型。
  4. 接下来,我们使用训练数据train_images和train_labels训练模型5个epoch。
  5. 我们定义了一个predict_digit函数,用于预测手写数字图像。这个函数接受一个图像文件路径作为输入。
  6. 在predict_digit函数中,我们首先使用Pillow库加载图像,并将其转换为灰度模式和28x28大小。

    然后,我们将图像数据转换为Numpy数组,并进行相同的归一化处理。

    由于模型的输入维度为(批次大小, 高度, 宽度, 通道数),我们需要使用np.expand_dims在最后两个维度上扩展数组形状。
  7. 接下来,我们使用训练好的模型的predict方法对预处理后的图像数据进行预测,得到一个包含10个概率值的列表,每个值对应一个数字(0-9)的概率。

    我们使用np.argmax找到概率值最大的索引,即模型预测的数字。
  8. 最后,我们调用predict_digit函数,传入你自己的图像文件路径,并打印预测结果。

手写数字图片识别——DL 入门案例的更多相关文章

  1. 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...

  2. caffe+opencv3.3dnn模块 完成手写数字图片识别

    最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...

  3. 用Keras搭建神经网络 简单模版(四)—— RNN Classifier 循环神经网络(手写数字图片识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) from keras.datasets import mnist fro ...

  4. 吴裕雄 python神经网络 手写数字图片识别(5)

    import kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers impo ...

  5. 吴裕雄 python 神经网络——TensorFlow 卷积神经网络手写数字图片识别

    import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_N ...

  6. 一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

    笔记整理者:王小草 笔记整理时间2017年2月24日 原文地址 http://blog.csdn.net/sinat_33761963/article/details/56837466?fps=1&a ...

  7. 机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别

    1.机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别 1.1 LDA算法简介和应用 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种 ...

  8. Tensorflow学习教程------模型参数和网络结构保存且载入,输入一张手写数字图片判断是几

    首先是模型参数和网络结构的保存 #coding:utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist impor ...

  9. opencv实现KNN手写数字的识别

    人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...

  10. LSTM用于MNIST手写数字图片分类

    按照惯例,先放代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 ...

随机推荐

  1. sliver生成木马.sh

    生成sliver木马多个步骤合成一个sh #!/bin/bash # date: 20230222 host_ip=$1 WORK_DIR=/opt/work rm -rf /root/.sliver ...

  2. 如何创建自己的Spring Boot Starter并为其编写单元测试

    当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式.如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个 ...

  3. Xilinx GTH 简介 ,CoaXpress FPGA PHY 部分

    什么是GTH GTH 是Xilinx UltraScale系列FPGA上高速收发器的一种类型,本质上和其它名称如GTP, GTX等只是器件类型不同.速率有差异:GTH 最低速率在500Mbps,最高在 ...

  4. python部署项目为什么要用Nginx和uWSGI

    一.测试运行python项目 1.1 Flask项目 说明1:当我们直接用编译器运行Flask项目的时候,会有一个提示:意思就是:这是开发环境的服务器,不能用于生产环境的部署,请使用WSGI的服务器替 ...

  5. 看看这份2023年MySQL终级面试题,提升你的内力,给你面试助力

    1.MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. (2)行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最 ...

  6. Redis动态配制,限内存,免重启

    p.p1 { margin: 0; font: 14px Menlo; color: rgba(0, 255, 255, 1); background-color: rgba(0, 0, 0, 0.8 ...

  7. .NET集成DeveloperSharp实现强大的AOP

    (适用于.NET/.NET Core/.NET Framework)[目录]0.前言1.第一个AOP程序2.Aspect横切面编程3.一个横切面程序拦截多个主程序4.多个横切面程序拦截一个主程序5.优 ...

  8. 关于debian安装完后输入法的问题

    sudo apt install ibus-libpinyin后 重启计算机

  9. c语言之遗漏---标准C的标记化结构初始化语法

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文发布于 2015-12-29 19:22:14 ...

  10. 2、Azure Devops之Azure Boards使用

    1.什么是Azure Boards 使用面板.积压工作.冲刺.查询管理项目的用户故事.待办事项.任务.特性和bug. 2.工作项(WorkItem) 工作项管理的可以管理和创建用户故事.特性.任务. ...