TensorFlow学习笔记(一):手写数字识别之softmax回归

来源:互联网 发布:美亚万国游踪 知乎 编辑:程序博客网 时间:2024/05/16 01:01

在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%,这个结果并不理想,后面我们会使用含隐层的网络来训练同样的数据,测试结果会有巨大的提升
1 0
原创粉丝点击