云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

从0到1:神经网络实现图像识别(数据集)

jxf315 2024-12-09 14:03:33 教程文章 44 ℃

纸上得来终觉浅,绝知此事要躬行。

“神经网络”是“机器学习”的利器之一,常用算法在TensorFlow、MXNet计算框架上,有很好的支持。

为了更好的理解与使用这件利器,我们可以不借助计算框架,从零开始,一步步构建模型,实现学习算法,并在一个图像识别数据集上,训练这个模型,再验证模型预测的准确率。


MNIST数据集

能正确的提出问题,你已经解决了问题的一半。

这里“正确的问题”是MNIST,一个手写数字图片集数据的识别问题。

你可以在 Yann LeCun的官网下载这套数据集,共四个文件包:

train-images-idx3-ubyte.gz: 训练图片集 (9912422 bytes)
train-labels-idx1-ubyte.gz: 训练图片集的正确标签 (28881 bytes)
t10k-images-idx3-ubyte.gz: 测试图片 (1648877 bytes)
t10k-labels-idx1-ubyte.gz: 测试图片的正确标签 (4542 bytes)

每张图片包含一个手写数字。


数据集包含6万张图片用于训练,1万张用于测试验证。


图像数据格式和图向量

每张图片表达了[0,9]这是10个数字中的一个,有28X28=784个像素,每个像素根据灰度取整数值[0,255];把每张图片看作具有784个特征的图向量,问题就变成:根据D个特征维度,对图像做K分类的问题,这里D=784,K=10。


MNIST文件格式

图片images文件,前16个字节,是文件格式和图片数量、规格的描述;图片的像素信息从第17个字节开始。

[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number 0004 32 bit integer 60000 number of images 0008 32 bit integer 28 number of rows 0012 32 bit integer 28 number of columns 0016 unsigned byte 0 pixel 0017 unsigned byte 0 pixel ........ xxxx unsigned byte ?? pixel


同样,标签labels文件里,前8个字节,是文件格式和标签数量的描述;而表述正确分类的标签信息,从第9个字节开始。

[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number 0004 32 bit integer 60000 number of items 0008 unsigned byte 7 label 0009 unsigned byte 2 label ........ xxxx unsigned byte ?? label

理解了文件格式,就可以很容易地读取MNIST数据。


读取MNIST数据

用到structosnumpy三个库。

 import struct
 import os
 import numpy as np

定义你下载和解压缩MNIST数据的目录your_download_unpack_MNIST_DATA_path

 path=your_download_unpack_MNIST_DATA_path
 kind=train
 images_path = os.path.join(path,'%s-images.idx3-ubyte' % kind)
 labels_path = os.path.join(path,'%s-labels.idx1-ubyte' % kind)

加载从第17个字节开始的图片像素数据到images,再把每张28*28像素的图片都拉直(reshape)为784*1的图向量。

  with open(images_path,'rb') as imagefile:   
      magic, num, rows, cols = struct.unpack('>IIII',imagefile.read(16))
      images = np.fromfile(imagefile,dtype=np.uint8).reshape(len(labels),784) 

从第9个字节开始,加载正确标签信息到labels

 with open(labels_path,'rb') as labelfile:
   magic, n = struct.unpack('>II',labelfile.read(8))
   labels = np.fromfile(labelfile,dtype=np.uint8)

我们就得到了训练数据集的图向量矩阵images和正确答案数组labels,可以用同样的方法加载验证用图片images_v和正确答案labels_v

下一次,从0开始,建立一个神经网络的原型-感知机模型,来对准备好的MNIST数据做训练和分类预测。

(完)

索引

从0到1:神经网络实现图像识别

1.目标问题:MNIST手写数字识别数据集

无双谱:从0到1:神经网络实现图像识别45 赞同 · 0 评论文章

2.缘起:感知机模型

无双谱:从0到1:神经网络实现图像识别(二)21 赞同 · 1 评论文章

3.第一个神经网络:从二分类到多分类

无双谱:从0到1:神经网络实现图像识别(三)22 赞同 · 0 评论文章

4.更好的神经网络-加入隐藏层

无双谱:从0到1:神经网络实现图像识别(四)53 赞同 · 2 评论文章

5.卷积神经网络:卷积与池化

无双谱:从0到1:神经网络实现图像识别(五)39 赞同 · 8 评论文章

6.知行合一:优化提速实现

无双谱:从0到1:神经网络实现图像识别(实现篇)79 赞同 · 9 评论文章

#神经网络##今日头条小助手##人工智能#

Tags:

最近发表
标签列表