Mnist 数据集的下载 以及 tensorflow 实现手写数字识别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhelong3205/article/details/79170672

Mnist 数据集

Mnist 内置 50000 组训练数据 10000 组测试数据 对于深度学习的学习、训练起到了很好的作用
Moist 数据集下载地址 :
http://yann.lecun.com/exdb/mnist/

手写数字识别

手写数字识别有多种实现的方式 比如 softmax 回归 (逻辑回归的推广、可以看成逻辑回归应用于多类分类的问题) 卷积神经网络也可以实现,下面给出几种实现方式的代码,带注释
具体看代码 有详细的注释

回归实现 :


# 将包导入
import tensorflow as tf 
import numpy as np 
from  tensorflow.examples.tutorials.mnist  import  input_data
import matplotlib as plt 


# 读取 moist 数据集
mnist = input_data.read_data_sets('data', one_hot = True)

# 设置参数
num_classes = 10 # 要分成 10 类 
input_size = 784 # 因为 moist的数据集每张图片有 28 * 28 * 1个像素点
training_iterations = 10000 # 训练迭代次数
batch_size = 64 # 分批训练 一次取64个 batch 进行训练 (batch 应该尽量取大一点)


#使用 placeholder 进行占位 None 表示第一维度大小任意
X = tf.placeholder (tf.float32, shape = [None, input_size])
Y = tf.placeholder (tf.float32, shape = [None, num_classes])

# 使用 高维线性边界,假设边界参数
W = tf.Variable (tf.random_normal ([input_size,num_classes], stddev = 0.1)) 
b = tf.Variable (tf.constant (0.1), [num_classes])

# 计算预测值
y_pred = tf.nn.softmax (tf.matmul (X,W) + b)

# 搭建计算图 
loss = tf.reduce_mean (tf.square (Y - y_pred))
# loss 使用均方误差
opt = tf.train.GradientDescentOptimizer (0.05).minimize (loss)
# 使用梯度下降的方法最小化误差 0.05 是学习率
init = tf.global_variables_initializer ()
correct_prediction = tf.equal (tf.argmax (Y,1), tf.argmax (y_pred,1)) # 计算正确的个数 argmax 函数第一维表示 数据集 1 表示按照行 0 表示按照列 如果没有的话 表示整体求最大值 返回最大值所在的下标向量,然后 equal 对两个向量进行比较 相同得到1 不同得到0 
accuracy = tf.reduce_mean (tf.cast (correct_prediction, 'float')) 
# 对上面得到的正确率取平均

# 进行迭代运算
sess = tf.Session ()
sess.run (init)
for i in range (training_iterations) :
    batch = mnist.train.next_batch (batch_size) # 每次取出 64 个 数据进行训练
    batch_input = batch[0] # 取出数据的第一维就是 输入的图像
    batch_labels = batch[1] # 取出第二维 就是 它的 label 值 
    training_loss = sess.run ([opt, loss], feed_dict = {X: batch_input, Y: batch_labels})
    # 计算当前的损失值
    if i % 1000 == 0 :
        train_accuracy = accuracy.eval (session = sess, feed_dict = {X: batch_input,Y: batch_labels})
        print ("step : %d, training accuracy = %g " % (i, train_accuracy)) # 打印正确率

BP神经网络 实现 :

#调包 & 传入数据
import tensorflow as tf 
from  tensorflow.examples.tutorials.mnist  import  input_data
import numpy as np 
mnist = input_data.read_data_sets('data', one_hot = True)

# 设置参数 三层的 BP 神经网络 隐藏层的数目 根据 h = sqrt (n + m) + random (0,10) (具体多少需要调试一下 不过如果数据够多 或者说是迭代次数很多 都问题不大) 进行设置


num_classes = 10
input_size = 784
hidden_units_size = 30
batch_size = 100
training_iterations = 10000

# 设置变量
X = tf.placeholder (tf.float32, shape = [None, input_size])
Y = tf.placeholder (tf.float32, shape = [None, num_classes])
W1 = tf.Variable (tf.random_normal ([input_size, hidden_units_size], stddev = 0.1))
B1 = tf.Variable (tf.constant (0.1), [hidden_units_size])
W2 = tf.Variable (tf.random_normal ([hidden_units_size, num_classes], stddev = 0.1))
B2 = tf.Variable (tf.constant (0.1), [num_classes])

# 搭建计算网络 使用 relu 函数作为激励函数 这个函数就是 y = max (0,x) 的一个类似线性函数 拟合程度还是不错的
# 使用交叉熵损失函数 这是分类问题例如 : 神经网络 对率回归经常使用的一个损失函数
hidden_opt = tf.matmul (X, W1) + B1
hidden_opt = tf.nn.relu (hidden_opt)
final_opt = tf.matmul (hidden_opt, W2) + B2
final_opt = tf.nn.relu (final_opt)

loss = tf.reduce_mean (tf.nn.softmax_cross_entropy_with_logits (labels = Y, logits = final_opt))
opt = tf.train.GradientDescentOptimizer (0.05).minimize (loss)
init = tf.global_variables_initializer ()
correct_prediction = tf.equal (tf.argmax (Y, 1), tf.argmax (final_opt, 1))
accuracy = tf.reduce_mean (tf.cast (correct_prediction, 'float'))

# 进行计算 打印正确率
sess = tf.Session ()
sess.run (init)
for i in range (training_iterations) :
    batch = mnist.train.next_batch (batch_size)
    batch_input = batch[0]
    batch_labels = batch[1]
    training_loss = sess.run ([opt, loss], feed_dict = {X: batch_input, Y: batch_labels})
    if i % 1000 == 0 :
        train_accuracy = accuracy.eval (session = sess, feed_dict = {X: batch_input,Y: batch_labels})
        print ("step : %d, training accuracy = %g " % (i, train_accuracy))

新手一个 欢迎指正

展开阅读全文

没有更多推荐了,返回首页