网站首页 > 教程文章 正文
纸上得来终觉浅,绝知此事要躬行。
“神经网络”是“机器学习”的利器之一,常用算法在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数据
用到struct、os和numpy三个库。
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 评论文章
猜你喜欢
- 2024-12-09 使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
- 2024-12-09 安卓好用不火的“文件管理器”应用
- 2024-12-09 用Python写了一个上课点名系统(附源码)(自制考勤系统)
- 2024-12-09 教AI做件简单的事:从零开始构建首个神经网络
- 2024-12-09 话说荆和棘
- 2024-12-09 基于 MNN 在个人设备上流畅运行大语言模型
- 2024-12-09 想学习人工智能,这个的数据集必须掌握,MNIST入门与实战
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)