MNIST——手写数字识别数据集

MNIST数据集由Yann LeCun搜集,是一个大型的手写体数字数据库,通常用于训练各种图像处理系统,也被广泛用于机器学习领域的训练和测试。MNIST数字文字识别数据集数据量不会太多,而且是单色的图像,较简单,适合深度学习初学者练习建立模型、训练、预测。MNIST数据库中的图像集是NIST(National Institute of Standards and Technology)的两个数据库的组合:专用数据库1和特殊数据库3。数据集是有250人手写数字组成,一半是高中生,一半是美国人口普查局。

MNIST数据集共有训练数据60000项、测试数据10000项。每张图像的大小为28*28(像素),每张图像都为灰度图像,位深度为8(灰度图像是0-255)。

下载读取MNIST数据

  • 手动下载

下载地址:http://yann.lecun.com/exdb/mnist/

MNIST数据集包含4个文件,下载四个压缩文件,解压缩。解压缩后发现这些文件并不是标准的图像格式。这些图像数据都保存在二进制文件中。train文件是训练数据集,t10k是测试数据集,images文件是图像文件,lables文件是对应的标签文件。

train-images-idx3-ubyte.gz: training set images (9912422 bytes)

train-labels-idx1-ubyte.gz: training set labels (28881 bytes)

t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)

t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

  • 使用TensorFlow下载

读取数据

  • 读取单张图像

MNIST的图像大小是28*28,先读取训练集中的第一张图像。注意:在 train-images-idx3-ubyte 文件头部有4个integer类型,需要跳过去。

程序代码

运行结果

  • 读取多张图像

读取100张的t10k的测试图像和标签,并且显示出来。

程序代码

运行结果

在TensorFlow中使用

MNIST数据集在机器学习方面已经被广泛使用,比如说在MNIST上采用Softmax回归训练,在MNIST上使用CNN做可视化训练等。在TensorFlow上MNIST可以直接被调取,只需要导入input_data.py这个文件就可以,不需要对其进行二进制文件转为图像的操作,使用tensorflow.contrib.learn中的read_data_sets来加载数据就可以了。代码如下,

注:这里使用的直接是二进制文件,如果下载的数据集是图像文件,在使用之前还得进行数据预处理(二维图像矩阵转换成一维向量、label数字转换成One-hot向量等)。

问题:使用tensorflow的input_data下载MNIST数据集时,会报错误如下,

Traceback (most recent call last):
  File "alex_mnist.py", line 5, in <module>
    mnist = input_data.read_data_sets("/tmp/data", one_hot=True)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 250, in new_func
    return func(*args, **kwargs)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py", line 260, in read_data_sets
    source_url + TRAIN_IMAGES)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 250, in new_func
    return func(*args, **kwargs)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py", line 252, in maybe_download
    temp_file_name, _ = urlretrieve_with_retry(source_url)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 250, in new_func
    return func(*args, **kwargs)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py", line 205, in wrapped_fn
    return fn(*args, **kwargs)
  File "/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py", line 233, in urlretrieve_with_retry
    return urllib.request.urlretrieve(url, filename)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 248, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/home/cnu105/anaconda3/lib/python3.6/urllib/request.py", line 1321, in do_open
    r = h.getresponse()
  File "/home/cnu105/anaconda3/lib/python3.6/http/client.py", line 1331, in getresponse
    response.begin()
  File "/home/cnu105/anaconda3/lib/python3.6/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/home/cnu105/anaconda3/lib/python3.6/http/client.py", line 258, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/home/cnu105/anaconda3/lib/python3.6/socket.py", line 586, in readinto
    return self._sock.recv_into(b)
  File "/home/cnu105/anaconda3/lib/python3.6/ssl.py", line 1009, in recv_into
    return self.read(nbytes, buffer)
  File "/home/cnu105/anaconda3/lib/python3.6/ssl.py", line 871, in read
    return self._sslobj.read(len, buffer)
  File "/home/cnu105/anaconda3/lib/python3.6/ssl.py", line 631, in read
    v = self._sslobj.read(len, buffer)
ConnectionResetError: [Errno 104] Connection reset by peer

经查,原因是 input_data.read_data_sets访问https://storage.googleapis.com/cvdf-datasets/mnist/被限制,需要修改read_data_sets函数,将source_url设置成http://yann.lecun.com/exdb/mnist/,修改后代码如下,

#/home/cnu105/anaconda3/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py

