Welcome(〃'▽'〃)!

这里可能没有什么厉害的技术帖,但是会有一些实用的小教程

Softmax回归识别MNIST——Tensorflow学习笔记(一)

最近想系统地学习一下深度学习,之前看过pytorch,tensorflow等一些深度学习的框架,也了解过其中的一些基础知识,但是没怎么真正上手练习过,所以这次从最简单的来,用softmax回归来识别MNIST数据集。

《Softmax回归识别MNIST——Tensorflow学习笔记(一)》

MNIST数据集就不多介绍了,网上资料一搜一大堆,直接开始写代码。

首先导入一些依赖库:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

接下来的代码会读取mnist数据集,如果数据集不存在则会从网上下载mnist数据集:(这里可以先将程序运行一下,将数据先下载完,下载后的数据保存在MNIST_data文件夹下,共四个压缩文件。这一步可能会卡住报错,原因是因为下载数据集的网站由于某些众所周知的原因在大陆无法访问,所以建议开启国外代理后下载)

mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)

定义一些变量,x是一个占位符,代表待识别的图片,W和b是模型参数:

x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

y表示模型输出,y=x*W+b,y_存放正确的图片标签:

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)))

利用梯度下降法对参数进行优化,学习率为0.01:

train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

创建会话并初始化参数:

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

开始训练,训练1000步,每次取100个数据进行训练:

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}))

最终正确率为0.9176,可以看出已经学到了一些东西了,但是这个准确率还不是很高,可以通过添加网络层数以及加入卷积神经网络来提升正确率,这个我会在之后的笔记中讲到。

《Softmax回归识别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)

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)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

for _ in range(2000):
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}))
点赞

发表评论

电子邮件地址不会被公开。