目录

效果展示

基础理论

1、softmax激活函数

2、神经网络

3、隐藏层及神经元最佳数量

一、数据准备

1、载入数据集

2、数据处理

2-1、归一化

2-2、独热编码

二、神经网络拟合

1、搭建神经网络

2、设置优化器、损失函数

3、训练

三、预测

1、备份图像数据集

2、预测分类

3、显示结果(plt)

总代码


效果展示

基础理论

本次手写数字识别,采用的是MNIST数据集。
http://yann.lecun.com/exdb/mnist/ 

1、softmax激活函数

这里输出层用到了softmax激活函数,把输出的数据转化成概率:

2、神经网络

神经网络原型:

28*28=784个输入像素对应784个输入神经元;10个输出神经元分别对应0~9的十个数

(为了提高训练的准确度,我加了一些隐藏层 )

3、隐藏层及神经元最佳数量

        隐藏层、神经元最佳数量需要自己不断实验获得,先选取小一点的数据,欠拟合,再不断增加数据,直到最佳数据出现(即将出现过拟合情况)

通常:

一、数据准备

# 数据准备
def Data_Preparation():global train_data, train_label, test_data, test_label, mnist_train, \mnist_test, images, labels

1、载入数据集

# 1、载入数据集mnist = tf.keras.datasets.mnist(train_data, train_label), (test_data, test_label) = mnist.load_data()# 训练集数据 train_data 的数据形状为(60000,28,28)# 训练集标签 train_label 的数据形状为(60000)# 测试集数据 test_data 的数据形状为(10000,28,28)# 测试集标签 test_label 的数据形状为(10000)images, labels = test_data, test_label

2、数据处理

2-1、归一化

# 2-1、数据集归一化train_data = train_data/255test_data = test_data/255

2-2、独热编码

0~9分别用10个二进制数中1的位置表示它们的值。

# 2-2、标签独热编码train_label = tf.keras.utils.to_categorical(train_label, num_classes=10)test_label = tf.keras.utils.to_categorical(test_label, num_classes=10)#                           转化为独热编码   待转数据      独热码长度

二、神经网络拟合

1、搭建神经网络

输入层(数据展平:(28,28)->(784))、隐藏层、输出层(10个神经元对应10个数字)。

# 1、创建神经网络model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),   # 输入数据压缩,三维变二维# (60000,28,28) -> (60000, 784)tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(10, activation='softmax')  # 全连接层#                       输出神经元数量  激活函数(softmax)])

隐藏层数和神经元数量非固定的,自己测试之后添加的。

添加隐层前:

添加隐层后;

2、设置优化器、损失函数

# 2、设置优化器、损失函数model.compile(optimizer=SGD(0.3), loss='mse', metrics=['accuracy'])#             优化器     学习率0.3  损失函数(均方误差) 保留标签(accuracy)

目前测试的最佳学习率:0.3(本模型)

3、训练

# 3、训练model.fit(train_data, train_label, epochs=20, batch_size=32, validation_data=(test_data, test_label))
#             训练集                    遍历20次    一组32个        测试集

三、预测

1、备份图像数据集

这里准备了2个图像数据集,一份用于后面的预测分类,一份用于显示图像。

为什么不用一份呢?因为两者维度不同,预测的需要更高一维度的数据。

# 图像增加维度Images = images[:, np.newaxis]# images图像正常显示,Images图像用来做预测

2、预测分类

# 预测分类classification = model.predict(Images[i], batch_size=10)# 得到结果result.append(np.argmax(classification[0]))

3、显示结果(plt)

# 显示结果x = int(i/3)y = i%3ax[x][y].set_title(f'label:{labels[i]}-predict:{result[i]}')    # 设置标题ax[x][y].imshow(images[i], 'gray')                              # 显示图像ax[x][y].axis('off')                                            # 隐藏坐标轴

训练1次:

训练30次:

训练了30次的情况:

