2.MNIST机器学习入门
当我们开始学习编程的时候,第一件事往往是学习打印"Hello World"。就好比编程入门有Hello World,机器学习入门有MNIST。
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。
2.1 MNIST数据集
下载MNIST传送门https://blog.csdn.net/wuzhichenggo/article/details/79332128
2.2 Softmax回归介绍
详见文档http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html
2.3 实现回归模型
TensorFlow也把复杂的计算放在python之外完成,但是为了避免前面说的那些开销,它做了进一步完善。Tensorflow不单独地运行单一的复杂计算,而是让我们可以先用图描述一系列可交互的计算操作,然后全部一起在Python之外运行。
import tensorflow as tf
x = tf.placeholder("float", [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
2.4 训练模型
交叉熵
给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普遍的说,交叉熵用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出成本的大小。交叉的字面意思在于:真实分布与非真实分布的交叉。给定一个方案, 越优的策略, 最终的交叉熵越低。具有最低的交叉熵的策略就是最优化策略,也就是上面定义的熵。因此, 在机器学习中, 我们需要最小化交叉熵。
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
2.5 模型评估
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
下面为一段我上网课学到的代码,完整一套使用mnist进行神经网络训练并测试的代码,安装tensorflow后可以运行
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 载入数据集
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 从网上下载MNIST数据集
# 每个批次的大小(批次是一次放入100张图片)
batch_size = 100
# 计算一共有多少批次
n_batch = mnist.train.num_examples // batch_size
# 定义两个placeholder
x = tf.placeholder(tf.float32, [None, 784]) # None可以指代任一大小的数,784是固定的,784列
y = tf.placeholder(tf.float32, [None, 10])
# 创建一个简单的神经网络
W = tf.Variable(tf.ones([784, 10]))
b = tf.Variable(tf.ones([10]))
prediction = tf.nn.softmax(tf.matmul(x, W) + b) # softmax将任意值转化为概率值
# 二次代价函数
loss = tf.reduce_mean(tf.square(y - prediction))
# 使用梯度下降法
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
# 初始化变量
init = tf.global_variables_initializer()
# 结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1)) # 取出y和predicton中最大值的索引号,并进行比较,相同则预测正确
# 求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # cast函数用来转化数据类型1->1.0
with tf.Session() as sess:
sess.run(init)
for epoch in range(200): # 设定整个网络训练次数是200
for batch in range(n_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size) # 从训练集中每100取一组图片进行批量处理
sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})
acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}) # 用测试集测试网络的准确率
print('Iter ' + str(epoch) + ',Testing Accuracy ' + str(acc))