近来翻看经典网络补基础知识,写下这篇博客,本实验的源码是基于Tensorflow框架来写的,采用GPU完成训练,找本实验代码的小伙伴可以去这里下载,实验的数据是转化为png格式的MNIST数据集,小伙伴们可以从这里下载到。笔者不才,不正之处,欢迎斧正。^o^
基于梯度的学习算法可用于合成复杂的决策表面,该表面可以对诸如手写字符之类的高维模式进行分类,并且具有最少的预处理。相较于很多传统的用于进行MNIST数据识别的算法,卷积神经网络在处理多变的2D形状上呈现出了较好的效果。
虽然LeNet是一个小的网络,但却包含了卷积神经网络的基本模块:卷积层、池化层、全连接层。LeNet-5共有7层 ,每层都包含着可训练的参数,每层都有着如图片标注数目的feature map,其中,每个feature map通过一种卷积滤波器提取对应的一种特征。
一、输入层的数据处理
输入图像的尺寸统一归一化为32×32(原始的MNIST中图像的大小是28×28的)。这里的实验数据是.png形式的图片,可以从这里下载。首先加载训练样本和测试样本,在这里还进行了打乱数据的预处理操作。
# 加载数据
train_path = "./mnist/train/"
test_path = "./mnist/test/"
# 读取图片及其标签
def read_image(path):
label_dir = [path+x for x in os.listdir(path) if os.path.isdir(path+x)]
images = []
labels = []
for index,folder in enumerate(label_dir):
for img in glob.glob(folder+'/*.png'):
print("reading the image:%s"%img)
image = io.imread(img)
image = transform.resize(image,(w,h,c))
images.append(image)
labels.append(index)
return np.asarray(images,dtype=np.float32),np.asarray(labels,dtype=np.int32)
train_data,train_label = read_image(train_path) # 训练样本
test_data,test_label = read_image(test_path) # 测试样本
# 打乱训练数据及测试数据
train_image_num = len(train_data)
train_image_index = np.arange(train_image_num)
np.random.shuffle(train_image_index) # 乱序排序
train_data = train_data[train_image_index]
train_label = train_label[train_image_index]
test_image_num = len(t