tensorflow入门学习(4)—— 实现简单的Neural Network模型

通过手写数字集的样例,来熟悉使用tensorflow搭建神经网络模型,进行识别
Reference: https://github.com/aymericdamien/TensorFlow-Examples/

导入数据


这里导入官方的数据集
The MNIST database of handwritten digits, available from this page, has a training set of 60,000 examples, and a test set of 10,000 examples. It is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image.

training set images (9912422 bytes)
training set labels (28881 bytes)
test set images (1648877 bytes)
test set labels (4542 bytes)

构建模型

1.通过tf.placeholder创建X,Y表示训练集特征和label两个空的tensor
(上面是一些参数下面会提到)

2.创建每层的weights,biases参数

3.创建神经网络的模型
I n p u t ( 784 ) H i d d e n L a y e r 1 ( 256 ) H i d d e n L a y e r 2 ( 256 ) O u t p u t L a y e r ( 10 )

4.创建训练,测试时将要用到的op,tensor

logits(Tensor): 表示X经过神经网络后得到的输出层(预测)结果
loss_op(Op): 表示计算损失值loss的一个operation,传入logits,Y(预测值,实际值),输出loss损失值
optimizer:表示Adam优化算法,一种用于训练,更新weights,biases的算法
train_op:表示优化算法最小化loss值这样的训练操作(train operation)
correct_pred:返回预测值是否等于实际值的True,False列表
accuracy:返回预测值(%)
init:初始化全局变量的op

5.开始训练并测试

发现sess.run()里的op是train_op
根据数据Tensor的流向:
train_op->loss_op->logits->X
train_op->loss_op->Y
所以feed_dict里面的key是X,Y(表示传入Op的参数)
sess.run()里存在[loss_op, accuracy]表示两个op同时执行也由feed_dict传入input

常用操作

1. tf.reduce_mean()求平均值

tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

tf.reduce_mean(x) ==> 2.5 #如果不指定第二个参数,那么就在所有的元素中取平均值
tf.reduce_mean(x, 0) ==> [2., 3.] #指定第二个参数为0,则第一维的元素取平均值,即每一列求平均值
tf.reduce_mean(x, 1) ==> [1.5, 3.5] #指定第二个参数为1,则第二维的元素取平均值,即每一行求平均值

2. tf.reduce_max(), tf.reduce_sum()类似

3. tf.nn.softmax_cross_entropy_with_logits()

在计算loss的时候,最常见的一句话就是tf.nn.softmax_cross_entropy_with_logits,那么它到底是怎么做的呢?

首先明确一点,loss是代价值,也就是我们要最小化的值

tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
除去name参数用以指定该操作的name,与方法有关的一共两个参数:

第一个参数logits:就是神经网络最后一层的输出,如果有batch的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是num_classes

第二个参数labels:实际的标签,大小同上

具体的执行流程大概分为两步:

第一步是先对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,输出就是一个num_classes大小的向量([Y1,Y2,Y3…]其中Y1,Y2,Y3…分别代表了是属于该类的概率)
softmax的公式是: s o f t m a x ( x ) i = e x p ( x i ) j e x p ( x j )
第二步是softmax的输出向量[Y1,Y2,Y3…]和样本的实际标签做一个交叉熵,公式如下

其中 y i 指代实际的标签中第i个的值(用mnist数据举例,如果是3,那么标签是[0,0,0,1,0,0,0,0,0,0],除了第4个值为1,其他全为0)
y i 就是softmax的输出向量[Y1,Y2,Y3…]中,第i个元素的值
显而易见,预测越准确,结果的值越小(别忘了前面还有负号),最后求一个平均,得到我们想要的loss

注意!!!这个函数的返回值并不是一个数,而是一个向量,如果要求交叉熵,我们要再做一步tf.reduce_sum操作,就是对向量里面所有元素求和,最后才得到,如果求loss,则要做一步tf.reduce_mean操作,对向量求均值!

4. tf.train.AdamOptimizer

__init__(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')

此函数是Adam优化算法:是一个寻找全局最优点的优化算法,引入了二次方梯度校正。

相比于基础SGD算法,1.不容易陷于局部优点。2.速度更快

5. tf.argmax(input, axis=None, name=None, dimension=None)

此函数是对矩阵按行或列计算最大值

参数

input:输入Tensor
axis:0表示按列,1表示按行
name:名称
dimension:和axis功能一样,默认axis取值优先。新加的字段

返回:Tensor 一般是行或列的最大值下标向量

6. tf.equal()

tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的

A = [[1,3,4,5,6]]  
B = [[1,3,4,3,2]]  

with tf.Session() as sess:  
    print(sess.run(tf.equal(A, B)))  

输出:[[ True True True False False]]

猜你喜欢

转载自blog.csdn.net/qq_37423198/article/details/80532006