TensorFlow1.x入门(6)——简单分类问题

系列文章

本教程有同步的github地址

0. 统领篇

1. 计算图的创建与启动

2. 变量的定义及其操作

3. Feed与Fetch

4. 线性回归

5. 构建非线性回归模型

6. 简单分类问题

7. Dropout与优化器

8. 手动调整学习率与TensorBoard

9. 卷积神经网络(CNN)

10. 循环神经网络(RNN)

11. 模型的保存与恢复

简单分类问题

前言

深度学习基本上就是处理两大类问题,分类问题与回归问题。系列文章的第4,5篇均是针对回归问题进行介绍,本文则会通过简单的示例,也是经典的tutorial——手写数字识别的demo来介绍分类任务的模型是如何搭建的。

知识点

mnist数据集,是tensorflow中自带的教学数据集,数据操作已经写好了,但是数据需要下载。其中每条数据是 28 × 28 28\times 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代表列表中的具体的数值。

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)
#%%

#%%

#%%

猜你喜欢

转载自blog.csdn.net/qq_19672707/article/details/105545952