使用Tensorflow实现Softmax Regression

来源:互联网 发布:丽晶软件 编辑:程序博客网 时间:2024/06/05 16:19

今天我们将使用tensorflow自带的手写数字数据,来训练一个softmax regression的模型。这应该是机器学习领域的入门级任务。这些数据TensorFlow已经做了相当完整的包装,我们可以先忽略数据上的细节,把重点放到算法和结构上来。

from tensorflow.examples.tutorials.mnist import input_datamnist=input_data.read_data_sets('MNIST_data',one_hot=True)print(mnist.train.images.shape,mnist.train.labels.shape) #训练集的数量,维度,类别信息 print(mnist.test.images.shape,mnist.test.labels.shape) #测试集的数量,维度,类别信息
    执行代码,我们可以看到,训练数据是55000*784的Tensor,每一张手写数字图片的像素是28*28,为了入门的计算和理解方便,我们将其化为1个拥有(28*28)个数据的向量。这会丢失图片的一些特征信息,但是目前我们不需要建立一个太复杂的模型,所以暂时简化一下数据问题。
    标签label是一个一维的拥有10个数据的向量,例如,如果该图片对应的数字是0,那么它的标签就是[1,0,0,0,0,0,0,0,0,0];如果是3,就是[0,0,0,1,0,0,0,0,0,0]
    Softmax regression是用来处理多分类任务常用的方法,它会对每一种类别计算概率:预测数字3的概率是80%,预测为5的概率为20%,那么取较大概率的值,就认为这个手写数字图片代表的是3。我们可以简要的写作y=softmax(Wx+b),其中W是特征矩阵,b为偏置。看起来跟线性分类还有点像呢。
import tensorflow as tfsess=tf.InteractiveSession()    #这是设置为默认session
x=tf.placeholder(tf.float32,[None,784])#定义数据存放的空间,类型,其中[None,784]代表不限制输入数据的数目,784代表输入的是拥有784个数据的向量
w=tf.Variable(tf.zeros([784,10]))  #定义W为784*10的矩阵b=tf.Variable(tf.zeros([10]))      #定义偏置b为1*10的向量y=tf.nn.softmax(tf.matmul(x,w)+b)  #注意x和W矩阵相乘的循序,机(1*784)×(784*10)+(1*10)y_=tf.placeholder(tf.float32,[None,10])  #同理,定义一个y_用来存放对应x的标签
就如同前面线性分类的loss funciton一样,这个模型中,我们也要定义一个供优化的loss,这里我们使用信息熵(cross_entropy),有兴趣的同学可以去看看原理,这里略过先。
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
    现在,我们定义好了算法,也定义好了损失函数loss function,那在定义一个优化算法,依然使用随机梯度下降。设置0.5为步长。
train_step=tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
tf.global_variables_initializer().run() #初始化参数
    那么开始迭代的执行训练操作,我们每次选取100条数据输入到x中,这么做是为了避免一次性使用全部样本造成冗长计算,以及陷入局部最优的麻烦。
for i in range(1000):    batch_xs,batch_ys=mnist.train.next_batch(100)    train_step.run({x:batch_xs,y_:batch_ys})
    训练完毕之后,我们要看看,训练的模型有多少的精确度。tf.argmax(y,1)能够求出各个预测数字中概率最大的那个,tf.arg(y_,1)就是样本的真实数字类别。correct_prediction是返回计算分类是否正确的操作
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
  接下来我们统计全部样本预测的accuracy,这里先用tf.cast将corrrct_prediction输出的bool值转化为float32值,再求平均
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels}))  #使用eval的方法,计算准确率
    到这里,一个简单的softmax regression就完成了,它其实可以算作是一个没有隐含层的神经网络,那么我们可以总结下这两节使用TF的流程。
1,定义算法公式,也就是神经网络forward时的计算2,定义loss,选定优化器,并指定优化器优化loss
3,迭代地对数据进行训练,
4,在测试集或验证集上对准确性进行评测。

上述四个步骤将会贯穿我们学习TensorFlow的始终,我们应该牢记并熟练使用。总得来说softmax regression的准确率能够达到92%,但这不足以执行一些重要的预测任务,之后我们会使用自编码器,多层感知机还有卷积神经网络等方法,提高准确率。那么,加油吧!~
    




原创粉丝点击