[tensorflow、神经网络] - 使用tf和mnist训练一个识别手写数字模型,并测试

  • 参考
  • 包含: 1.层级的计算、2.训练的整体流程、3.tensorboard画图、4.保存/使用模型、5.总体代码(含详细注释)

1. 层级的计算

在这里插入图片描述
如上图,mnist手写数字识别的训练集提供的图片是 28 * 28 * 1的手写图像,初始识别的时候,并不知道一次要训练多少个数据,因此输入的规模为 [None, 784]. 由于最终的标签输出的是10个数据,因此输出的规模为[None, 10], 中间采取一个简单的全连接层作为隐藏层,规模为[784, 10]

2. 训练的整体流程

在这里插入图片描述

  • 1.首先定义占位符:
# 训练集数据
x = tf.placehodler(tf.float32,	[None, 784])
# 训练集标签
y_true = tf.placeholder(rf.int32, [None, 10])
  • 2.建立模型
# 随机生成权重矩阵和偏置
# 权重
weight = tf.Variable(tf.random_normal([784, 10], mean =0.0, stddev=1.0), name="weight")
# 偏置
bias = tf.Variable(tf.constant(0.0, shape=[10]))
# 预测
y_predict = tf.matmul(x, weight) + bias
  • 3.计算平均损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
  • 4.优化方案(梯度下降)
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
  • 5.计算损失率
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

3. tensorboard使用

# 按作用域命名
with tf.variable_scope("data"):passwith tf.variable_scope("full_layer"):pass
# 收集变量(单维度)
tf.summary.scalar("losses", loss)
tf.summary.scalar("acc", accuracy)# 收集变量(多维度)
tf.summary.histogram("weightes", weight)
tf.summary.histogram("biases", bias)# 将训练的每一步写入
with tf.Session() as sess:# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./tmp/", graph=sess.graph)for i in range(5000):# 写入每步训练的值summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})filewriter.add_summary(summary, i)
  • 4.模型的保存/使用
# 模型的初始化(一般写在Session上面)
saver = tf.train.Saver()# Session中为模型保存分配资源
with tf.Session() as sess:# 保存模型saver.save(sess, "./tmp/ckpt/fc_model")# 加载模型saver.restore(sess, "./tmp/ckpt/fc_model")# 预测for i in range(100):x, y = mnist.test.next_batch(1)predict = tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()

5.总体代码

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_dataFLAGS = tf.app.flags.FLAGStf.app.flags.DEFINE_integer("is_train", 1, "0: 预测, 1: 训练")"""单层(全连接层)实现手写数字识别特征值[None, 784]  目标值[None, 10]1、 定义数据占位符特征值[None, 784]  目标值[None, 10]2、 建立模型随机初始化权重和偏置w[784, 10]  by_predict = tf.matmul(x, w) + b3、 计算损失loss: 平均样本的损失  4、 梯度下降优化5、 准确率计算:equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))    accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
"""def ful_connected():# 读取数据mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)# 1、 建立数据的占位符 x [None, 784]  y_true  [None, 10]with tf.variable_scope("data"):x = tf.placeholder(tf.float32, [None, 784])y_true = tf.placeholder(tf.int32, [None, 10])# 2、 建立一个全连接层的神经网络 w [784, 10]  b [10]with tf.variable_scope("full_layer"):# 随机初始化权重和偏置weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name="weight")bias = tf.Variable(tf.constant(0.0, shape=[10]))# 预测None个样本的输出结果  [None, 784] * [784, 10]  + [10] = [None, 10]y_predict = tf.matmul(x, weight) + bias# 3、 求出所有样本的损失,然后求平均值with tf.variable_scope("softmax"):# 求平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))# 4、 梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 5、 计算准确率with tf.variable_scope("count_acc"):equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))# equal_list  None个样本  [1, 0, 1, 0, 1, 1, ....]accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))# 收集变量(单维度)tf.summary.scalar("losses", loss)tf.summary.scalar("acc", accuracy)# 收集变量(高维度)tf.summary.histogram("weightes", weight)tf.summary.histogram("biases", bias)# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()# 定义合并变量merged = tf.summary.merge_all()# 保存模型saver = tf.train.Saver()# 开启会话训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./tmp/", graph=sess.graph)if FLAGS.is_train == 0:# 迭代步骤去训练,更新参数预测for i in range(5000):# 取出真实存在的特征值 和 目标值mnist_x, mnist_y = mnist.train.next_batch(50)# 运行train_op训练sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})# 写入每步训练的值summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})filewriter.add_summary(summary, i)# 打印损失print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))# 保存模型saver.save(sess, "./tmp/ckpt/fc_model")else:# 加载模型saver.restore(sess, "./tmp/ckpt/fc_model")# 预测for i in range(100):# 每次测试一张图片x_test, y_test = mnist.test.next_batch(1)print("第%d张图片是: %d,预测结果是:%d" % (i,tf.argmax(y_test, 1).eval(),tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()))return Noneif __name__ == "__main__":ful_connected()

