由于我个人的原因,在写了第一篇tensorflow安装教程后就暂停了更新博客。可是我并没有停止前进的步伐,因为我习惯了做书面的笔记了。可是书面笔记,容易破损啊啊啊啊!!!
在深度学习中,入门的项目是MNIST数据集的分类识别。就好比我们学各种编程语言时候的Hello World!
下载MNIST数据集
从这里下载MNIST数据集。点击如下图所示按钮下载:
训练图片,训练标签,测试图片,测试标签
入门级别数据集,不大才11MB。很快就下载好了。
当然我们也可以用如下代码在程序中下载,不过我当时做的项目中没有用此方法。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets( 'MNIST_data' )
在这个项目里,我并没有用多少tensorflow提供的API接口来实现,更多是用tf的运算来实现整个神经网络。(真的累)
开车先造轮(加载MNIST数据)
想代码跑起来,轮子必不可少。读取数据方面的轮子是参考一个关于MNIST开源的项目写的。
调包
首先调包。(每个程序猿都是一名合格的调包侠)
import math
import numpy as np
import h5py
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.python.framework import ops
from LoadData import DataUtils
数据的处理
读取数据
def main():
trainFile_x = 'D:/PycharmProjects/MNIST/MNIST_data/train-images.idx3-ubyte' # 读取训练集文件,后面为训练集的存放地址
trainFile_y = 'D:/PycharmProjects/MNIST/MNIST_data/train-labels.idx1-ubyte' # 读取训练集标签文件,后面为训练集标签的存放地址
testFile_x = 'D:/PycharmProjects/MNIST/MNIST_data/t10k-images.idx3-ubyte' # 读取测试集文件,后面为测试集的存放地址
testFile_y = 'D:/PycharmProjects/MNIST/MNIST_data/t10k-labels.idx1-ubyte' # 读取测试集标签文件,后面为测试集标签的存放地址
train_X = DataUtils( fileName = trainFile_x ).getImage() # 获取训练集
train_Y = DataUtils( fileName = trainFile_y ).getLabel() # 获取训练集标签
test_X = DataUtils( testFile_x ).getImage() # 获取测试集
test_Y = DataUtils( testFile_y ).getLabel() # 获取测试集标签
return train_X, train_Y, test_X, test_Y
one_hot_matrix
把训练集与测试集的标签按指定的个数大小进行tf.one_hot()
处理。
def one_hot_matrix( labels, C ):
C = tf.constant( C, name = "C" )
one_hot_matrix = tf.one_hot( labels, C, axis = 0 )
one_hot = sess.run( one_hot_matrix )
return one_hot
数组的转置
我们要把训练集与测试集转置下,因为我个人喜欢一张图片放为一个列。
同时我们也对标签进行了one_hot_matrix()
处理
def fit_data():
train_X, train_Y, test_X, test_Y = main()
train_X, test_X, = train_X.T, test_X.T
'''--------进行one_hot处理--------'''
train_Y = one_hot_matrix( train_Y, 10 )
test_Y = one_hot_matrix( test_Y, 10 )
随机mini_batches
def random_mini_batches( X, Y, mini_batch_size ):
m = X.shape[1] # 获取MNIST数据集中的训练集的个数
mini_batches = []
'''-------实现随机操作--------'''
permutation = list( np.random.permutation( m ) )
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation]
'''--------进行mini_batches分配--------'''
num_complete_minibatches = math.floor( m / mini_batch_size )
for k in range( 0, num_complete_minibatches ):
mini_batch_X = shuffled_X[:, k * mini_batch_size : mini_batch_size * ( k + 1 )]
mini_batch_Y = shuffled_Y[:, k * mini_batch_size : mini_batch_size * ( k + 1 )]
mini_batch = ( mini_batch_X, mini_batch_Y )
mini_batches.append( mini_batch )
'''--------把剩下的训练集分到一个batch中--------'''
if m % mini_batch_size != 0:
mini_batch_X = shuffled_X[:, mini_batch_size * num_complete_minibatches : m]
mini_batch_Y = shuffled_Y[:, mini_batch_size * num_complete_minibatches : m]
'''--------把对应的训练集测试集按元组组成mini_batch并放入mini_batches中--------'''
mini_batch = ( mini_batch_X, mini_batch_Y )
mini_batches.append( mini_batch )
return mini_batches
初始化参数
def initialize_parameters():
'''--------初始化第一层神经网络--------'''
W1 = tf.get_variable(