前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门数据集--3.手写数字识别

机器学习入门数据集--3.手写数字识别

作者头像
birdskyws
发布2019-03-04 10:30:36
1.1K0
发布2019-03-04 10:30:36
举报
文章被收录于专栏:一英里广度一英寸深度的学习

MNIST

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员。测试集(test set) 也是同样比例的手写数字数据。

手写数字样式

  • 原文出处MINST 官网非常“质朴”。

官网截图

数据格式

在数据集中,每张图片的大小是28*28,存储时1*784的向量保存。 打印数据,查看原始信息:

代码

代码语言:javascript
复制
import numpy
import gzip
# Params for MNIST
IMAGE_SIZE = 28
NUM_CHANNELS = 1
PIXEL_DEPTH = 255
NUM_LABELS = 10
# Extract the images
def extract_data(filename, num_images):
    """Extract the images into a 4D tensor [image index, y, x, channels].
    Values are rescaled from [0, 255] down to [-0.5, 0.5].
    """
    print('Extracting', filename)
    with gzip.open(filename) as bytestream:
        bytestream.read(16)
        buf = bytestream.read(IMAGE_SIZE * IMAGE_SIZE * num_images * NUM_CHANNELS)
        data = numpy.frombuffer(buf, dtype=numpy.uint8).astype(numpy.float32)
        data = (data - (PIXEL_DEPTH / 2.0)) / PIXEL_DEPTH
        data = data.reshape(num_images, IMAGE_SIZE, IMAGE_SIZE, NUM_CHANNELS)
        data = numpy.reshape(data, [num_images, -1])
        return data
def extract_labels(filename, num_images):
    """Extract the labels into a vector of int64 label IDs."""
    print('Extracting', filename)
    with gzip.open(filename) as bytestream:
        bytestream.read(8)
        buf = bytestream.read(1 * num_images)
        labels = numpy.frombuffer(buf, dtype=numpy.uint8).astype(numpy.int64)
        # num_labels_data = len(labels)
        # one_hot_encoding = numpy.zeros((num_labels_data,NUM_LABELS))
        # one_hot_encoding[numpy.arange(num_labels_data),labels] = 1
        # one_hot_encoding = numpy.reshape(one_hot_encoding, [-1, NUM_LABELS])
        # sklearn的logisticsRegression 标签不用one-hot编码
        return labels
path= '/Users/wangsen/ai/03/4day_tensorflow/data'
train_data = extract_data(path+'/train-images-idx3-ubyte.gz', 60000)
train_labels = extract_labels(path+'/train-labels-idx1-ubyte.gz', 60000)
test_data = extract_data(path+'/t10k-images-idx3-ubyte.gz', 10000)
test_labels = extract_labels(path+'/t10k-labels-idx1-ubyte.gz', 10000)

print(train_data.shape)
print(train_labels.shape)

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_data,train_labels)
score = lr.score(test_data,test_labels) 
print("sklearn logisticRegression score:",score)

结果:

代码语言:javascript
复制
(60000, 784)
(60000,)
sklearn logisticRegression score: 0.9194

代码分析

上例子中,把784个像素作为特征,标签是数字,进行逻辑回归。score是准确率,最终的结果在测试集上达到90%以上的准确率。 这段程序时间较长,10分钟以上。

降维

由于原图维度过大784,导致训练时间较长。可以通过降维算法,将数据压缩到较小的维度,再进行训练,可以调高训练速度。

代码语言:javascript
复制
from sklearn.decomposition import PCA
pca =  PCA(60)
train_data= pca.fit_transform(train_data)
print('降维后训练集的维度',train_data.shape)

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_data,train_labels)

test_data = pca.transform(test_data)
score = lr.score(test_data,test_labels) 
print("sklearn logisticRegression score:",score)

结果:

代码语言:javascript
复制
降维后训练集的维度 (60000, 60)
sklearn logisticRegression score: 0.9088

总结

MNIST手写数据集可以作为机器学习入门练手数据。在官网原文中,包含了机器学习和深度学习最终处理的结果,最低误差为0.35%。 本文用最简单的逻辑回归模型,从官网数据上看,取得最好评分模型的的还是卷积神经网络。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.02.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MNIST
  • 数据格式
  • 代码
  • 代码分析
  • 降维
  • 总结
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,助力维护团队卓越代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档