01. TensorFlow 2.0初学者入门教程 MNIST数据集中的手写数字识别

初学者的 TensorFlow 2.0 教程 代码详解,链接地址如下:

初学者的 TensorFlow 2.0 教程  |  TensorFlow Core

一、搭建python环境

配置环境这里不详细说了。简单说下几个步骤:

1:安装anaconda

2:anaconda创建环境假如名字叫(env38),并且在env38上安装配置

安装一些基本开发库conda install numpy / pip install tensorflow / install PIL

3: 安装pycharm

4:要求设备联网,这个demo没有显卡要求

二、新建工程设置interpret

新建工程名假设命名为tensorflow

pycharm的菜单 file-->setting--> project:tensorflow-->Python Interpreter

设置刚刚的哪个env38

三、测试环境是否ok

直接新建python文件然后输入print("hello tensorflow") 然后运行测试

四、初学者的 TensorFlow 2.0 教程

初学者的 TensorFlow 2.0 教程  |  TensorFlow Corehttps://tensorflow.google.cn/tutorials/quickstart/beginner

4.1 代码分析

首先:下面第一个代码部分 导入库,导入的时候可以根据PyCharm提示安装tensorflow的库

import tensorflow as tf

第二部分提到的MNIST数据集,首先有个链接可以进入MNIST数据集的官网。这里就不详细说明数据集的来源和用途了。

mnist = tf.keras.datasets.mnist

上面这行代码,没什么实际用途,是因为后面这个名字太长了。使用一个短一点的名字而已。没实际作用。模块的名字重命名为mnist,为了书写方便

(x_train, y_train), (x_test, y_test) = mnist.load_data()

上面这行代码是从MNIST中加载数据集,首先我也是后来才知道,数据集的数据是著名的手写体数据,这个后面会详细解释。

 由上面调试信息可以知道一些内容:

1:x_train的类型是{ndarray: (60000,28,28)}  y_train的类型是{ ndarray:{60000,} }

2:  x_test的类型是{ndarray: (10000,28,28)}   y_test的类型是{ ndarray:{10000,} }

详细解释: ndarray是数组。y_train和y_test是数组,即手写体图片对应的数字。

x_train和x_test也是数组,x_train数组成员数有6万个。其中每个成员是28*28的矩阵组成。

直接得到的信息:

1:x_train的数组成员数量和y_train的数组成员数量一样多。都是60000,x是图片数据,y是真实数据。两个一起称之为训练数据。

2:x_test的数组成员数和ytest也是一样多,都是10000,x表示图片矩阵数据,y表示数值

在这里两个称之为测试数据。

3:图片中的数据取值范围是0-255, y_train和y_test中的取值范围是0-9

分析得到的信息:

1: 输入的训练数据都非常整齐,这一点在后面也可以看到。都是28*28像素的图片,并且每个手写体都给出了真实的值。

2:训练数据数量一般远远大于y中值的真实数量。手写体一共10个,然而训练数据给了6万个。

3:训练数据数量一般比测试数据量大。

4:训练数据的维度和测试数据的维度一致,都是28*28的图片矩阵数据。

4.2 x_tran到底是什么?

我们刚刚说x_train是数组,数组的成员是28*28的图片数据矩阵

这样说不够直观,不太方便理解到底是什么东西。

我们导入下面两个库来作为辅助查看x_tran到底是什么数据。我们能收到什么启发?

import numpy as np
from PIL import Image
        for i in range(0,len(x_train)):
            data = np.reshape(x_train[i], (28, 28))
            newpic = Image.fromarray(data)
            newpic.save(r"E:\AIdata\x_train" + r"\xtrain_" + str(i) + "__" + str(y_train[i]) + ".png")
        return

我写了个简单的测试代码如上。基本功能就是将x_train中的图片数据保存到本地png图片。

np.reshape:从名字上看是重新构造图形:将数组从新构造成28*28的二维矩阵数据。

data就是28*28的矩阵数据

Image.fromarray(data):  从名字上来看从矩阵转换为图像数据。

newpic =就是一个new picture 然后保存到本地,保存的时候。字符串中指明了png类型。

因为6万个数据量太大。实际上打印出几百个就可以知道是什么样的图片了。

数据图片如下:

 启发:

1:x_train 确实是图像数据,并且每个图片都是28*28像素的图像

2:可以知道手写体的实际值,即y_train的值。

数据的来源,我们先不研究,数据的来源有几大问题,

 1: 数据量,2:正确性,3:是否已经删除了一些模糊的数据,甚至于之前是否有字母的数据混合?4:全部转换为28*28的图像数据,5:黑白图像。黑底白字(无噪音),

6:几乎每个图片中的数字都是居中的。

4.2.2 数据可视化2:

前提:

import numpy as np
from PIL import Image
    xnew = x_train[0:100]
    t = []
    for i in range(0, 10):
        t.append(np.hstack(xnew[i*10:i*10+10]))

    t = np.vstack(t)
    newpic = Image.fromarray(t)
    newpic.save(r"E:\a.png")

打印出前100个手写图片。上面实际代码

4.3 图像数据归一化

x_train, x_test = x_train / 255.0, x_test / 255.0

 上面一行代码其实理解为: x_train = x_train / (255.0 - 0)

注意的是:因为图片数据中最大值是255,最小值是0 所以是除以最大值和最小值的差

后面有个.0 是为了得出0-1之间的小数。

矩阵除以某个常数,代表是矩阵中每一个值都除以这个常数。然后返回新的矩阵。

4.4 顺序模型构造

首先使用的是keras的顺序模型。关于顺序模型这里需要注意几个地方。

顺序模型的api文档

The Sequential modelicon-default.png?t=LBL2https://www.tensorflow.org/guide/keras/sequential_model?hl=zh-cnSequential model is appropriate for a plain stack of layers where each layer has exactly one input tensor and one output tensor.

百度翻译是这样的:

序列模型适用于层的普通堆栈,其中每个层正好有一个输入张量和一个输出张量。

我认为应该翻译为:

顺序模型适用于一堆简单的层的组合,其中每个层都只包含一个输入张量和一个输出张量

根据官方文档说明,

A Sequential model is not appropriate when:

  • Your model has multiple inputs or multiple outputs
  • Any of your layers has multiple inputs or multiple outputs
  • You need to do layer sharing
  • You want non-linear topology (e.g. a residual connection, a multi-branch model)

译文:

顺序模型不适用于下列几个场景

1:你的模型具有多输入或者多输出

2:你的模型中任意一层包含多输入或者多输出

3:你需要做图层共享。(这个后面再讲)

4:你想用非线性的技术(例如,残差连接,多分支模型等)

4.4 顺序模型参数

1:构造函数中可以添加每一层到

后面更新,在跟着一个外文网站教程学

Image Classification using MLP in Keras | LearnOpenCV

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值