BP算法 python实现

0-9数字识别,NMIST数据的识别。

具体代码包括NMIST见附件中。

参考资料是TOM的机器学习BP那一章。

# coding:utf-8
# 没考虑大小端
import struct
import numpy

def loadImages(filename):
    try:
        f = open(filename,‘rb‘)
    except Exception as instance:
        print type(instance)
        exit()

    allImage = []
    bins = f.read()
    index = 0
    magicNum,imageNum,rowNum,colNum = struct.unpack_from(‘>IIII‘,bins,index)
    index = index + struct.calcsize(‘>IIII‘)

    assert 2051 == magicNum,‘dataset damaged | little endian‘

    for ct in xrange(imageNum):
        allImage.append(struct.unpack_from(‘>784B‘,bins,index))
        index = index + struct.calcsize(‘>784B‘)

    return numpy.array(allImage,dtype=‘float32‘)

def loadLabels(filename):
    try:
        f = open(filename,‘rb‘)
    except Exception as instance:
        print type(instance)
        exit()

    allLabels = []
    bins = f.read()
    index = 0
    magicNum,labelNum = struct.unpack_from(‘>II‘,bins,index)
    index = index + struct.calcsize(‘>II‘)

    assert 2049 == magicNum,‘dataset damaged | little endian‘

    for ct in xrange(labelNum):
        allLabels.append(struct.unpack_from(‘B‘,bins,index))
        index = index + struct.calcsize(‘B‘)
    return numpy.array(allLabels,dtype=‘float32‘)

if ‘__main__‘ == __name__:
    images = loadImages(‘t10k-images.idx3-ubyte‘)
    labels = loadLabels(‘t10k-labels.idx1-ubyte‘)
    import matplotlib.pyplot as plt
    for x in range(3):
        plt.figure()
        shown = images[x].reshape(28,28)
        # shown 28*28 numpy matrix
        plt.imshow(shown,cmap=‘gray‘)
        plt.title(str(labels[x]))
        plt.show()

读取NMIST

# -*- coding: utf-8 -*-
import dataLoad
import numpy as np
import sys
import warnings

def bp(trainSet,eta=0.01,nin=None,nhid=None,nout=None,iterNum = 10):
    ‘‘‘[(instance,label),((784,1)array,(10,1)array)……]‘‘‘
    Wkh = (np.random.rand(nout,nhid)-0.5) / 10.0
    Whi = (np.random.rand(nhid,nin )-0.5) / 10.0
    iteration = 0
    er = 1
    ‘‘‘iteration‘‘‘
    while iteration < iterNum and er > 0.04:
        print ‘iteration=‘,iteration
        er = testAnn((Whi,Wkh))
        iteration += 1
        for (x,label) in trainSet:
            # 最大最小归一化
            x = (x - x.min())/x.max()-x.min()
            #前向
            neth = np.dot(Whi,x) # nhid*nin nin*1 -> nhid*1
            oh = sigmoid(neth)   # nhid*1
            netk = np.dot(Wkh,oh) #nout*nhid nhid*1 -> nout*1
            ok = sigmoid(netk) # nout*1
            #求误差
            dk = ok*(1-ok)*(label-ok)
            dh = oh*(1-oh)*np.dot(Wkh.T,dk) #(nhid,1) = (nout,nhid).T * (nout,1)
            #更新权值矩阵
            Wkh = Wkh + eta * np.dot(dk,oh.T)  #nout*nhid + nout*1*1*hid
            Whi = Whi + eta * np.dot(dh,x.T)  #nhid*nin + nhid*1*1*nin
    print ‘iteration over‘
    return Wkh,Whi

def testAnn(model):
    err = 0
    for i in range(len(testLabels)):
        res = fit(model,testImages[i].reshape(784,1))
        if i > 9990:
            print ‘\t ‘,int(testLabels[i][0]),‘was recognized as‘,res[1]
        if testLabels[i][0] != res[1]:
            err += 1
    errorRate = float(err)/float(len(testLabels))
    print ‘error rate‘,errorRate,‘\n‘
    return errorRate

def fit(model,Image):
    Whi,Wkh = model
    ok = list(sigmoid(sigmoid(Image.T.dot(Whi.T)).dot(Wkh.T))[0])
    return ok,ok.index(max(ok))

def sigmoid(y):
    # 讨厌的溢出警告
    warnings.filterwarnings("ignore")
    return 1/(1+np.exp(-y))    

if ‘__main__‘ == __name__:
    np.random.seed(207)
    trainImages = dataLoad.loadImages(‘train-images.idx3-ubyte‘)
    trainLabels = dataLoad.loadLabels(‘train-labels.idx1-ubyte‘)
    testImages = dataLoad.loadImages(‘t10k-images.idx3-ubyte‘)
    testLabels = dataLoad.loadLabels(‘t10k-labels.idx1-ubyte‘)
    dataSet = []
    for i in range(len(trainLabels)):
        tmp = np.zeros((10,1),dtype=‘float32‘)
        tmp[int(trainLabels[i]),0] = 1
        dataSet.append((trainImages[i].reshape(784,1),tmp))
    bp(trainSet=dataSet,eta=0.05,nin=784,nhid=20,nout=10,iterNum=20)
  
