MNIST机器学习入门
下载数据文件
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("MNIST_data/", one_hot=True)
将数据文件从向量形式转化成图片形式
from tensorflow.examples.tutorials.mnist import input_data
from PIL import Image
import tensorflow.compat.v1 as tf
import os
import scipy.misc
tf.disable_v2_behavior
mnist=input_data.read_data_sets("MNIST_data/", one_hot=True)
save_dir="MNIST_data/raw/"
if os.path.exists(save_dir) is False:
os.mkdir(save_dir)
for i in range(20):
image_array = mnist.train.images[i, :]
image_array = image_array.reshape(28,28)
filename = save_dir+'mnist_train_%d.jpg'%i
scipy.misc.toimage(image_array, cmin=0.0, cmax=1.0).save(filename)
print('please checck %s' % save_dir)
标签的独热表示
from tensorflow.examples.tutorials.mnist import input_data
from PIL import Image
import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior
mnist=input_data.read_data_sets("MNIST_data/", one_hot=True)
for i in range(20):
one_hot_label = mnist.train.labels[i, :]
label = np.argmax(one_hot_label)
print('mnist train_%d.jpg:%d' % (i, label))
Softmax回归
Softmax多类分类回归模型,本实例中用来计算每个数字的概率,选择其概率最大的类别当作其数值。
其作用是将其分数值转化成概率值,如:
一类别打分为a,二类别打分为b,三类别打分为c,调用Softmaxn函数则响应的值变成
也就是其概率值。
假设x是样本的特征,W,b是Softmax模型的参数,在MNIST数据集中则x是一个784维向量,而W是一个(784,10)矩阵,b是一个10维向量,代表其类别数。
计算其逻辑回归模型:
得出的Logit是一个10维向量,进而用Softmax模型将其转换成各个类别的概率。
Softmax在Tensorflow中的实现:
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
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(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y)))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
print('start running ... ')
for _ 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, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
其中tf.placeholde和tf.Variable分别为占位符和变量,属于tensor(张量)。
其中,占位符通常用来存储数据和标签,需要用户自行传递给它。如x = tf.placeholder(tf.float32, [None, 784]),用来表示图片数据,None表示可以传递任意张图片给这个占位符。
而变量是指在计算过程中可变的量,每次计算后变量的值会被保存起来,通常用于存储模型参数。
接着,用交叉熵来评测其与实际标签的距离。
交叉熵的损失函数以及在Tensorflow中的实现
构造完交叉熵之后,需要用递归下降分析法进行优化。
在优化前,必须建立一个会话,并且在会话中进行变量的初始化。
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
tf.argmaxn返回N维向量中最大值的下标,tf.euqal则是比较两个数是否相同。
该语句的意思是比较预测标签与实际标签是否相一致。