mnist手写数据集TensorFlow实现

TensorFlow架构简介

TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。它灵活的架构让可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究。
计算速度较快但是较麻烦,会话在c++中进行.
TensorFlow 1.0与2.0之间存在着区别。

mnist手写数据及简介

  1. 数据集由60000个训练样本和10000个测试样本组成
  2. 每个样本都是一张28 * 28像素的灰度手写数字图片
  3. 每个像素点是一个0-255的整数
  • 训练集样本:用在对模型的训练中,使得模型对于数据的识别有自己的一套标准,从而可以对测试集的样本进行测试识别。
    -测试集样本:对训练集所训练出来的模型进行测试,看模型是否合格。

第一部分—数据的读取

from tensorflow.examples.tutorials.mnist.input_data import read_data_sets
mnist= read_data_sets('./MNIST_data',one_hot=True)  # one_hot读取数据时指定编码形式为one_hot(独热编码),one-hot编码是一种稀疏向量,一个向量中只有一个数为1,其他为0

在数据读取时,如果本地没有下载该数据,则计算机会自动联网下载,但由于是在Google上下载,很有可能会发生错误。

print(mnist.train.images[0].shape)
>>784,)  #每一张图片形状为784行的像素,则输入的神经元的个数为784

图片的可视化

import matplotlib.pyplot as plt
plt.imshow(mnist.train.images[0].reshape(28,28),cmap='gray')
plt.show()

知识点补充:
imshow()接收一张图像,只是画出该图,并不会立刻显示出来。
imshow后还可以进行其他draw操作,比如scatter散点等。
所有画完后使用plt.show()才能进行结果的显示。在这里,就将原来为784行的图片数据转换为了28*28的图片,并且呈灰色显示出来。
cmap=“gray” 对图片进行灰度处理,可以提高计算机计算的速率。

第二部分 定义计算图

定义神经元的输入 输出个数

input_size = 784
output_size = 10 

定义模型的输入 输出

x = tf.placeholder(tf.float32,[None,input_size])#None 不知道输入多少个数据  使用一个占位符来定位
y = tf.placeholder(tf.float32,[None,output_size])

需要注意数据类型得相同,否则无法进行计算。

定义权重矩阵和阈值:Variable(变量)

w = tf.Variable(tf.random_normal(shape=(input_size,output_size),dtype=tf.float32))  #权重矩阵784*10   需要设置初始值
bias = tf.Variable(tf.zeros(output_size,dtype=tf.float32))  #阈值 长度为10

定义模型

y_predict=tf.nn.softmax(tf.matmul(x,w)-bias)

这是一个最简单的神经网络,只包含一层输入/出层和以层隐藏层。

定义损失函数

预测结果和真实结果之间的评价,常用的方法是交叉熵评估法。

loss=tf.reduce_mean(
    -tf.reduce_sum(y * tf.log(y_predict),axis=1)
)# 按照行求和

在这里插入图片描述

定义优化器

使得损失函数最小,常见的方法是梯度下降法和自适应法。
梯度方向是函数最大偏导数的方向,因此沿着与该方向相反的方向,必然可以达到函数的一个极小值点。

opt=tf.train.GradientDescentOptimizer(learning_rate=1) 

其中learning_rate为学习速率,会影响损失函数的结果。

定义训练节点

定义优化器来使得损失函数最小

train_op = opt.minimize(loss) 

第三部分 执行计算

启动会话

sess = tf.Session()

全局变量初始化

sess.run(tf.global_variables_initializer())

训练模型

由于训练集中的图片数据较多,则批处理的上传数据到模型中训练。

iter = 5001
all_cost = []  #记录损失函数 (理论上随着函数的训练,损失值应该是越来越小,稳定在相对稳定的一个值上面)
for i in range(iter):
    x_batch,y_batch = mnist.train.next_batch(100)  #批处理:分批次传入数据进行训练
    t,cost = sess.run([train_op,loss],feed_dict={x:x_batch,y:y_batch})
    all_cost.append(cost)
    #定期打印结果
    if i%100 == 0:  #如果i 可以被100整除
        print(f"第{i}次训练".center(50,'='))
        print(f'损失值为:{cost}')

训练完毕后,绘制折线图,展示训练过程中损失值的变化情况,大概判断模型的好坏。

plt.plot(range(iter) ,all_cost)
plt.xlabel('Times')  #训练次数
plt.ylabel('Loss')   #损失值展示
plt.show()   

模型测试

y_pre = sess.run(y_predict,feed_dict={x:mnist.test.images})
y_pre_labels = np.argmax(y_pre,axis=1)  #返回最大值所在的下标,按照行取出

判断模型的正确率

y_real_labels = np.argmax(mnist.test.labels,axis=1)
print("最后一张图片的值为:",plt.imshow(mnist.test.images[9999].reshape(28,28),cmap='gray'))
print("模型预测的正确率:",(np.sum(y_real_labels == y_pre_labels)/10000)*100,'%')#如果相同的话则证明预测结果和真实结果相同

最后记得关闭会话哦!

sess.close()

完整代码

# 1 数据读取
from tensorflow.examples.tutorials.mnist.input_data import read_data_sets
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
mnist= read_data_sets('./MNIST_data',one_hot=True)   #如果没有下载数据则会自己下载 
# mnist.train.images.shape  训练集的数据
# mnist.train.labels.shape
# mnist.test.images.shape    测试集数据
#图片可视化
# plt.imshow(mnist.train.images[0].reshape(28,28),cmap='gray')
# plt.show()
# print(np.argmax(mnist.train.labels[0]))

