前言
一般机器学习框架都使用MNIST作为入门。就像"Hello World"对于任何一门编程语言一样,要想入门机器学习,就先要掌握MNIST。
笔者在学习的时候Tensorflow已经成为十分流行的机器学习框架,网上有大量的“资源”,但是大多都限于皮毛。
很多教程就是给你一段代码然后随便讲两句,这样对新手并不友好。
因此我萌生了写一个详解的想法。
笔者是一名网络工程在读大学生,知识水平有限,未必能做到面面俱到且处处正确,如有错误请指出。
源代码
- 训练集
请点击此处下载。
提取码:xgpy - 源代码
在源代码同一目录下新建文件夹“训练集”,把百度云连接里面的.gz文件放入该文件夹。
# -*- coding: utf-8 -*-
import tensorflow as tf
import input_data
mnist = input_data.read_data_sets('./训练集', one_hot=True)
'''
#构建运算图
'''
# X Y 都是占位符 占位而已 不表示具体的数据
x = tf.placeholder("float",[None,784]) # 图像的大小为784;None表示第一个维度可以是任意长度
# 一个Variable代表一个可修改的张量,它们可以用于计算输入值,也可以在计算中被修改
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
# 计算交叉熵
y_ = tf.placeholder("float", [None,10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 梯度下降算法(gradient descent algorithm)
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# 在运行计算之前,我们需要添加一个操作来初始化我们创建的变量:
init = tf.global_variables_initializer()
# 在一个Session里面启动我们的模型,并且初始化变量:
sess = tf.Session()
sess.run(init)
# 训练模型1000次
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})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
#print('-**-',accuracy,type(accuracy))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
详解
这一大段代码实现的功能是:
建立 y = w*x+b 的模型,其中x是输入的
可以直观的看到,以上代码分为三部分:构建图、定义会话、启动图。
构建图
构建图也分为定义变量、定义交叉熵、定义优化方法。
- 定义变量
由定义方法分类,本实例中主要有两种变量。
第一类是由tf.Variable()定义的w、b
第二类是由tf.placeholder()定义的y_、x
顺带提一句y = tf.nn.softmax(tf.matmul(x,W) + b)是这两者结合起来的。
那么这两类有什么区别呢?
一般而言,Varibale主要用来保存tensorflow图中的一些结构中的参数,如本例中的w权重,b偏置。需要初始化。
plceholder主要用来把要训练/测试的数据输入模型,每次训练plceholder都有不一样的值。在Session.run(feed_dict={})中的参数确定实际的值。
可视化网页
https://www.cs.ryerson.ca/~aharley/vis/fc/
https://www.cs.ryerson.ca/~aharley/vis/conv/flat.html
https://poloclub.github.io/cnn-explainer/