11.1_.jpg

 逻辑回归是深度学习中的最基础的例子,今天来看一下如何使用TensorFlow写一个简单的逻辑回归算法。


逻辑回归可以看成只具有一层网络的前馈式神经网络,它的公式为Y_predict=logistic(X*W+b),其中X为输入,W为输入与隐含层之间的连接权重,b为隐含层神经元的偏置,而logistic为激活函数,一般为sigmoid或tanh,Y_predict为网络输出。


由于TensorFlow是基于图计算模型的,因此在搭建模型之初,应该构建一张完好的计算图框架。在这里,首先需要定义几个Tensor变量,以及它们之间的关系,假设输入X、权重W、偏置b、网络输出Y_predict都为32位浮点类型,由于W、b的值在程序运行过程中是不断变化的,因此它们需要定义为tf.Variable类型,并且这里使用高斯分布来初始化它们,而X、Y_predict是未知的,因此我们使用占位符去代表它们,即tf.placeholder类型。由于逻辑回归是一种分类模型,需要目标函数来不断优化参数,这里目标函数选择输出Y_predict与正确标签Y之间的L2距离来作为目标函数,然后使用随机梯度下降算法来更新权重和偏置。综上,可以定义如下Tensor变量:


import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt



X = tf.placeholder(tf.float32)

Y = tf.placeholder(tf.float32)



W = tf.Variable(tf.random_normal([1]),name='weight')

b = tf.Variable(tf.random_normal([1]),name='bias')



Y_predict = tf.sigmoid(tf.add(tf.mul(X,W),b))

num_sample = 400

cost = tf.reduce_sum(tf.pow(Y_predict-Y,2.0))/num_sample




接下来,开始训练阶段了,首先需要定义一个学习率,lr初始化为0.001,然后定义一个优化函数,这里我们使用的是最新的Adam优化算法,它的稳定性以及快速收敛性已经被证明优于ReLU。优化的目标是要使得cost达到最小:


lr = 0.01

optimizer = tf.train.AdamOptimizer(lr).minimize(cost)




最后,需要创建一个会话Session,所有的计算操作都是在Session里面完成。同时,所有的参数都要在迭代之前进行初始化,因此需要提前创建一个初始化op,使用tf.initialize_all_variables()进行初始化所有参数,然后设置Epoch总数以及优化目标。并且,我们使用matplotlib库将最后的cost曲线呈现出来。


num_epoch = 500

cost_accum =

cost_prev = 0

xs = np.linspace(-5,5,num_sample)

ys = np.sin(xs)+np.random.normal(0,0.01,num_sample)



with tf.Session() as sess:

    sess.run(tf.initialize_all_variables())

    for epoch in range(num_epoch):

for x,y in zip(xs,ys):

            sess.run(optimizer,feed_dict={X:x,Y:y})

train_cost = sess.run(cost,feed_dict={X:xs,Y:ys})

cost_accum.append(train_cost)

        print 'train_cost is:',str(train_cost)

if np.abs(cost_prev-train_cost) < 1e-6:

   break

cost_prev = train_cost



plt.plot(range(len(cost_accum)),cost_accum,'r')        

plt.title('Logistic Regression Cost Curve')

plt.xlabel('epoch')

plt.ylabel('cost')

plt.show()




这里我们分别对了学习率为0.01、0.001、0.0001的三种不同误差曲线,使用的优化算法是Adam,结果如下:


lr=0.01

11.2_.jpg



lr=0.001

11.3_.jpg



lr=0.0001

11.4_.jpg



根据误差曲线可以分析出,学习率为0.001对于收敛速度或是精确度都是优于学习率为0.01以及0.0001的。
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家