在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 )
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 ] ) )
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 )
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))
#把布尔值转换成浮点数,然后取平均值。例如,
accuracy = tf.reduce_mean ( tf.cast ( correct_prediction, "float" ) )
[True, False, True, True]
会变成 [1,0,1,1]
,取平均值后得到 0.75
.accuracy = tf.reduce_mean ( tf.cast ( correct_prediction, "float" ) )
#添加一个操作来初始化我们创建的变量:
init = tf.global_variables_initializer( )
#在一个
with tf.Session() as sess:
Session
里面启动我们的模型with tf.Session() as sess:
#初始化变量:
sess.run ( init )
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 } )
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 } ) )
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
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%,这个结果并不理想,后面我们会使用含隐层的网络来训练同样的数据,测试结果会有巨大的提升。