D:\Software\Python\Python\python.exe D:/Study/AI/OpenCV/draft.py/main.py
Epoch 1/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0393 - accuracy: 0.7064 - val_loss: 0.0114 - val_accuracy: 0.9270
Epoch 2/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0105 - accuracy: 0.9310 - val_loss: 0.0075 - val_accuracy: 0.9498
Epoch 3/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0072 - accuracy: 0.9538 - val_loss: 0.0062 - val_accuracy: 0.9603
Epoch 4/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0057 - accuracy: 0.9635 - val_loss: 0.0055 - val_accuracy: 0.9658
Epoch 5/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0047 - accuracy: 0.9703 - val_loss: 0.0048 - val_accuracy: 0.9691
Epoch 6/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0040 - accuracy: 0.9746 - val_loss: 0.0048 - val_accuracy: 0.9694
Epoch 7/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0034 - accuracy: 0.9787 - val_loss: 0.0049 - val_accuracy: 0.9669
Epoch 8/30
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0030 - accuracy: 0.9816 - val_loss: 0.0043 - val_accuracy: 0.9713
Epoch 9/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0026 - accuracy: 0.9844 - val_loss: 0.0038 - val_accuracy: 0.9760
Epoch 10/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0023 - accuracy: 0.9864 - val_loss: 0.0050 - val_accuracy: 0.9677
Epoch 11/30
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0021 - accuracy: 0.9873 - val_loss: 0.0037 - val_accuracy: 0.9764
Epoch 12/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0018 - accuracy: 0.9894 - val_loss: 0.0037 - val_accuracy: 0.9758
Epoch 13/30
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0017 - accuracy: 0.9901 - val_loss: 0.0041 - val_accuracy: 0.9734
Epoch 14/30
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0015 - accuracy: 0.9911 - val_loss: 0.0045 - val_accuracy: 0.9708
Epoch 15/30
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0014 - accuracy: 0.9921 - val_loss: 0.0038 - val_accuracy: 0.9760
Epoch 16/30
1875/1875 [==============================] - 7s 4ms/step - loss: 0.0013 - accuracy: 0.9922 - val_loss: 0.0036 - val_accuracy: 0.9764
Epoch 17/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0012 - accuracy: 0.9932 - val_loss: 0.0035 - val_accuracy: 0.9771
Epoch 18/30
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0011 - accuracy: 0.9942 - val_loss: 0.0034 - val_accuracy: 0.9783
Epoch 19/30
1875/1875 [==============================] - 7s 4ms/step - loss: 9.5588e-04 - accuracy: 0.9947 - val_loss: 0.0034 - val_accuracy: 0.9788
Epoch 20/30
1875/1875 [==============================] - 6s 3ms/step - loss: 9.9405e-04 - accuracy: 0.9942 - val_loss: 0.0037 - val_accuracy: 0.9767
Epoch 21/30
1875/1875 [==============================] - 7s 4ms/step - loss: 8.7466e-04 - accuracy: 0.9952 - val_loss: 0.0037 - val_accuracy: 0.9757
Epoch 22/30
1875/1875 [==============================] - 7s 4ms/step - loss: 7.5603e-04 - accuracy: 0.9959 - val_loss: 0.0037 - val_accuracy: 0.9773
Epoch 23/30
1875/1875 [==============================] - 7s 4ms/step - loss: 7.8775e-04 - accuracy: 0.9955 - val_loss: 0.0035 - val_accuracy: 0.9783
Epoch 24/30
1875/1875 [==============================] - 7s 4ms/step - loss: 7.2748e-04 - accuracy: 0.9961 - val_loss: 0.0034 - val_accuracy: 0.9779
Epoch 25/30
1875/1875 [==============================] - 7s 4ms/step - loss: 7.2780e-04 - accuracy: 0.9959 - val_loss: 0.0036 - val_accuracy: 0.9777
Epoch 26/30
1875/1875 [==============================] - 6s 3ms/step - loss: 5.9373e-04 - accuracy: 0.9969 - val_loss: 0.0032 - val_accuracy: 0.9792
Epoch 27/30
1875/1875 [==============================] - 6s 3ms/step - loss: 5.6153e-04 - accuracy: 0.9970 - val_loss: 0.0034 - val_accuracy: 0.9786
Epoch 28/30
1875/1875 [==============================] - 7s 4ms/step - loss: 5.7011e-04 - accuracy: 0.9969 - val_loss: 0.0033 - val_accuracy: 0.9792
Epoch 29/30
1875/1875 [==============================] - 7s 4ms/step - loss: 5.0371e-04 - accuracy: 0.9973 - val_loss: 0.0037 - val_accuracy: 0.9767
Epoch 30/30
1875/1875 [==============================] - 7s 4ms/step - loss: 5.2224e-04 - accuracy: 0.9972 - val_loss: 0.0033 - val_accuracy: 0.9795

