本节使用MNIST数据集作为输入数据。
根据MNIST数据集的特性:
每张图片为28*28,其中大约有60000个手写字体训练样本。因为是对数字的识别,所以输出的范围为0~9。这就类似于一个10分类的问题。
##构建神经网络
输入层需要28*28个节点,输出成需要10个节点。对于隐藏层的层数以及节点数的判定是一个技术活。不过对于全连接网络来说,一般隐藏层不要超过三层,当然如果层数越多,计算的难度肯定是越大。本次只设定一个隐藏层。
而隐藏层的节点数目的确定,有几个公式:
当然也没有特定的确定方式,一般就是哪个效果好使用哪个。
本次隐藏层节点定为:300
所以网络结构为:
Tables | Cool |
---|---|
输入层 | 784 |
隐藏层 | 300 |
输出层 | 10 |
接着只需要将MNIST的训练数据按照节点一个个数据就可以了。
废话不多说 看代码。
代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import struct
from bp import *
from datetime import datetime
import matplotlib.pyplot as plt
# 数据加载器基类
class Loader(object):
def __init__(self, path, count):
'''
初始化加载器
path: 数据文件路径
count: 文件中的样本个数
'''
self.path = path
self.count = count
def get_file_content(self):
'''
读取文件内容
'''
f = open(self.path, 'rb')
content = f.read()
f.close()
return content
def to_int(self, byte):
'''
将unsigned byte字符转换为整数
'''
return struct.unpack('B', byte)[0]
# 图像数据加载器
class ImageLoader(Loader):
def get_picture(self, content, index):
'''
内部函数,从文件中获取图像
'''
##从偏移量位置开始读取有效数据
start = index * 28 * 28 + 16
picture = []
for i in range(28):
picture.append([])
for j in range(28):
picture[i].append(
self.to_int(content[start + i * 28 + j]))
#picture 结构 二位数组 28*28
return picture
def get_one_sample(self, picture):
'''
内部函数,将图像转化为样本的输入向量
'''
sample = []
for i in range(28):
for j in range(28):
sample.append(picture[i][j])