CVNLP基础6之手写数字识别代码体验
文章目录
- 总流程(思路)预览
- x是输入的图片y是图片对应的label
- 关于训练数据集的说明
- 搭建计算网络层
- 计算损失值loss
- 优化损失值loss(minimize loss)
- 手写数字初体验代码
- 代码
- 导入各种包
- 获取数据
- 数据预处理(切片)
- 搭建计算模型(这一步只是搭建框架,没有实际的输入输出)
- 开始训练
- JupyterLab运行截图
- tf.convert_to_tensor函数的使用
- 补充:tensorflow的reshape操作tf.reshape()
总流程(思路)预览
x是输入的图片y是图片对应的label
关于训练数据集的说明
搭建计算网络层
这里输入x是[60000, 784],输出的label y是10分类。像上一篇文章一样,写出各层的变化。
第一层: h1 = relu(x @ w1 + b1)其中,w1: [784, 512],b1: [512],h1: [784, 512]第二层: h2 = relu(h1 @ w2 + b2)其中,w2: [512, 256],b2: [256],h2: [784, 256]第三层: out = relu(h2 @ w3 + b3)其中,w3: [256, 10],b3: [10],out: [784, 10]
下面详情视频清晰版: 链接: https://pan.baidu.com/s/1LibA6jI0bHylwo6qyGp4bA?pwd=njcw 提取码: njcw
CVNLP基础文章6搭建计算网络层概述
计算损失值loss
x.shape[0]是图片数。这里计算loss算的是“平均损失”,没有使用总损失,两者都可,目标都是缩小loss值
下面详情视频清晰版: 链接: https://pan.baidu.com/s/1GVaP6S2sJ0qkeAL7MOUmcg?pwd=ffd4 提取码: ffd4
CVNLP基础文章6计算损失值loss
优化损失值loss(minimize loss)
下面详情视频清晰版: 链接: https://pan.baidu.com/s/1IVt75gRfln_KnF0Yt4auyw?pwd=tyhc 提取码: tyhc
CVNLP基础文章6优化损失值loss
手写数字初体验代码
代码
导入各种包
import os # “os”是系统包
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # TensorFlow的最小打印日志的等级为2。
# TensorFlow集成了深度学习环境,每次运行都会显示一些电脑环境信息,设置了这个值,就可以隐藏一些不紧要的输出,更简洁。
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets
获取数据
(x, y), (x_val, y_val) = datasets.mnist.load_data()
# (x,y)是训练集;(x_val, y_val)是验证集。
# 注: 这里写“(x_val, y_val)”只是为了更全一点,如果用不到验证集,用“_”代替便可
# 目前数据还是“数字类型”,需要将数据转换成深度学习里面的变量类型“tensor”
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255 # x是图片数据,让矩阵元素是浮点数构成。除以255是处理图像的习惯,让矩阵中的值在0~1或者-1~0之间y = tf.convert_to_tensor(y, dtype=tf.int32) # y是标签,此时y是0~9中的一个数,不会有小数点,是哪一类就是哪一类,用整数型就可以了# 现在我们不想让“y”是单个数字形式。现在采用“独热编码one-hot”处理“label y”,关于独热编码见“CV&NLP基础文章5”。
y = tf.one_hot(y, depth=10) # depth就是标签y有几类,数字图片一共有10种。此时y从“一维单个数字”转换成了“十维向量”。# 例: y是2的话,就用[0,0,1,0,0,0,0,0,0,0]表示。y是7的话,就用[0,0,0,0,0,0,1,0,0,0]表示。print(f"6万张训练数据集的数据格式为: {x.shape}, {y.shape}")
print(tf.reduce_max(x), tf.reduce_min(x)) #上面除以255以后,“28*28维矩阵x”中最大的元素是1.0,最小的元素是0.0
数据预处理(切片)
train_dataset = tf.data.Dataset.from_tensor_slices((x, y)).batch(100)
#以100个为一组对6万张训练集切片。此时一共有600组,每组各100张图片
搭建计算模型(这一步只是搭建框架,没有实际的输入输出)
model = keras.Sequential([layers.Dense(512, activation='relu'),layers.Dense(256, activation='relu'),layers.Dense(10, activation='relu')
])
optimizer = optimizers.SGD(learning_rate=0.0001)
# 以上详情见本篇文章“搭建计算机网络层”视频
# 下面两行代码只是用来看看这个框架都有些什么参数
model.build(input_shape=(None, 784)) # None意思是没有输入图片, 仅是测试而已
model.summary() # 用来看框架内部结构的函数# 下面输出解读:
# 第一列Layer层:这里是Dense函数产生的层
# 第二列就是每道工序的“输出维度”
# 第三列的参数就是 w、b的个数,以第一层工序举例: 第一层的输入是[None ,784],
# 那么第一层的“W参数”就是[784, 512],“b参数”就是[512],所以784*512+512=401920个参数
开始训练
# 大循环,形参epoch是执行几轮“600次循环”的次数,多次训练数据集可以让计算机不断学习,降低loss值
# 每一轮大循环都是训练6万张图片极其标签,有“epoch”次大循环
def train_epoch(epoch): # 小循环,只为训练6万张数据。根据切片,一共600次循环,每一次循环处理100张图片(x)和图片的标签(y)for step, (x, y) in enumerate(train_dataset): # 计算losswith tf.GradientTape() as tape:# [b, 28, 28] => [b, 784]x = tf.reshape(x, (-1, 784))# [b, 784] => [b, 10]out = model(x) # 将输入x送入模型,得到out# x.shape[0]是输入的图片数,这里应为 100loss = tf.reduce_sum(tf.square(out-y)) / x.shape[0] # 计算梯度,“model.trainable_variables”里面是各个w、b,更新w、b后也放入其中 # grads 里面是 w、b的梯度grads = tape.gradient(loss, model.trainable_variables)# 更新梯度 w' = w - learning rate * grad w b' = b - learning rate * grad boptimizer.apply_gradients(zip(grads, model.trainable_variables))if step%50 == 0: # 小循环是600轮,每格50轮输出看看loss值,loss是tensor类型,需要转换成numpy类型来更好地查看print('epoch: {}, step: {}, loss: {}'.format(epoch, step, loss.numpy()))
def train():#每一轮大循环都换在训练6万张图片for epoch in range(10):print('当前是第 ', epoch, " 次 大循环")train_epoch(epoch)train()
JupyterLab运行截图
tf.convert_to_tensor函数的使用
函数描述:
将各种类型的python对象转化为tensor对象
将给定value转换为Tensor。
此函数将各种类型的Python对象转换为Tensor 对象。它接受Tensor对象,numpy数组,Python列表和Python标量。
参数:
value:需要转换的
dtype:返回张量的可选元素类型。如果缺少,则从value的类型推断出类型。
name:如果Tensor创建了new,则使用可选名称。
返回:
一个基于value的输出操作(ops),输出一个tensor(自己的理解)
convert_to_tensor(value,dtype=None,name=None,preferred_dtype=None
)
示例:
a = np.array([1,2,3])
b = tf.convert_to_tensor(a)
print(type(a)) # <class 'numpy.ndarray'>
print(type(b)) # <class 'tensorflow.python.framework.ops.Tensor'>
补充:tensorflow的reshape操作tf.reshape()
在处理图像数据的时候总会遇到输入图像的维数不符合的情况,此时tensorflow中reshape()就很好的解决了这个问题
numpy.reshape()与tensorflow,reshape()相似
格式:
tf.reshape(tensor,shape,name=None)
函数的作用是将tensor变换为参数shape形式,其中的shape为一个列表形式,特殊的是列表可以实现逆序的遍历,即list(-1)。
-1所代表的含义是我们不用亲自去指定这一维的大小,函数会自动进行计算,但是列表中只能存在一个-1。
(如果存在多个-1,就是一个存在多解的方程)
实际操作中,有如下效果:我创建了一个一维的数组:
>>>import numpy as np
>>>a= np.array([1,2,3,4,5,6,7,8])
>>>a
array([1,2,3,4,5,6,7,8])
使用reshape()方法来更改数组的形状,使得数组成为一个二维的数组:(数组中元素的个数是2×4=8)
>>>d = a.reshape((2,4))
>>>d
array([[1, 2, 3, 4],[5, 6, 7, 8]])
进一步提升,可以得到一个三维的数组f:(注意数组中元素的个数时2×2×2=8)
>>>f = a.reshape((2,2,2))
>>>f
array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]])
-1 的应用: -1 表示不知道该填什么数字合适的情况下,可以选择,由python通过a和其他的值3推测出来
,比如,这里的a 是二维的数组,数组中共有6个元素,当使用reshape()时,6/3=2,所以形成的是3行2列的二维数组,可以看出,利用reshape进行数组形状的转换时,一定要满足(x,y)中x*y=数组的个数。
>>>a = np.array([[1,2,3],[4,5,6]])
>>>np.reshape(a,(3,-1))
array([[1, 2],[3, 4],[5, 6]])
>>> np.reshape(a,(1,-1))
array([[1, 2, 3, 4, 5, 6]])
>>> np.reshape(a,(6,-1))
array([[1],[2],[3],[4],[5],[6]])
>>> np.reshape(a,(-1,1))
array([[1],[2],[3],[4],[5],[6]])
下面是两张2×3大小的图片(不知道有几张图片可以用-1代替),如何把所有二维照片给转换成一维的,请看以下三维的数组:
>>>image = np.array([[[1,2,3], [4,5,6]], [[1,1,1], [1,1,1]]])
>>>image.shape
(2,2,3)
>>>image.reshape((-1,6))
array([[1, 2, 3, 4, 5, 6],[1, 1, 1, 1, 1, 1]])
>>> a = image.reshape((-1,6))
>>> a.reshape((-1,12))
array([[1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1]])
a.reshape((12,-1))
array([[1],[2],[3],[4],[5],[6],[1],[1],[1],[1],[1],[1]])
>>> a.reshape([-1])
array([1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1])
最后再给大家呈现一下官方给出的例子:
# tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]
# tensor 't' has shape [9]
reshape(t, [3, 3]) ==> [[1, 2, 3],[4, 5, 6],[7, 8, 9]]# tensor 't' is [[[1, 1], [2, 2]],
# [[3, 3], [4, 4]]]
# tensor 't' has shape [2, 2, 2]
reshape(t, [2, 4]) ==> [[1, 1, 2, 2],[3, 3, 4, 4]]# tensor 't' is [[[1, 1, 1],
# [2, 2, 2]],
# [[3, 3, 3],
# [4, 4, 4]],
# [[5, 5, 5],
# [6, 6, 6]]]
# tensor 't' has shape [3, 2, 3]
# pass '[-1]' to flatten 't'
reshape(t, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]# -1 can also be used to infer the shape# -1 is inferred to be 9:
reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],[4, 4, 4, 5, 5, 5, 6, 6, 6]]
# -1 is inferred to be 2:
reshape(t, [-1, 9]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],[4, 4, 4, 5, 5, 5, 6, 6, 6]]
# -1 is inferred to be 3:
reshape(t, [ 2, -1, 3]) ==> [[[1, 1, 1],[2, 2, 2],[3, 3, 3]],[[4, 4, 4],[5, 5, 5],[6, 6, 6]]]# tensor 't' is [7]
# shape `[]` reshapes to a scalar
reshape(t, []) ==> 7
CVNLP基础6之手写数字识别代码体验相关推荐
- MindSpore手写数字识别初体验,深度学习也没那么神秘嘛
摘要:想了解深度学习却又无从下手,不如从手写数字识别模型训练开始吧! 深度学习作为机器学习分支之一,应用日益广泛.语音识别.自动机器翻译.即时视觉翻译.刷脸支付.人脸考勤--不知不觉,深度学习已经渗入 ...
- Pytorch入门——MNIST手写数字识别代码
MNIST手写数字识别教程 本文仅仅放出该教程的代码 具体教程请看 Pytorch入门--手把手教你MNIST手写数字识别 import torch import torchvision from t ...
- MindSpore实现手写数字识别代码
MindSpore是华为自研的一套AI框架,最佳匹配昇腾处理器,最大程度地发挥硬件能力.作为AI入门的LeNet手写字体识别网络,网络大小和数据集都不大,可以在CPU上面进行训练和推理.下面是基于Mi ...
- 卷积神经网络mnist手写数字识别代码_搭建经典LeNet5 CNN卷积神经网络对Mnist手写数字数据识别实例与注释讲解,准确率达到97%...
LeNet-5卷积神经网络是最经典的卷积网络之一,这篇文章就在LeNet-5的基础上加入了一些tensorflow的有趣函数,对LeNet-5做了改动,也是对一些tf函数的实例化笔记吧. 环境 Pyc ...
- 手写数字识别代码,可以跑通
来源: https://github.com/caicloud/tensorflow-tutorial/tree/master/Deep_Learning_with_TensorFlow/1.0.0/ ...
- Python神经网络手写数字识别代码解释
使用了数据集MNIST中的部分数据. 1.读取数据集内容 #打开文件并获取其中的内容 data_file=open("mnist_train.csv",'r') #open()函数 ...
- 【人工智能实验室】第三次培训之手写数字识别代码理解
感觉把每一行代码都理解过去特别爽!!! minist_train.py import torch from torch import nn from torch.nn import functiona ...
- 手写数字识别代码函数解读(MATLAB实现)
1.tf = strcmp(s1,s2) 输入参数可以是字符串数组.字符向量和字符向量元胞数组的任何组合 比较 s1 和 s2,如果二者相同,则返回 1 (true),否则返回 0 (false).如 ...
- 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别
文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...
最新文章
- 秋天六食物吃出好皮肤
- 编程之美2.7 最大公约数,最小公倍数
- aws ec2 php,如何使用php aws sdk启动和停止ec2实例
- MySQL的常见命令
- 中文linux最小,35M的中文linux硬盘简单安装方法Live-CD:SliTaz.tw-全世界最小的li
- ffmpeg 分辨率 压缩_Ffmpeg 视频压缩的几个关键参数
- 【算法】斐波那契(黄金分割法) 查找算法
- 学写Windows Service
- 前端开发【WEUI框架H5网页开发】—— WEUI+Node.js+fis3 项目开发
- sql列转行逗号连接_SQL 拼接字符串 列转行 | 学步园
- 台湾-李宏毅教授的深度学习视频教程
- Linux系统管理干货总结笔记
- Aptos Move虚拟机中出现首个严重漏洞
- Word中使用MathType批量调整文档公式的大小
- [附源码]java毕业设计网上书店系统
- Mendix Studio Pro/Mendix Studio的离线安装
- 【阿里开发手册】所有的类都必须添加创建者和创建日期——在Idea中创建类时自动添加作者信息
- AIX文件系统扩容和切换启动盘
- 网易云音乐机器学习平台实践
- Pytorch:图像语义分割-基于VGG19的FCN8s实现
热门文章
- 分布式系统中的通信机制
- oracle 多个表取并集,Oracle?取两个表中数据的交集并集差异集合
- pytest-ordering 测试用例排序
- Python编译器推荐及在Ubuntu下PyCharm安装
- 安装sublime成功经验linux-ubuntu
- 如何应对CC攻击以及检测CC攻击
- 如何判断宇视相机是不是支持走廊模式?
- java 生成二维码原理分析
- 面试时,你被问到过 TCP/IP 协议吗?
- delphi基础01-delphi表达式、delphi运算符、delphi函数调用、delphi集合构造函数、delphi索引、(值或变量)delphi类型转换