可以发现,训练次数过高,后面变化就已经不大了。

总代码

# keras手写数字识别
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'import tensorflow as tf
from tensorflow.keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt# 数据准备
def Data_Preparation():global train_data, train_label, test_data, test_label, mnist_train, \mnist_test, images, labels# 1、载入数据集mnist = tf.keras.datasets.mnist(train_data, train_label), (test_data, test_label) = mnist.load_data()# 训练集数据 train_data 的数据形状为(60000,28,28)# 训练集标签 train_label 的数据形状为(60000)# 测试集数据 test_data 的数据形状为(10000,28,28)# 测试集标签 test_label 的数据形状为(10000)images, labels = test_data, test_label# 2、数据处理(归一化、独热编码)# 2-1、数据集归一化train_data = train_data/255test_data = test_data/255# 2-2、标签独热编码train_label = tf.keras.utils.to_categorical(train_label, num_classes=10)test_label = tf.keras.utils.to_categorical(test_label, num_classes=10)#                           转化为独热编码   待转数据      独热码长度# 神经网络拟合
def Neural_Network():global model# 1、创建神经网络model = tf.keras.models.Sequential([#tf.keras.layers.Flatten(input_shape=(28, 28)),   # 输入数据压缩,三维变二维# (60000,28,28) -> (60000, 784)tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(200 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(100 + 1, activation=tf.nn.relu),tf.keras.layers.Dense(10, activation='softmax')  # 全连接层#                       输出神经元数量  激活函数(softmax)])# 2、设置优化器、损失函数model.compile(optimizer=SGD(0.3), loss='mse', metrics=['accuracy'])#             优化器     学习率0.3  损失函数(均方误差) 保留标签(accuracy)# 3、训练model.fit(train_data, train_label, epochs=20, batch_size=32, validation_data=(test_data, test_label))
#             训练集                    遍历20次    一组32个        测试集# 预测手写数字(可视化部分测试集的预测)
def Predict():global images# 预测结果result = []# plt图表f, ax = plt.subplots(3, 3, figsize=(8, 6))# 图像增加维度Images = images[:, np.newaxis]# images图像正常显示,Images图像用来做预测# 在测试集中选取一部分数据进行可视化分类for i in range(9):# 预测分类classification = model.predict(Images[i], batch_size=10)# 得到结果result.append(np.argmax(classification[0]))# 显示结果x = int(i/3)y = i%3ax[x][y].set_title(f'label:{labels[i]}-predict:{result[i]}')    # 设置标题ax[x][y].imshow(images[i], 'gray')                              # 显示图像ax[x][y].axis('off')                                            # 隐藏坐标轴plt.show()# 数据准备
Data_Preparation()
# 神经网络搭建
Neural_Network()
# 手写数字预测
Predict()

