Lenet-5卷积神经网络结构详解(一)——原理解析
前言
本系列博文将阐释深度学习网络Lenet-5的具体原理,网络结构及其代码实现。本文不适用任何高级框架,只使用numpy从底层实现lenet-5。本系列博文共计3篇,本文是第一篇。系列中代码参考地址:
Click Here.
Yes Right Here
网络综述
Lenet-5 神经网络出自论文 Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。Lenet-5 神经网络一共有 7 层,每层包含不同数量的训练参数。将一批数据输入进神经网络,经过卷积,激活,池化,全连接和Softmax 回归等操作,最终返回一个概率数组,从而达到识别图片的目的。
配置环境
python 3.7.3
numpy 1.16.4
数据集
在我们直视整个网络前,我们先来看一下网络要处理的数据集。
由于网络处理手写字符比较高效,我们选用知名度很高的Minst数据集,下载地址:download minst dataset
上述的下载网址中说明了数据集的构成:60000张手写体数字图片,每张图片的大小为28x28。下载网址中详细说明了压缩文档的构成,我们可以利用这些信息编写函数将数据集下载下来。
下载
我们编写load_data.py实现从网址下载函数的功能。需要的模块有gizp 和 pickle,没有的同学请自行pip。
import gzip
import pickle
import numpy as np
file_name = [
["x_train_set","train-images-idx3-ubyte.gz"],
["x_test_set","t10k-images-idx3-ubyte.gz"],
["y_train_set","train-labels-idx1-ubyte.gz"],
["y_test_set","t10k-labels-idx1-ubyte.gz"]
] # 文件名,下载地址: http://yann.lecun.com/exdb/mnist/
"""
存储数据到dataset_minst.pkl文件夹。
"""
def save_dataset ():
dataset ={
}
for name in file_name[:2]:
with gzip.open(name[1],"rb") as f:
dataset[name[0]] = np.frombuffer(f.read(),np.uint8,offset = 16).reshape(-1,28*28)# 为什么要offset16?因为前16个字符是
for name in file_name[-2: