在Tensorflow中实现逻辑回归的步骤:
一般来讲,使用Tensorflow实现机器学习算法模型的步骤如下:
1、定义算法公式; 2、定义loss函数,选择优化器优化loss; 3、使用输入训练集数据进行迭代训练; 4、在验证集或测试集上评估模型的准确率。接下来一步一步的实现
#导入Tensorflow及MNIST数据集: import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets ( "MNIST_data/", one_hot = True )
#定义符号变量 x (数据)和 y_(标签) x = tf.placeholder ( tf.float32,[ None,784 ] ) y_ = tf.placeholder ( tf.float32, [ None,10 ] )
其中:x是一个占位符,我们在TensorFlow实际运行计算时再输入这个值。参数[ None,784 ]中的 None 表示我们接受输入任意数量的图像,784 表示每一张图展开成 784 维的向量。
#定义变量 w 和 b w = tf.Variable ( tf.zeros ( [ 784, 10 ] ) )
b = tf.Variable ( tf.zeros ( [ 10 ] ) )
其中:一个变量代表一个可修改的张量,它们可以用于计算输入值,也可以在计算中被修改。
#实现 softmax 模型 y = tf.nn.softmax ( tf.matmul ( x, w ) + b )
#计算交叉熵loss,并使用梯度下降算法优化loss
cross_entropy = tf.reduce_mean ( -tf.reduce_sum ( y_ * tf.log ( y ) , 1 ) )
train_step = tf.train.GradientDescentOptimizer ( 0.01 ) .minimize ( cross_entropy )
#找出那些预测正确的标签,返回给我们一组布尔值 correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) #把布尔值转换成浮点数,然后取平均值。例如,[True, False, True, True]
会变成[1,0,1,1]
,取平均值后得到0.75
.
accuracy = tf.reduce_mean ( tf.cast ( correct_prediction, "float" ) )
#添加一个操作来初始化我们创建的变量:
init = tf.global_variables_initializer( ) #在一个Session
里面启动我们的模型
with tf.Session() as sess: #初始化变量:
sess.run ( init ) #开始训练模型,这里我们让模型循环训练 20000 次,在循环的每个步骤中,我们都会随机抓取训练数据中的 100 个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step
for i in range ( 20000 ) :
batch_xs, batch_ys = mnist.train.next_batch ( 100 )
result = sess.run ( [ accuracy, train_step ], feed_dict = { x : batch_xs, y_ : batch_ys } )
#计算模型在测试数据集上面的正确率。
print ( "accuracy:" , sess.run ( accuracy, feed_dict = { x : mnist.test.images, y_ : mnist.test.labels } ) )
在我的电脑上,准确率是 91.71% ,结果如下:
==================== RESTART: D:\Python_code\ML\mnist.py ====================
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
accuracy: 0.9171
>>>
在这里,我们训练了28 × 28 =784 像素的灰度数字图像(MNIST数据集)。将它们进行分类,使用了最简单的方法也就是使用 784 个像素作为单层神经网络的输入。然后通过非线性激活函数(softmax 函数)来反馈结果,得到的最后结果是 91.71%,这个结果并不理想,后面我们会使用含隐层的网络来训练同样的数据,测试结果会有巨大的提升。