下载mnist库

  • 官方链接下载四个文件,分别是训练的图片、标签和识别的图片、标签,下载完后放在程序目录下的MNIST_data文件夹下
  • 如果不下载通过导包的方式,也会自动下载好
    1
    from tensorflow.examples.tutorials.mnist import input_data

导入数据

TF提供了方便的封装,可以直接加载MNIST数据为我们期望的格式

1
2
3
4
5
6
mnist = input_data.read_data_sets('MNIST_data', one_hot = True)

# 准备好数据之后,可以通过以下命令查看数据集的类型
print (mnist.train.images.shape, mnist.train.labels.shape)
print (mnist.test.images.shape, mnist.test.labels.shape)
print (mnist.validation.images.shape, mnist.validation.labels.shape)

建立一层神经网络,由于经常需要添加神经层,干脆封成一个函数

多分类任务,通常使用softmax regression模型。工作原理就是讲某一类的特征相加,然后把这些特征转换为判定是这一类的概率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import tensorflow as tf
# TF是一个“符号主义”的库,完全采用符号式编程,所以我们需要定义好各种变量,建立一个数据流图并且规定好各个变量之间的计算关系,然后对数据流图进行编译

x = tf.placeholder(tf.float32, [None, 784]) #placeholder变量用作输入数据,用到的图是28*28,所以一张图片可以看成是一个784维的向量

# 由于经常需要添加神经层,干脆封成一个函数


def add_layer(input, input_size, output_size, activation_function=None):
Weights = tf.Variable(tf.random_normal([input_size,output_size]))
#相传生成参数的时候,随机变量会比全部为0好很多,所以就生成一个随机变量矩阵

biases = tf.Variable(tf.zeros([1,output_size]) + 0.1)
#biases的推荐值在机器学习当中也不被推荐为0,所以就给他象征性0.1

#激励函数
if activation_function is None:
return tf.matmul(input, Weights) + 1
else:
return activation_function(tf.matmul(input, Weights) + 1)


prediction = add_layer(x, 784, 10, activation_function=tf.nn.softmax)
```
## 计算损失
定义一个loss function来描述模型对问题的分类精度。loss越小,代表模型的偏差。训练的目的就是通过调整参数wb来把loss不断减小,使达到一个全局或者局部的最优解
``` python
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(prediction), reduction_indices = [1]))

Train方法(优化算法)

这里采用梯度下降法

1
2
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
# 0.5表示每次下降的步长,也叫作学习速率,然后设定优化目标为cross_entropy

训练

1
2
3
4
5
6
7
8
9
10
# 开始训练之前,首先要构建图,InteractiveSession可以被注册为默认的session,这样之后运算会方便
sess = tf.InteractiveSession()

# 然后把我们设定的Variables使用TF的全局参数初始化器tf.global_variables_initializer()全部初始化
#注意:必须要把这个操作扔进图里run一下才能生效
tf.global_variables_initializer().run()

for i in range(5000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run({x: batch_xs, y_: batch_ys})

验证

1
2
3
4
5
6
correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(y_, 1))
# tf.argmax用来从一个tensor中寻找最大值的序号。tf.argmax(prediction, 1)求各个预测数字中概率最大的,tf.argmax(y_, 1)求样本真实数字类别

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))