时间: 2024-10-18 09:35:37

BP算法 python实现的相关文章

神经网络和BP算法C及python代码

以上仅给出了代码.具体BP实现原理及神经网络相关知识请见:神经网络和反向传播算法推导 首先是前向传播的计算: 输入: 首先为正整数 n.m.p.t,分别代表特征个数.训练样本个数.隐藏层神经元个数.输出 层神经元个数.其中(1<n<=100,1<m<=1000, 1<p<=100, 1<t<=10). 随后为 m 行,每行有 n+1 个整数.每行代表一个样本中的 n 个特征值 (x 1 , x 2 ,..., x n ) 与样本的 实际观测结果 y.特征值的

BP算法从原理到python实现

BP算法从原理到实践 反向传播算法Backpropagation的python实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 博主接触深度学习已经一段时间,近期在与别人进行讨论时,发现自己对于反向传播算法理解的并不是十分的透彻,现在想通过这篇博文缕清一下思路.自身才疏学浅欢迎各位批评指正. 参考文献 李宏毅深度学习视频 The original location of the code 关于反向传播算法的用途在此不再赘述,这篇博文主要是理解形象化理解反向传播算法与python进行实

BP算法推导python实现

def sigmoid(inX):   return 1.0/(1+exp(-inX)) '''标准bp算法每次更新都只针对单个样例,参数更新得很频繁sdataSet 训练数据集labels 训练数据集对应的标签标签采用one-hot编码(一位有效编码),例如类别0对应标签为[1,0],类别1对应标签为[0,1]alpha 学习率num 隐层数,默认为1层eachCount 每一层隐层的神经元数目repeat 最大迭代次数算法终止条件:达到最大迭代次数或者相邻一百次迭代的累计误差的差值不超过0.

今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)

转载请注明出处:Bin的专栏,http://blog.csdn.net/xbinworld 这一篇是整个第五章的精华了,会重点介绍一下Neural Networks的训练方法--反向传播算法(backpropagation,BP),这个算法提出到现在近30年时间都没什么变化,可谓极其经典.也是deep learning的基石之一.还是老样子,下文基本是阅读笔记(句子翻译+自己理解),把书里的内容梳理一遍,也不为什么目的,记下来以后自己可以翻阅用. 5.2 Network Training 我们可

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【机器学习算法-python实现】矩阵去噪以及归一化

1.背景 项目需要,打算用python实现矩阵的去噪和归一化.用numpy这些数学库没有找到很理想的函数,所以一怒之下自己用标准库写了一个去噪和归一化的算法,效率有点低,不过还能用,大家如果有需要可以拿去. (1)去噪算法:根据概率论的知识,如果一组数据服从正态分布,我们设均值是n,方差是v,那么对于每个离散数值有百分之九十二以上的概率会在(n-3*v,n+3*v)的区间内.所以这里的去噪功能主要是实现如果超出了区间就将这个值标记为区间所能容忍最大值. (2)归一化:找到输入队列最大值max,最

【机器学习算法-python实现】协同过滤(cf)的三种方法实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 协同过滤(collaborative filtering)是推荐系统常用的一种方法.cf的主要思想就是找出物品相似度高的归为一类进行推荐.cf又分为icf和ucf.icf指的是item collaborative filtering,是将商品进行分析推荐.同理ucf的u指的是user,他是找出知趣相似的人,进行推荐.通常来讲icf的准确率可能会高一些,通过这次参加天猫大数据比赛,我觉得只有在数据量非

BP算法

1986年Rumelhart和McCelland在<并行分布式处理>中提出了BP算法,即非线性连续变换函数的多层感知器网络误差反向传播算法. 该算法的思想是:学习过程分为信号的正向传播与误差的反向传播两个过程. 正向传播时,输入样本从输入层传入,经各隐含层逐层处理后传向输出层,若输出层的实际输出与期望输出不符,则转入误差反向传播阶段. 误差反传是将输出误差以某种形式通过隐含层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层的误差信号,此信号即作为修正各单元权值的依据. 上述两个过程

误差逆传播(error BackPropagation, BP)算法推导及向量化表示

1.前言 看完讲卷积神经网络基础讲得非常好的cs231后总感觉不过瘾,主要原因在于虽然知道了卷积神经网络的计算过程和基本结构,但还是无法透彻理解卷积神经网络的学习过程.于是找来了进阶的教材Notes on Convolutional Neural Networks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行更新的公式推导,通过向量化表示它只用了5个式子就完成了对连接权值更新公式的描述,因此我第一眼看过去对每个向量的内部结构根本不清楚.原因还估计是自己当初