6. cnn版本的mnist

import tensorflow as  tf
from tensorflow.examples.tutorials.mnist import input_data"""使用卷积神经网络实现 mnist的手写数据集识别
""""""input: [None, 784]output: [784, 10]进入卷积时,首先需要改变图片的形状 [None, 784] --> [None, 28, 28, 1]卷积网络设计:· 第一层卷积层: 32 * core(5*5)、strides(1)、padding="SAME"· 此时大小为: [None, 28, 28, 32]· 激活· 池化: 2*2、 strides(2)、 padding="SAME"· 此时大小为: [None, 14, 14, 32]· 第二层卷积层: 64 * core(5*5)、 strides(1)、 padding="SAME"· 此时大小为: [None, 14, 14, 64]· 激活· 池化: 2*2、 strides(2)、 padding="SAME"· 此时大小为: [None, 7, 7, 64]· 全连接层: [None, 7*7*64] * [7*7*64, 10] + bias = [None, 10]
"""# 定义个初始化权重的函数
def weight_variable(shape):w = tf.Variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0))return w# 定义一个初始化偏置的函数
def bias_variables(shape):b = tf.Variable(tf.constant(0.0, shape=shape))return bdef model():"""自定义的卷积模型:return:"""# 1、准备数据的占位符 x [None, 784] 、 y_true [None, 10]with tf.variable_scope("data"):x = tf.placeholder(tf.float32, [None, 784])y_true = tf.placeholder(tf.int32, [None, 10])# 2、一卷积层 卷积: 5*5*1, 32个, strides = 1 、激活、池化with tf.variable_scope("conv1"):# 随机初始化权重,偏置[32]w_conv1 = weight_variable([5, 5, 1, 32])b_conv1 = bias_variables([32])# 对x进行形状的改变 [None, 784] -> [None, 28, 28, 1]x_reshape = tf.reshape(x, [-1, 28, 28, 1])# [None, 28, 28, 1] -> [None, 28, 28, 32]x_relu1 = tf.nn.relu(tf.nn.conv2d(x_reshape, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)# 池化 2*2, strides2 [None, 28, 28, 32] -> [None, 14, 14, 32]x_pool1 = tf.nn.max_pool(x_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")# 3、二卷积层  5*5*32, 64个filter, strides= 1with tf.variable_scope("conv2"):w_conv2 = weight_variable([5, 5, 32, 64])b_conv2 = bias_variables([64])# 卷积、激活、池化计算# [None, 14, 14, 32] -> [None, 14, 14, 64]x_relu2 = tf.nn.relu(tf.nn.conv2d(x_pool1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)# 池化 2*2, strides2 [None, 14, 14, 64] -> [None, 7, 7, 64]x_pool2 = tf.nn.max_pool(x_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")# 4、全连接层 [None, 7, 7, 64] --> [None, 7*7*64] * [7*7*64, 10] + [10] = [None, 10]# 随机初始化权重和偏置w_fc = weight_variable([7 * 7 * 64, 10])b_fc = bias_variables([10])# 修改形状: [None, 7, 7, 64] -> [None, 7*7*64]x_fc_reshape = tf.reshape(x_pool2, [-1, 7 * 7 * 64])# 矩阵运算,得出每个样本的10个结果y_predict = tf.matmul(x_fc_reshape, w_fc) + b_fcreturn x, y_true, y_predictdef conf_fc():# 1、 读取数据mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)# 2、 定义模型,得出输出x, y_true, y_predict = model()# 3、 求出所有的损失,然后求平均值with tf.variable_scope("soft_cross"):# 求平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))# 4、 梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.00005).minimize(loss)# 5、 计算准确率with tf.variable_scope("acc"):equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))# 定义一个初始变量opinit_op = tf.global_variables_initializer()# 开启会话运行with tf.Session() as sess:sess.run(init_op)# 循环去训练for i in range(1000):# 取出真实存在的特征值和目标值mnist_x, mnist_y = mnist.train.next_batch(50)# 运行train_op训练sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})# 打印损失print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))return Noneif __name__ == "__main__":conf_fc()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向过程、面向函数、面向对象的区别浅谈

