系列文章
本教程有同步的github地址
前言
深度学习基本上就是处理两大类问题,分类问题与回归问题。系列文章的第4,5篇均是针对回归问题进行介绍,本文则会通过简单的示例,也是经典的tutorial——手写数字识别的demo来介绍分类任务的模型是如何搭建的。
知识点
mnist数据集,是tensorflow中自带的教学数据集,数据操作已经写好了,但是数据需要下载。其中每条数据是
28
×
28
28\times 28
28×28的灰度图。图片上显示的各种数字(0-9)的手写体。
利用这个数据集可以做图片的10分类将达到识别数字手写体。
关于mnist数据集相关的操作可以在下文的示例中查看。
tf.nn.softmax()
是对一个向量做softmax的操作。何为softmax操作即利用如下的计算式对列表中的每一个元素进行计算。
e
i
∑
i
=
0
n
e
i
\frac{e^i}{\sum_{i=0}^{n}e^i}
∑i=0neiei
上式中的i代表列表中的具体的数值。
tf.nn.softmax_cross_entropy_with_logits()
这个函数可以求解预测值与真实值的交叉熵,其中参数logits
代表预测的值,labels
代表真实值。
注意计算loss
的时候需要将tf.nn.softmax_cross_entropy_with_logits()
的结果经过tf.reduce_mean()
才能得到最终的平均loss,否则会得到一个列表,包含了一个批次中每一个训练样本的loss值。
tf.argmax()
函数的作用是,将张量沿着某一个轴(维度)进行取最大值下标的操作。
tf.argmax([[0.1, 0.3, 0.6],[0.2, 0.5, 0.3]], 1)
>>> [2, 1]
tf.equal(a, b)
函数用于判断张量a与张量b中哪些元素相等,最终生成一个与a,b相等的张量。a与b相等的位置为True,其余位置为False。
通过tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
可以得到预测正确率的矩阵。
tf.cast()
可以将传入的张量类型进行转换(类似于强制类型转换)。
accuarcy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# tf.cast()把correct_prediction中为True的转为1.0,False转为0.0
# 利用 tf.reduce_mean()求平均后就是整个训练集的正确率
示例
#%% md
# 简单分类问题
利用mnist数据集实现多选一的分类问题
#%%
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#%% md
载入数据集
#%%
mnist = input_data.read_data_sets("MNIST",one_hot=True)
#%% md
设置batch_size的大小
#%%
batch_size = 50
n_batchs = mnist.train.num_examples // batch_size
#%%
n_batchs
#%% md
## 定义两个placeholder作为数据的入口
#%%
x = tf.placeholder(tf.float32, [None, 784],name="x-input")
y = tf.placeholder(tf.float32, [None, 10], name="y-input")
#%%
x,y
#%% md
## 创建隐层网络
#%%
w = tf.Variable(tf.zeros([784, 10]))
#%%
w
#%%
b = tf.Variable(tf.zeros([1,10]))
#%%
b
#%%
prediction = tf.nn.softmax(tf.matmul(x, w) + b)
#%%
prediction
#%% md
## 创建交叉熵代价函数
#%%
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
#%% md
## 定义优化器
#%%
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
#%%
train_step
#%% md
## 初始化全局变量
#%%
init = tf.global_variables_initializer()
#%% md
## 计算准确率
#%%
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
accuarcy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
#%%
correct_prediction, accuarcy
#%% md
## 训练
#%%
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
#%%
sess.run(init)
#%%
for epoch in range(200):
for batch in range(n_batchs):
batch_x, batch_y = mnist.train.next_batch(batch_size)
sess.run([train_step],{x:batch_x, y: batch_y})
acc = sess.run(accuarcy, feed_dict = {x:mnist.test.images, y:mnist.test.labels})
print("Iter: ", epoch, "acc: ", acc)
#%%
#%%
#%%