数据集
- 我们要训练机器学习, 那么就要用到训练数据. 这次我们使用MNIST_data数据集
- 在程序中要导入该数据集, 语句:
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
one_hot 意思是把数据集变成[000010000](每行只有一个位置是1其余位置是0)
这种格式 - 如果当前路径下没有"MNIST_data"数据集的话, 程序会自动在网络上下载该数据集, 如果遇到网络原因, 那么就去mnist数据集网站下载
该数据集被分成两部分: 60000行的训练数据集(mnist.train)以及10000行的测试数据集(mnist.test)
数据集图片如下:
mnist训练图片
每一张图片包含 28*28
个像素,我们把这一数组展开成向量, 长度是是 28*28=784
。因此在MNIST数据集中mnist.train.images是一个形状为[60000, 784]
的张量, 第一个维度用来索引图片, 第二个数字用来表示每张图片中的像素点. 图片里的某个像素的强度介于0到1之间.
代码训练
我们这次做一个简单的识别训练程序(只有输入层和输出层, 可以根据自己的需要来增加中间层)
训练程序结构图import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#载入数据
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
#每个批次的大小
batch_size = 100
#计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size
#定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])
#创建一个简单的神经网络
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
prediction = tf.nn.softmax(tf.matmul(x, W)+b)
#二次代价函数
loss = tf.reduce_mean(tf.square(y-prediction))
#使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#初始化变量
init = tf.global_variables_initializer()
#结果存放在一个布尔型列表中
#argmax返回一组张量中最大的值所在的那个位置
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
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(train_step, feed_dict = {x: batch_xs, y: batch_ys})
arc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
#把每一轮运行完毕之后得到的准确率都打印一下
print("Iter " + str(epoch) + ",Testing Accuracy " + str(arc))
得到的结果:
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting MNIST_data\train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
Iter 0,Testing Accuracy 0.8324
Iter 1,Testing Accuracy 0.8711
Iter 2,Testing Accuracy 0.8822
Iter 3,Testing Accuracy 0.8883
Iter 4,Testing Accuracy 0.8942
Iter 5,Testing Accuracy 0.8974
Iter 6,Testing Accuracy 0.9004
Iter 7,Testing Accuracy 0.9012
Iter 8,Testing Accuracy 0.9039
Iter 9,Testing Accuracy 0.9054
Iter 10,Testing Accuracy 0.9065
Iter 11,Testing Accuracy 0.9073
Iter 12,Testing Accuracy 0.908
Iter 13,Testing Accuracy 0.9093
Iter 14,Testing Accuracy 0.9094
Iter 15,Testing Accuracy 0.9111
Iter 16,Testing Accuracy 0.9115
Iter 17,Testing Accuracy 0.9125
Iter 18,Testing Accuracy 0.9124
Iter 19,Testing Accuracy 0.9129
Iter 20,Testing Accuracy 0.9137
语法解释:
-
载入数据使用
from tensorflow.examples.tutorials.mnist import input_data
的mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
方法 -
tf.argmax(y, 1)
: argmax是一种函数,函数y=f(x),x0= argmax(f(x)) 的意思就是参数x0满足f(x0)为f(x)的最大值;换句话说就是 argmax(f(x))是使得 f(x)取得最大值所对应的变量x。arg即argument,此处意为“自变量”。
tf.argmax(input, axis=None, name=None, dimension=None)
此函数是对矩阵按行或列计算最大值
参数
input:输入Tensor
axis:0表示按列,1表示按行
name:名称
dimension:和axis功能一样,默认axis取值优先。新加的字段
返回:Tensor 一般是行或列的最大值下标向量
-
tf.cast(correct_prediction, tf.float32)
: cast(x, dtype, name=None)
将x的数据格式转化成dtype.例如,原来x的数据格式是bool,
那么将其转化成float以后,就能够将其转化成0和1的序列。反之也可以
代码优化
代码有很多可以优化的地方, 以提高准确率
- 批次大小可以修改
- 添加隐藏层, 可以用ReLU函数等
- W与b的初始值不初始化为0
- 代价函数(损失函数)可以选择其他算法(比如交叉熵)
- 梯度下降法的学习参数
- 选择其他的下降算法
- 可以多训练几个周期
网友评论