MNIST数据集手写体识别(SEQ2SEQ实现)

github博客传送门

csdn博客传送门

本章所需知识:

  1. 没有基础的请观看深度学习系列视频
  2. tensorflow
  3. Python基础

    资料下载链接:

    深度学习基础网络模型(mnist手写体识别数据集)

MNIST数据集手写体识别(CNN实现)

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data  # 导入下载数据集手写体
mnist = input_data.read_data_sets(‘../MNIST_data/‘, one_hot=True)

class SEQ2SEQNet:  # 创建一个SEQ2SEQNet类
    def __init__(self):
        self.x = tf.placeholder(dtype=tf.float32, shape=[None, 28, 28], name=‘input_x‘)  # 创建数据占位符
        self.y = tf.placeholder(dtype=tf.float32, shape=[None, 10], name=‘input_y‘)  # 创建标签占位符

        self.fc1_w = tf.Variable(tf.truncated_normal(shape=[128, 10], dtype=tf.float32, stddev=tf.sqrt(1 / 10)))  # 定义 输出层/全链接层 w
        self.fc1_b = tf.Variable(tf.zeros(shape=[10], dtype=tf.float32))  # 定义 输出层/全链接层 偏值b

    # 前向计算
    def forward(self):
        # 编码
        with tf.variable_scope(‘encode‘):  # 创建一个变量空间 encode
            self.encoder_cell = tf.nn.rnn_cell.BasicLSTMCell(128)  # 创建128个LSTM的RNN结构(细胞结构)
            self.encoder_states = self.encoder_cell.zero_state(100, dtype=tf.float32)  # 初始化细胞的状态为 0, 传入初始化批次 和数据类型
            self.encoder_output, self.encoder_state = tf.nn.dynamic_rnn(self.encoder_cell, self.x, initial_state=self.encoder_states, time_major=False)  # 将细胞cell 和数据 self.x 初始化状态传入RNN细胞结构 获得两个返回值 output 和 状态state
            self.flat = tf.transpose(self.encoder_output, [1, 0, 2])[-1]  # 取rnn_output的输出状态的 每个输出的最后一行 (相当于 self.rnn_ouput[:, -1, :])
            self.flat1 = tf.expand_dims(self.flat, axis=1)  # 增加了一个维度
            self.flat2 = tf.tile(self.flat1, [1, 4, 1])  # 将增加的那个维度进行 复制为 4行 不复制也行 reshape为 NSV结构[批次, 步长, 数据]也行.

        # 解码
        with tf.variable_scope(‘decode‘):  # 创建一个变量空间 decode
            self.decoder_cell = tf.nn.rnn_cell.BasicLSTMCell(128)  # 创建128个LSTM的RNN结构
            self.decoder_states = self.decoder_cell.zero_state(100, dtype=tf.float32)  # 初始化细胞的状态为 0, 传入初始化批次 和数据类型
            self.decoder_output, self.decoder_state = tf.nn.dynamic_rnn(self.decoder_cell, self.flat2, initial_state=self.decoder_states, time_major=False)  # 将细胞cell 和数据 self.flat2 初始化状态传入RNN细胞结构 获得两个返回值 output 和 状态state
            self.flat3 = tf.transpose(self.decoder_output, [1, 0, 2])[-1]  # 同上
            self.fc_y = tf.nn.relu(tf.matmul(self.flat3, self.fc1_w)+self.fc1_b)  # 全链接层
            self.output = tf.nn.softmax(self.fc_y)  # softmax分类

    # 后向计算
    def backword(self):
        self.cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y, logits=self.fc_y))  # 定义损失, softmax交叉熵
        self.opt = tf.train.AdamOptimizer().minimize(self.cost)  # 使用AdamOptimizer优化损失

    # 计算测试集识别精度
    def acc(self):
        # 将预测值 output 和 标签值 self.y 进行比较
        self.acc1 = tf.equal(tf.argmax(self.output, 1), tf.argmax(self.y, 1))
        #  最后对比较出来的bool值 转换为float32类型后 求均值就可以看到满值为 1的精度显示
        self.accaracy = tf.reduce_mean(tf.cast(self.acc1, dtype=tf.float32))

if __name__ == ‘__main__‘:
    net = SEQ2SEQNet()  # 启动tensorflow绘图的SEQ2SEQNet
    net.forward()  # 启动前向计算
    net.backward()  # 启动后向计算
    net.acc()  # 启动精度计算
    init = tf.global_variables_initializer()  # 定义初始化tensorflow所有变量操作
    with tf.Session() as sess:  # 创建一个Session会话
        sess.run(init)  # 执行init变量内的初始化所有变量的操作
        for i in range(10000):  # 训练10000次
            ax, ay = mnist.train.next_batch(100)  # 从mnist数据集中取数据出来 ax接收图片 ay接收标签
            ax_batch = ax.reshape(-1, 28, 28)  # 将取出的 图片数据 reshape成 NSV 结构
            loss, output, accaracy, _ = sess.run(fetches=[net.cost, net.output, net.accaracy, net.opt], feed_dict={net.x: ax_batch, net.y: ay})  # 将数据喂进编码网络
            # print(loss)  # 打印损失
            # print(accaracy)  # 打印训练精度
            if i % 100 == 0:  # 每训练100次
                test_ax, test_ay = mnist.test.next_batch(100)  # 则使用测试集对当前网络进行测试
                test_ax_batch = test_ax.reshape(-1, 28, 28)  # 将取出的 图片数据 reshape成 NSV 结构
                test_output = sess.run(fetches=net.output, feed_dict={net.x: test_ax_batch})  # 将数据喂进编码网络  接收一个output值
                test_acc = sess.run(tf.equal(tf.argmax(test_output, 1), tf.argmax(test_ay, 1)))  # 对output值和标签y值进行求比较运算
                test_accaracy = sess.run(tf.reduce_mean(tf.cast(test_acc, dtype=tf.float32)))  # 求出精度的准确率进行打印
                print(test_accaracy)  # 打印当前测试集的精度