Python的面向过程、面向函数、面向对象的区别浅谈 转自--猎奇古今,加上其他 有人之前私信问我,python编程有面向过程、面向函数、面向对象三种,那么他们区别在哪呢? 面向过程就是将编程当成是做一件事,要按步骤完成&am…

[pytorch、学习] - 3.5 图像分类数据集

参考 3.5. 图像分类数据集 在介绍shftmax回归的实现前我们先引入一个多类图像分类数据集 本章开始使用pytorch实现啦~ 本节我们将使用torchvision包,它是服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。torchvision主要由以下几部分构成: torchvision.datasets: …

[pytorch、学习] - 3.6 softmax回归的从零开始实现

参考 3.6 softmax回归的从零开始实现 import torch import torchvision import numpy as np import sys sys.path.append("..") import d2lzh_pytorch as d2l3.6.1. 获取和读取数据 batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_si…

[pytorch、学习] - 3.7 softmax回归的简洁实现

参考 3.7. softmax回归的简洁实现 使用pytorch实现softmax import torch from torch import nn from torch.nn import init import numpy as np import sys sys.path.append("..") import d2lzh_pytorch as d2l3.7.1. 获取和读取数据 batch_size 256 train_iter…

[pytorch、学习] - 3.9 多重感知机的从零开始实现

参考 3.9 多重感知机的从零开始实现 import torch import numpy as np import sys sys.path.append("..") import d2lzh_pytorch as d2l3.9.1. 获取和读取数据 batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)3.9.2. 定义模型参…

C语言逗号运算符和逗号表达式基础总结

逗号运算符的作用: 1,起分隔符的作用: 定义变量用于分隔变量:int a,b输入或输出时用于分隔输出表列 printf("%d%d",a,b) 2,用于逗号表达式的顺序运算符 语法:表达式1,表达式2,...,表达…

[pytorch、学习] - 3.10 多重感知机的简洁实现

参考 3.10. 多重感知机的简洁实现 import torch from torch import nn from torch.nn import init import numpy as np import sys sys.path.append("..") import d2lzh_pytorch as d2l3.10.1. 定义模型 num_inputs, num_outputs, num_hiddens 784, 10, 256 # 参…

如何从 Android 手机免费恢复已删除的通话记录/历史记录?

有一个有合作意向的人给我打电话,但我没有接听。更糟糕的是,我错误地将其删除,认为这是一个骚扰电话。那么有没有办法从 Android 手机恢复已删除的通话记录呢?” 塞缪尔问道。如何在 Android 上恢复已删除的通话记录?如…

[pytorch、学习] - 3.11 模型选择、欠拟合和过拟合

参考 3.11 模型选择、欠拟合和过拟合 3.11.1 训练误差和泛化误差 在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现…

