# 本篇主要用来认识Tensorflow实现神经网络的一般流程,最简单最原始的实现方法,不关注具体提升错误率技巧。
## Mnist数据集是所提供的一个手写数据集。
## 安装数据集
可以下载到本地,也可以用Google的,Colaboratory 是免费的 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。推荐使用它,记得搭梯子。
两行代码安装:
import tensorflow.examples.tutorials.mnist.input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
这个数据集中,总共有6w行训练数据集,1w行测试数据集,每张图片都是28*28的像素点矩阵。把这个二维矩阵展开成一维向量,长度是28*28=784.
在MNIST训练数据集里,训练集图片(mnist.train.images)是一个形状为[60000,784]的张量,第一个维度数字用来索引图片,第二个维度数字用来索引每张图片中的像素点。在此张量里的每一个元素,都表示某张图片里的某个像素的强度值,值介于0和1之间。
## 分类器使用softmax,具体原理见。。。
然后来实现一个最简单的两层全连接网络来完成MNIST数据的分类问题,输入层784个神经元,对应每张图片784个像素点;输出层十个神经元,对应0-9这10个数字,实现分类。
## 计算流程
1. 数据准备
2. 准备好placeholder
3. 初始化参数/权重
4. 计算预测结果
5. 计算损失值
6. 初始化优化器optimizer
7. 指定迭代次数,在session执行graph
## 代码
1. 准备数据
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 载入数据集
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
# 每个批次送100张图片
batch_size = 100
# 计算一共有多少个批次
n_batch = mnist.train.num_examples / batch_size
2. 准备好placeholder
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
3. 初始化参数、权重
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
4. 计算预测结果
prediction = tf.nn.softmax(tf.matmul(x, W) + b)
5. 计算损失值
loss = tf.reduce_mean(tf.square(y - prediction))
6. 初始化优化器optimizer
learning_rate = 0.2
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# 计算结果存在boolean list,argmax()函数返回一维张量中最大值所在的位置
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))
# 计算准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
7. 指定迭代次数
n_sample = xs.shape[0]
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for epoch in range(21):
for batch in range(n_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(optimizer, feed_dict={x: batch_xs, y:batch_ys})
acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.label})
if epoch % 2 == 0:
print('Iter ' + str(epoch) + ',Testing Accuracy ' + str(acc))
一些可以优化的方向:
1. 增加神经网络层数,添加隐层;
2. 将二次代价函数修改成交叉熵函数呢?
3. 尝试多选几个梯度下降优化器呢?