TensorFlow中文社区
MNIST数据集介绍及读取。
搭建全连接神经网络
ps:仅供自己学习使用

MNIST数据集介绍

MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片。

下载

  • 官方网站 http://yann.lecun.com/exdb/mnist/
  • 一共4个文件,训练集、训练集标签、测试集、测试集标签
文件名称大小内容
train-images-idx3-ubyte.gz9,681 kb55000张训练集,5000张验证集
train-labels-idx1-ubyte.gz29 kb训练集图片对应的标签
t10k-images-idx3-ubyte.gz1,611 kb10000张测试集
t10k-labels-idx1-ubyte.gz5 kb测试集图片对应的标签

读入MNIST数据集

直接下载下来的数据是无法通过解压或者应用程序打开的,因为这些文件不是任何标准的图像格式而是以字节的形式进行存储的,所以必须编写程序来打开它。

使用TensorFlow进行解压

使用TensorFlow中input_data.py脚本来读取数据及标签,使用这种方式时,可以不用事先下载好数据集,它会自动下载并存放到你指定的位置。

from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

mnist = input_data.read_data_sets('MNIST_data',one_hot=True)    # MNIST_data指的是存放数据的文件夹路径,one_hot=True 为采用one_hot的编码方式编码标签

#load data
train_X = mnist.train.images                #训练集样本
validation_X = mnist.validation.images      #验证集样本
test_X = mnist.test.images                  #测试集样本
#labels
train_Y = mnist.train.labels                #训练集标签
validation_Y = mnist.validation.labels      #验证集标签
test_Y = mnist.test.labels                  #测试集标签

print(train_X.shape,train_Y.shape)          #输出训练集样本和标签的大小

#查看数据,例如训练集中第一个样本的内容和标签
print(train_X[0])       #是一个包含784个元素且值在[0,1]之间的向量
print(train_Y[0])

#可视化样本,下面是输出了训练集中前20个样本
fig, ax = plt.subplots(nrows=4,ncols=5,sharex='all',sharey='all')
ax = ax.flatten()
for i in range(20):
    img = train_X[i].reshape(28, 28)
    ax[i].imshow(img,cmap='Greys')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

输出为

(55000, 784) (55000, 10)        #训练集样本和标签的大小
第一个样本的内容输出较多,省略
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]   #第一个样本的标签,one-hot编码,只有对应位置的值是1,其余都是0

搭建全连接神经网络

基本步骤如下

  1. 导入各种包和数据
  2. 定义训练参数
  3. 定义网络参数
  4. 定义网络结构
  5. 创建网络及定义损失函数和优化器
  6. 创建会话,启动计算图

1. 导入各种包和数据

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data/", one_hot=True)

2. 定义训练参数

step = 5000
learning_rate = 0.001
batch = 128

step:网络迭代次数,5000代表网络迭代训练5000次
learning_rate:学习率,具体可以搜索梯度下降算法
batch:每次迭代输入网络的数据大小,128表示每次训练输入128张图片

3. 定义网络参数

x = tf.placeholder(tf.float32,shape=[None,784])
y = tf.placeholder(tf.float32,shape=[None,10])
 
w1 = tf.Variable(tf.random_normal([784,256]))
w2 = tf.Variable(tf.random_normal([256,256]))
w_out = tf.Variable(tf.random_normal([256,10]))
 
b1 = tf.Variable(tf.random_normal([256]))
b2 = tf.Variable(tf.random_normal([256]))
b_out = tf.Variable(tf.random_normal([10]))

x,y占位符定义了输入数据的形状,x是图片输入,y是标签输入,后面的变量定义了网络中神经元的形状。

4. 定义网络结构

def Fully_neural_network(X):
    
    layer_1 = tf.nn.relu(tf.add(tf.matmul(X,w1),b1))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1,w2),b2))
    layer_out = tf.matmul(layer_2,w_out)+b_out
    
    return layer_out

5. 创建网络及定义损失函数和优化器

net_out = Fully_neural_network(x) 
 
pre = tf.nn.softmax(net_out)
 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=net_out,labels = y )) 
 
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)
 
train_op = optimizer.minimize(loss)
 
 
correct_pre = tf.equal(tf.argmax(pre,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32))

net_out: 网络输出

pre: 网络预测

loss: 损失函数

optimizer: 优化器

correct_pre: 对网络预测与真实标签对比

accuracy:网络预测的正确率

6. 创建会话,启动计算图

 #定义全部变量初始化的节点
init = tf.global_variables_initializer()
 
 #创建会话
with tf.Session() as sess:      
        
    #全局变量初始化
    sess.run(init)                       
    
    #开始训练
    for i in range(1,step+1):      
        #读入数据      
        batch_x, batch_y = mnist.train.next_batch(batch)
        #启动计算图,喂入数据
        sess.run(train_op, feed_dict={x: batch_x, y: batch_y})
        #没训练100次打印loss和accuracy
        if i % 100 == 0 or i == 1:
            l, acc = sess.run([loss, accuracy], feed_dict={x: batch_x,
                                                                 y: batch_y})
            print("Step " + str(i) + ", Minibatch Loss= " + "{:.4f}".format(l) + ", Training Accuracy= " + "{:.3f}".format(acc))
            
    print("Optimization Finished!")
 
    # Calculate accuracy for MNIST test images
    print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={x: mnist.test.images,
                                      y: mnist.test.labels}))

完整代码

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 10:46:42 2019
@author: wcx
"""
 
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./data/", one_hot=True)
 
step = 5000
learning_rate = 0.001
batch = 128
 
x = tf.placeholder(tf.float32,shape=[None,784])
y = tf.placeholder(tf.float32,shape=[None,10])
 
w1 = tf.Variable(tf.random_normal([784,256]))
w2 = tf.Variable(tf.random_normal([256,256]))
w_out = tf.Variable(tf.random_normal([256,10]))
 
b1 = tf.Variable(tf.random_normal([256]))
b2 = tf.Variable(tf.random_normal([256]))
b_out = tf.Variable(tf.random_normal([10]))
 
def Fully_neural_network(X):
    
    layer_1 = tf.nn.relu(tf.add(tf.matmul(X,w1),b1))
    layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1,w2),b2))
    layer_out = tf.matmul(layer_2,w_out)+b_out
    
    return layer_out
 
    
net_out = Fully_neural_network(x)
 
pre = tf.nn.softmax(net_out)
 
 
 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=net_out,labels = y )) 
 
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)
 
train_op = optimizer.minimize(loss)
 
 
correct_pre = tf.equal(tf.argmax(pre,1),tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32))
 
init = tf.global_variables_initializer()
 
 
with tf.Session() as sess:
    
    sess.run(init)
    
    for i in range(1,step+1):
        batch_x, batch_y = mnist.train.next_batch(batch)
        sess.run(train_op, feed_dict={x: batch_x, y: batch_y})
        if i % 100 == 0 or i == 1:
            l, acc = sess.run([loss, accuracy], feed_dict={x: batch_x,
                                                                 y: batch_y})
            print("Step " + str(i) + ", Minibatch Loss= " + "{:.4f}".format(l) + ", Training Accuracy= " + "{:.3f}".format(acc))
            
    print("Optimization Finished!")
 
    # Calculate accuracy for MNIST test images
    print("Testing Accuracy:", \
        sess.run(accuracy, feed_dict={x: mnist.test.images,
                                      y: mnist.test.labels}))

结果

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