深度学习--TensorFlow(项目)Keras手写数字识别相关推荐

  1. 深度学习(4)手写数字识别实战

    深度学习(4)手写数字识别实战 Step0. 数据及模型准备 1. X and Y(数据准备) 2. out=relu{relu{relu[X@W1+b1]@W2+b2}@W3+b3}out=relu ...

  2. 深度学习(3)手写数字识别问题

    深度学习(3)手写数字识别问题 1. 问题归类 2. 数据集 3. Image 4. Input and Output 5. Regression VS Classification 6. Compu ...

  3. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  4. tensorflow saver_机器学习入门(6):Tensorflow项目Mnist手写数字识别-分析详解

    本文主要内容:Ubuntu下基于Tensorflow的Mnist手写数字识别的实现 训练数据和测试数据资料:http://yann.lecun.com/exdb/mnist/ 前面环境都搭建好了,直接 ...

  5. 利用python卷积神经网络手写数字识别_Keras深度学习:卷积神经网络手写数字识别...

    引言:最近在闭关学习中,由于多久没有写博客了,今天给大家带来学习的一些内容,还在学习神经网络的同学,跑一跑下面的代码,给你一些自信吧!Nice 奥里给! 正文:首先该impor的库就不多说了,不会的就 ...

  6. tensorflow网页版手写数字识别-使用flask进行网络部署

    tensorflow网页版手写数字识别-使用flask进行网络部署 tensorflow如何将训练好的模型部署在网页中呢,在python中可以很方便的使用django或者flask框架来进行搭建.这里 ...

  7. mnist手写数字识别python_Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】...

    本文实例讲述了Python tensorflow实现mnist手写数字识别.分享给大家供大家参考,具体如下: 非卷积实现 import tensorflow as tf from tensorflow ...

  8. 深度学习项目实战——手写数字识别项目

    摘要 本文将介绍的有关于的paddle的实战的相关的问题,并分析相关的代码的阅读和解释.并扩展有关于的python的有关的语言.介绍了深度学习步骤: 1. 数据处理:读取数据 和 预处理操作 2. 模 ...

  9. Tensorflow 神经网络作业手写数字识别 训练、回测准确率

    大白话讲解卷积神经网络工作原理,推荐一个bilibili的讲卷积神经网络的视频,up主从youtube搬运过来,用中文讲了一遍. 这篇文章是 TensorFlow 2.0 Tutorial 入门教程的 ...

最新文章

  1. 一流科技完成5000万人民币A轮融资,高瓴创投独家领投
  2. android Adapter剖析理解
  3. Java进阶篇(一)——接口、继承与多态
  4. 基于Shodan Python库的批量攻击实践 撒旦网
  5. 基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码
  6. 关于数据库备份的问题
  7. 这个宝藏工具,会给你一种黑客般的感觉
  8. Python数模笔记-Sklearn (1)介绍
  9. 程序员情人节送这些!
  10. 统一变更域本地管理员密码
  11. python中集合用法大全
  12. [C/C++] C/C++延伸学习系列之STL及Boost库概述
  13. vivado基本使用流程(详细版,一步步跟着来一定能成功)
  14. pc机器人软件哪里买_买电脑,机器人仿真,3D建模软件,PLC程序,需要什么配置的电脑?...
  15. Android开发之十二:Camera成像原理介绍
  16. 百合网推试爱机器人,人工智能+婚恋的起点?
  17. ubuntu18.04安装OpenCV3.4.12步骤及安装中遇到的一些问题
  18. 解决win7语言栏消失问题
  19. JavaScript点击button更改内容,清空页面
  20. 安装黑苹果时不识别内置磁盘_【让天下没有难装的黑果】3 Legacy传统BIOS使用CLOVER引导在GPT硬盘安装OSX+WIN双系统...

热门文章

  1. Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in lib
  2. Error:This Gradle plugin requires Studio 3.0 minimum
  3. SQL*Plus 系统变量之15 - DESC[RIBE]
  4. java设计模式----装饰器模式
  5. 朴素贝叶斯知识点概括
  6. 开发者怎么样做到盈利
  7. [唐胡璐]QTP框架 - 关键字驱动测试框架之七 - Settings管理
  8. java压缩解压缩类实例[转]
  9. linux如何查看内存最大的几个文件,详解Linux如何查看当前占用CPU或内存最多的几个进程...
  10. ologit模型与logit_Stata-多元 Logit 模型详解 (mlogit)