# CVDF mirror of http://yann.lecun.com/exdb/mnist/
# DEFAULT_SOURCE_URL = 'https://storage.googleapis.com/cvdf-datasets/mnist/'
DEFAULT_SOURCE_URL = 'http://yann.lecun.com/exdb/mnist/'

重新运行,正常。

以上是关于MNIST数据集的介绍,下面是使用MNIST的例子。

TensorFlow实现AlexNet模型进行分类预测MNIST

Keras多层感知器识别手写数字

Keras卷积神经网络识别手写数字

  • 5
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: CNN卷积神经网络可以很好地实现MNIST手写数字识别数据集MNIST数据集是一个非常流行的手写数字识别数据集,包含60,000个训练样本和10,000个测试样本。CNN卷积神经网络可以通过卷积层、池化层和全连接层等结构,对图像进行特征提取和分类,从而实现对手写数字的识别。在实现过程中,需要对数据进行预处理、构建模型、训练模型和评估模型等步骤。 ### 回答2: MNIST是机器学习领域中最基础的图像分类问题之一,目标是将手写数字识别成对应的数字。CNN卷积神经网络由于其较高的效果和较快的速度,被广泛应用于此类问题中。 首先,我们需要明确CNN卷积神经网络的基本结构。它由多个卷积层和池化层组成,其中卷积层用于提取图像中的特征,而池化层则用于降低数据维度,减少运算量。在最后一层全连接层,特征将被映射到数字1-10的输出,以进行分类。 对于MNIST手写数字数据集,我们需要对数据进行预处理和格式化,以适应卷积神经网络的输入。我们可以将每个图片的大小调整为28x28像素,并将其转换为黑白图像。由于图像中的每个像素都代表相应位置的亮度值,我们需要在神经网络中进行标准化和归一化。 接下来,我们可以使用Keras框架搭建一个简单的卷积神经网络。其中,我们可以通过添加卷积层和池化层来实现特征提取和减少数据维度。在第一个卷积层后,我们可以添加一个批标准化层,它可以使每个神经元的输出分布更加均衡,从而提高训练效果。在卷积神经网络的输出端,我们可以添加一个全连接层,用于进行分类。 在完成网络结构的搭建之后,我们需要对卷积神经网络进行训练。我们可以通过设置合适的损失函数和优化算法来实现。针对MNIST数据集,我们可以选择使用交叉熵作为损失函数,随机梯度下降作为优化算法。我们可以通过调整学习率、正则化等参数,来提高训练效果。 最后,我们可以将卷积神经网络应用到MNIST测试集中进行验证,并评估其识别准确率。通过逐步调整网络结构和参数,我们可以不断改进卷积神经网络的性能,并实现更准确的手写数字识别。 ### 回答3: MNIST手写数字识别是计算机视觉领域中一个经典的问题,它要求从图像中识别出手写数字。而CNN卷积神经网络是目前最有效的解决方案之一。 CNN卷积神经网络是一种深度学习模型,通过输入层、卷积层、池化层和全连接层等模块组成。在MNIST手写数字识别中,图片输入层将长度为28*28的二维像素矩阵作为输入,经过卷积层、池化层、全连接层等几个步骤后输出对应的数字。 卷积层的作用是提取图像的特征,由于MNIST手写数字数据集的像素尺寸较小,因此用到的卷积核尺寸也较小。这里我们选取的卷积核为5*5,每个卷积核进行卷积时将每个像素与其周围的8个像素做卷积操作,这样可以从图像中提取更多的特征信息。 池化层的作用是减小图像的尺寸,在卷积层中提取的特征信息可能包含了相同重复或无用的信息,因此需要对其进行降维处理。在MNIST手写数字识别中,我们采取的是平均池化的方式,即将相邻的4个像素取平均值,将这个4*4的图像块变为一个单独的像素。 全连接层的作用是将提取出的特征信息映射到输出层,输出对应的数字。在MNIST手写数字识别中,我们选取两个全连接层,其中第一层的神经元数量为120,第二层的神经元数量为84。最后,输出层的神经元数为10,每个神经元对应一个数字。 在训练模型时,我们采用交叉熵损失函数和随机梯度下降法更新权重。具体来说,我们将训练集分成若干个批次(batch),每次训练只使用其中一个批次的数据并对网络进行反向传播更新权重。 实验结果表明,CNN卷积神经网络能够在MNIST手写数字识别数据集上达到98%以上的识别率,比传统的机器学习方法(如SVM等)具有更高的准确率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值