#2 定义计算图

#2.1定义Tensor:y=softmax(wx-b)
#模型输入输出:placheolder
input_size = 784  #28*28  #输入神经元个数
output_size = 10    #输出神经元个数

#模型输入输出
x = tf.placeholder(tf.float32,[None,input_size])#None 不知道输入多少个数据  使用一个占位符来定位
y = tf.placeholder(tf.float32,[None,output_size])
#权重矩阵和阈值:Variable
w = tf.Variable(tf.random_normal(shape=(input_size,output_size),dtype=tf.float32))  #权重矩阵784*10   需要设置初始值
bias = tf.Variable(tf.zeros(output_size,dtype=tf.float32))  #阈值 长度为10
 
#2.2定义模型
y_predict=tf.nn.softmax(tf.matmul(x,w)-bias)

#2.3定义损失函数(预测结果和真实结果的评价)===>交叉熵的评估方法。loss function
loss=tf.reduce_mean(
    -tf.reduce_sum(y * tf.log(y_predict),axis=1)
)# 按照行求和

#2.4定义优化器(使损失函数最小)
opt=tf.train.GradientDescentOptimizer(learning_rate=0.1)  #梯度下降法   还有一个常用  自适应优化器

#2.5定义训练节点(定义优化器来使得损失函数最小)
train_op = opt.minimize(loss) 

#3.执行计算
#3.1启动会话
sess = tf.Session()
#3.2全局变量初始化
sess.run(tf.global_variables_initializer())

#3.3训练模型
#训练集(数据有点多。不能一次交给模型处理,多次处理就会发生错误)使用批处理进行
iter = 5001
all_cost = []  #记录损失函数 (理论上随着函数的训练,损失值应该是越来越小,稳定在相对稳定的一个值上面)
for i in range(iter):
    x_batch,y_batch = mnist.train.next_batch(100)  #批处理:分批次传入数据进行训练
    t,cost = sess.run([train_op,loss],feed_dict={x:x_batch,y:y_batch})
    all_cost.append(cost)
    #定期打印结果
    if i%100 == 0:  #如果i 可以被100整除
        print(f"第{i}次训练".center(50,'='))
        print(f'损失值为:{cost}')
        
# 训练完毕后,绘制折线图,展示训练过程中损失值的变化情况,大概判断模型的好坏。
plt.plot(range(iter) ,all_cost)
plt.xlabel('Times')  #训练次数
plt.ylabel('Loss')   #损失值展示
plt.show()     
#  3.5 模型测试
mnist.test.images
mnist.test.labels
y_pre = sess.run(y_predict,feed_dict={x:mnist.test.images})
y_pre_labels = np.argmax(y_pre,axis=1)  #返回最大值所在的下标,按照行取出
print("最后一张图的与预测值为:",y_pre_labels[9999])    #输出值
#模型的正确率
y_real_labels = np.argmax(mnist.test.labels,axis=1)
print("最后一张图片的值为:",plt.imshow(mnist.test.images[9999].reshape(28,28),cmap='gray'))
print("模型预测的正确率:",(np.sum(y_real_labels == y_pre_labels)/10000)*100,'%')#如果相同的话则证明预测结果和真实结果相同
#3.4关闭会话
sess.close()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用tensorflow实现的卷积神经网络来进行MNIST手写数字图像的分类。 #导入numpy模块 import numpy as np #导入tensorflow模块,程序使用tensorflow实现卷积神经网络 import tensorflow as tf #下载mnist数据集,并从mnist_data目录中读取数据 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('mnist_data',one_hot=True) #(1)这里的“mnist_data” 是和当前文件相同目录下的一个文件夹。自己先手工建立这个文件夹,然后从https://yann.lecun.com/exdb/mnist/ 下载所需的4个文件(即该网址中第三段“Four files are available on this site:”后面的四个文件),并放到目录MNIST_data下即可。 #(2)MNIST数据集手写数字字符的数据集。每个样本都是一张28*28像素的灰度手写数字图片。 #(3)one_hot表示独热编码,其值被设为true。在分类问题的数据集标注时,如何不采用独热编码的方式, 类别通常就是一个符号而已,比如说是9。但如果采用独热编码的方式,则每个类表示为一个列表list,共计有10个数值,但只有一个为1,其余均为0。例如,“9”的独热编码可以为[00000 00001]. #定义输入数据x和输出y的形状。函数tf.placeholder的目的是定义输入,可以理解为采用占位符进行占位。 #None这个位置的参数在这里被用于表示样本的个数,而由于样本个数此时具体是多少还无法确定,所以这设为None。而每个输入样本的特征数目是确定的,即为28*28。 input_x = tf.placeholder(tf.float32,[None,28*28])/255 #因为每个像素的取值范围是 0~255 output_y = tf.placeholder(tf.int32,[None,10]) #10表示10个类别 #输入层的输入数据input_x被reshape成四维数据,其中第一维的数据代表了图片数量 input_x_images = tf.reshape(input_x,[-1,28,28,1]) test_x = mnist.test.images[:3000] #读取测试图片的特征,读取3000个图片 test_y = mnist.test.labels[:3000] #读取测试图片的标签。就是这3000个图片所对应的标签

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值