深度学习之BP神经网络识别手写数字(五)

本文介绍了使用BP神经网络对MNIST数据集进行手写数字识别的过程。通过设置输入层(28*28节点)、隐藏层(300节点)和输出层(10节点)构建网络结构,并分享了代码实现和初步的运行结果。尽管训练过程较慢,但这是一个深度学习的实用示例。
摘要由CSDN通过智能技术生成

本节使用MNIST数据集作为输入数据。

根据MNIST数据集的特性:
每张图片为28*28,其中大约有60000个手写字体训练样本。因为是对数字的识别,所以输出的范围为0~9。这就类似于一个10分类的问题。

##构建神经网络
输入层需要28*28个节点,输出成需要10个节点。对于隐藏层的层数以及节点数的判定是一个技术活。不过对于全连接网络来说,一般隐藏层不要超过三层,当然如果层数越多,计算的难度肯定是越大。本次只设定一个隐藏层。
而隐藏层的节点数目的确定,有几个公式:
image.png
当然也没有特定的确定方式,一般就是哪个效果好使用哪个。
本次隐藏层节点定为:300
所以网络结构为:

Tables Cool
输入层 784
隐藏层 300
输出层 10

接着只需要将MNIST的训练数据按照节点一个个数据就可以了。

废话不多说 看代码。

代码

getImage.py

#!/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])
        
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值