一、mnist
一个对手写数字进行识别的模型。
思路:
1、将训练集中获取的手写数字图像进行某一统一方式(全部按行或全部按列)的展开,得到一个长向量(这是为了利用softmax做一维的回归,不过损失了二维信息),用一个二维张量来索引某一个样本中的某一像素。
2、softmax模型:用来给不同的对象分配概率(即使在更精细的模型中,最后一步,往往也需要用softmax来分配概率)
两步:
① 加权求和,并引入偏置
对于给定输入图片x,其代表图像为数字i的证据为
evidencei=∑i(wi,jxj)+bievidence_i=∑_i(w_{i,j}x_j)+b_ievidencei=∑i(wi,jxj)+bi
② 用softmax函数将evidence转换成概率,即
y=softmax(evidence)y=softmax(evidence)y=softmax(evidence)
将输入值当成幂指数求值,再正则化这些结果
更紧凑的写法为 y=softmax(Wx+b)y=softmax(Wx+b)y=softmax(Wx+b)
3、为了节省在python外使用别的语言进行复杂矩阵运算带来的开销,TensorFlow做出的优化为,先用图描述一系列可交互的操作,最后统一放在python外执行。
用占位符placeholder来描述这些可交互的单元:
import tensorflow as tf
x=tf.placeholder(tf.float32,[None,784])
用变量Variable来表示权重和偏置:
W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
则模型可以用以下代码实现:
y=tf.nn.softmax(tf.matmul(x,W)+b)
4、模型训练
用交叉熵(cross-entropy)来评判模型的好坏,其表达式为
Hy′(y)=−∑iyi′log(yi)H_{y'}(y)=-∑_iy_i'log(y_i)Hy′(y)=−∑iyi′log(yi)
其中y是预测的概率分布,y’是实际的概率分布(即训练集对应的真实标签,是一个one-hot vector)
定义
y_=tf.placeholder(tf.float32,[None,10])
计算交叉熵
cross_entropy=-tf.reduce_sum(y_*tf.log(y))
tensorflow可以自动利用反向传播算法,根据选择的优化器来最小化你的目标函数
train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
5、训练准备
初始化操作
init=tf.initialize_all_variables
TensorFlow是在一个Session中启动模型
sess=tf.Session()
sess.run(init)
6、开始训练
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})
此为随机梯度下降训练,每次训练随机抓取训练集中的100个数据作为一个batch
7、模型评估
tf.argmax给出对象在某一维度上最大值所对应的索引值,可以用来判断预测是否准确,即
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
equal函数返回布尔值,用cast函数转化为浮点数后求均值来计算正确率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))
8、计算学习到的模型在训练集上的准确率
print sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels})