当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python利用逻辑回归模型解决MNIST手写数字识别问题详解

    栏目:Linux/apache问题 时间:2020-01-14 20:19

    本文实例讲述了Python利用逻辑回归模型解决MNIST手写数字识别问题。分享给大家供大家参考,具体如下:

    1、MNIST手写识别问题

    MNIST手写数字识别问题:输入黑白的手写阿拉伯数字,通过机器学习判断输入的是几。可以通过TensorFLow下载MNIST手写数据集,通过import引入MNIST数据集并进行读取,会自动从网上下载所需文件。

    %matplotlib inline
    import tensorflow as tf
    import tensorflow.examples.tutorials.mnist.input_data as input_data
    mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)
    import matplotlib.pyplot as plt
     
    def plot_image(image):                #图片显示函数
      plt.imshow(image.reshape(28,28),cmap='binary')
      plt.show()
     
    print("训练集数量:",mnist.train.num_examples,
       "特征值组成:",mnist.train.images.shape,
       "标签组成:",mnist.train.labels.shape)
     
    batch_images,batch_labels=mnist.train.next_batch(batch_size=10)  #批量读取数据
    print(batch_images.shape,batch_labels.shape)
     
    print('标签值:',np.argmax(mnist.train.labels[1000]),end=' ')  #np.argmax()得到实际值
    print('独热编码表示:',mnist.train.labels[1000])
    plot_image(mnist.train.images[1000])         #显示数据集中第1000张图片

    输出训练集 的数量有55000个,并打印特征值的shape为(55000,784),其中784代表每张图片由28*28个像素点组成,由于是黑白图片,每个像素点只有黑白单通道,即通过784个数可以描述一张图片的特征值。可以将图片在Jupyter中输出,将784个特征值reshape为28×28的二维数组,传给plt.imshow()函数,之后再通过show()输出。

    MNIST提供next_batch()方法用于批量读取数据集,例如上面批量读取10个对应的images与labels数据并分别返回。该方法会按顺序一直往后读取,直到结束后会自动打乱数据,重新继续读取。

    在打开mnist数据集时,第二个参数设置one_hot,表示采用独热编码方式打开。独热编码是一种稀疏向量,其中一个元素为1,其他元素均为0,常用于表示有限个可能的组合情况。例如数字6的独热编码为第7个分量为1,其他为0的数组。可以通过np.argmax()函数返回数组最大值的下标,即独热编码表示的实际数字。通过独热编码可以将离散特征的某个取值对应欧氏空间的某个点,有利于机器学习中特征之间的距离计算

    数据集的划分,一种划分为训练集用于模型的训练,测试集用于结果的测试,要求集合数量足够大,而且具有代表性。但是在多次执行后,会导致模型向测试集数据进行拟合,从而导致测试集数据失去了测试的效果。因此将数据集进一步划分为训练集、验证集、测试集,将训练后的模型用验证集验证,当多次迭代结束之后再拿测试集去测试。MNIST数据集中的训练集为mnist.train,验证集为mnist.validation,测试集为mnist.test

    2、逻辑回归

    与线性回归相对比,房价预测是根据多个输入参数x与对应权重w相乘再加上b得到线性的输出房价。而还有许多问题的输出是非线性的、控制在[0,1]之间的,比如判断邮件是否为垃圾邮件,手写数字为0~9等,逻辑回归就是用于处理此类问题。例如电子邮件分类器输出0.8,表示该邮件为垃圾邮件的概率是0.8.

    逻辑回归通过Sigmoid函数保证输出的值在[0,1]之间,该函数可以将全体实数映射到[0,1],从而将线性的输出转换为[0,1]的数。其定义与图像如下: