引言
本人最近开始学习深度学习,被各种强大的编程框架,诸如TensorFlow,弄得很迷糊。原因就在于编程框架的功能太强了,复杂的算法往往只需要只言片语就可以实现。但是这种实现令我感到有点不踏实。各种算法对于我而言就像是黑盒一般。本着对知识刨根问底儿的精神,我决定使用Python中较为基础的NumPy来实现神经网络。
本文适合跟我一样初学深度学习,甚至初学Python,又想把一些算法具体如何实现弄明白的同学。
本文目录
- 1、下载Mnist数据
- 2、读取数据
1、下载Mnist数据
(1)下载地址
Mnist数据集可以从http://yann.lecun.com/exdb/mnist/下载
点开链接后一共有四个压缩文件可供下载
- train-images-idx3-ubyte.gz – 训练集的图像数据
- train-labels-idx1-ubyte.gz – 训练集的标签
- t10k-images-idex3-ubyte.gz – 测试集的图像数据
- t10k-labels-idex1-ubyte.gz – 测试集的标签
(2)Mnist数据介绍
Mnist数据由两部分组成:图像数据(28*28像素,256级灰度,灰度图像)和标签(8位无符号整型,数字0-9)
2、读取数据
(1)解压文件
为了方便读取数据,现将四个文件分别解压
(2)读取数据
写了两个函数,分别读取图像数据和标签数据
"""
read_data.py
读取图像和标签数据
"""
import numpy as np
import struct
def read_image(filename):
"""
读取图像数据
参数:
filename -- 图像数据文件的名字
返回:
image_data -- 图像数据
"""
f = open(filename, 'rb')
#建立一个指针和缓存区
index = 0
buf = f.read()
f.close()
#'>IIII'表示用大端模式读数据
magic, images, rows, columns = struct.unpack_from('>IIII' , buf , index)
index += struct.calcsize('>IIII')
#建立一个零阵作缓存
image_data = np.zeros((rows*columns, images), dtype = np.float32)
for i in range(images):
for x in range(rows):
for y in range(columns):
#'>B'代表灰度图像
image_data[x * columns + y][i]= struct.unpack_from('>B', buf, index)[0]
index += struct.calcsize('>B')
return image_data
def read_label(filename):
"""
读取标签
参数:
filename -- 标签文件的文件名
返回:
label_data -- 标签数据
"""
f = open(filename, 'rb')
index = 0
buf = f.read()
f.close()
magic, labels = struct.unpack_from('>II' , buf , index)
index += struct.calcsize('>II')
label_data = np.zeros((1, labels), dtype = np.uint8)
for x in range(labels):
label_data[0][x] = int(struct.unpack_from('>B', buf, index)[0])
index += struct.calcsize('>B')
return label_data
以上就是读取数据的代码。读取的数据以矩阵的形式返回。之后的处理都是以此为基础的。