最后附上训练截图:

原文地址:https://www.cnblogs.com/Mrzhang3389/p/9903530.html

时间: 2024-11-05 18:38:45

MNIST数据集手写体识别(SEQ2SEQ实现)的相关文章

MNIST数据集手写体识别(CNN实现)

github博客传送门 csdn博客传送门 本章所需知识: 没有基础的请观看深度学习系列视频 tensorflow Python基础 资料下载链接: 深度学习基础网络模型(mnist手写体识别数据集) MNIST数据集手写体识别(CNN实现) import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data # 导入下载数据集手写体 mnist = input_data.read

MNIST数据集手写体识别(MLP实现)

github博客传送门 csdn博客传送门 本章所需知识: 没有基础的请观看深度学习系列视频 tensorflow Python基础 资料下载链接: 深度学习基础网络模型(mnist手写体识别数据集) MNIST数据集手写体识别(MLP实现) import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data # 导入下载数据集手写体 mnist = input_data.read

实现手写体 mnist 数据集的识别任务

实现手写体 mnist 数据集的识别任务,共分为三个模块文件,分别是描述网络结构的前向传播过程文件(mnist_forward.py). 描述网络参数优化方法的反向传播 过 程 文件 ( mnist_backward.py ). 验证 模 型 准确 率 的  测试 过 程 文件(mnist_test.py). 前向传播过程文件(mnist_forward.py) 在前向传播过程中,需要定义网络模型输入层个数.隐藏层节点数.输出层个数,定义网络参数 w.偏置 b,定义由输入到输出的神经网络架构.

深度学习-mnist手写体识别

mnist手写体识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test).每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签.我们把这些图片设为“xs”,把这些标签设为“ys”.训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是 mnist.train.images ,训练

MFC基于对话框 手写数字识别 SVM+MNIST数据集

完整项目下载地址: http://download.csdn.net/detail/hi_dahaihai/9892004 本项目即拿MFC做了一个画板,画一个数字后可自行识别数字.此外还 有保存图片.清空画板功能,简单实用. 识别方法为SVM调用已经训练好的MNIST数据集"SVM_DATA.xml" MNIST数据集训练方法自行百度,一大堆. 本项目基于OpenCv 2.4.6,下载的朋友自行修改配置为自己使用的OpenCv版本即可.

机器学习入门实践——线性回归&非线性回归&mnist手写体识别

把一本<白话深度学习与tensorflow>给啃完了,了解了一下基本的BP网络,CNN,RNN这些.感觉实际上算法本身不是特别的深奥难懂,最简单的BP网络基本上学完微积分和概率论就能搞懂,CNN引入的卷积,池化等也是数字图像处理中比较成熟的理论,RNN使用的数学工具相对而言比较高深一些,需要再深入消化消化,最近也在啃白皮书,争取从数学上把这些理论吃透 当然光学理论不太行,还是得要有一些实践的,下面是三个入门级别的,可以用来辅助对BP网络的理解 环境:win10 WSL ubuntu 18.04

使用线性回归识别手写阿拉伯数字mnist数据集

学习了tensorflow的线性回归. 首先是一个sklearn中makeregression数据集,对其进行线性回归训练的例子.来自腾讯云实验室 import tensorflow as tf import numpy as np class linearRegressionModel: def __init__(self,x_dimen): self.x_dimen=x_dimen self._index_in_epoch=0 self.constructModel() self.sess=

keras实现mnist数据集手写数字识别

一. Tensorflow环境的安装 这里我们只讲CPU版本,使用 Anaconda 进行安装 a.首先我们要安装 Anaconda 链接:https://pan.baidu.com/s/1AxdGi93oN9kXCLdyxOMnRA 密码:79ig 过程如下: 第一步:点击next 第二步:I Agree 第三步:Just ME 第四步:自己选择一个恰当位置放它就好 第五步:建议只选择第二个 第六步:就直接install啦啦啦啦,然后你就可以上手万能库了 b.找到Anaconda prompt

pytorch实现MNIST手写体识别(全连接神经网络)

环境: pytorch1.1 cuda9.0 ubuntu16.04 该网络有3层,第一层input layer,有784个神经元(MNIST数据集是28*28的单通道图片,故有784个神经元).第二层为hidden_layer,设置为500个神经元.最后一层是输出层,有10个神经元(10分类任务).在第二层之后还有个ReLU函数,进行非线性变换. #!/usr/bin/env python # encoding: utf-8 ''' @author: liualex @contact: [em