[pytorch、学习] - 3.12 权重衰减

参考 3.12 权重衰减 本节介绍应对过拟合的常用方法 3.12.1 方法 正则化通过为模型损失函数添加惩罚项使学出的模型参数更小,是应对过拟合的常用手段。 3.12.2 高维线性回归实验 import torch import torch.nn as nn import numpy as np import sys sys.path.append("…

Scapy之ARP询问

引言 校园网中,有同学遭受永恒之蓝攻击,但是被杀毒软件查下,并知道了攻击者的ip也是校园网。所以我想看一下,这个ip是PC,还是路由器。 在ip视角,路由器和pc没什么差别。 实现 首先是构造arp报文&#xff0c…

转:org.apache.maven.archiver.MavenArchiver.getManifest错误

eclipse导入新的maven项目时,pom.xml第一行报错: org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration) 解决办法: 1、Help——>Install …

Codeforces Round #524 Div. 2 翻车记

A&#xff1a;签到。room里有一个用for写的&#xff0c;hack了一发1e8 1&#xff0c;结果用了大概600ms跑过去了。惨绝人寰。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorith…

[pytorch、学习] - 3.13 丢弃法

参考 3.13 丢弃法 过拟合问题的另一种解决办法是丢弃法。当对隐藏层使用丢弃法时,隐藏单元有一定概率被丢弃。 3.12.1 方法 3.13.2 从零开始实现 import torch import torch.nn as nn import numpy as np import sys sys.path.append("..") import d2lzh_pytorc…

[pytorch、学习] - 4.1 模型构造

参考 4.1 模型构造 让我们回顾以下多重感知机的简洁实现中包含单隐藏层的多重感知机的实现方法。我们首先构造Sequential实例,然后依次添加两个全连接层。其中第一层的输出大小为256,即隐藏层单元个数是256;第二层的输出大小为10,即输出层单元个数是10. 4.1.1 继承Module类来…

springboot---基本模块详解

概述 1.基于Spring框架的“约定优先于配置&#xff08;COC&#xff09;”理念以及最佳实践之路。 2.针对日常企业应用研发各种场景的Spring-boot-starter自动配置依赖模块&#xff0c;且“开箱即用”&#xff08;约定spring-boot-starter- 作为命名前缀&#xff0c;都位于org.…

[pytorch、学习] - 4.2 模型参数的访问、初始化和共享

参考 4.2 模型参数的访问、初始化和共享 在3.3节(线性回归的简洁实现)中,我们通过init模块来初始化模型的参数。我们也介绍了访问模型参数的简单方法。本节将深入讲解如何访问和初始化模型参数,以及如何在多个层之间共享同一份模型参数。 import torch from torch import nn…

IEnumerableT和IQueryableT区分

哎&#xff0c;看了那么多&#xff0c;这个知识点还是得开一个文章 IQueryable和IEnumerable都是延时执行(Deferred Execution)的&#xff0c;而IList是即时执行(Eager Execution) IQueryable和IEnumerable在每次执行时都必须连接数据库读取&#xff0c;而IList读取一次后&…

表的转置 行转列: DECODE(Oracle) 和 CASE WHEN 的异同点

异同点 都可以对表行转列&#xff1b;DECODE功能上和简单Case函数比较类似&#xff0c;不能像Case搜索函数一样&#xff0c;进行更复杂的判断在Case函数中&#xff0c;可以使用BETWEEN, LIKE, IS NULL, IN, EXISTS等等&#xff08;也可以使用NOT IN和NOT EXISTS&#xff0c;但是…

[pytorch、学习] - 4.4 自定义层

参考 4.4 自定义层 深度学习的一个魅力在于神经网络中各式各样的层,例如全连接层和后面章节将要用介绍的卷积层、池化层与循环层。虽然PyTorch提供了大量常用的层,但有时候我们依然希望自定义层。本节将介绍如何使用Module来自定义层,从而可以被重复调用。 4.4.1 不含模型参…