python构建深度神经网络(DNN)

2023-11-08

本文学习Neural Networks and Deep Learning 在线免费书籍(http://neuralnetworksanddeeplearning.com/index.html),用python构建神经网络识别手写体的一个总结。


代码主要包括两三部分:

1) 数据调用和预处理

2) 神经网络类构建和方法建立

3) 代码测试文件


1)  数据调用:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017-03-12 15:11
# @Author  : CC
# @File    : net_load_data.py
# @Software: PyCharm Community Edition

from numpy import *
import numpy as np
import cPickle
def load_data():
    """载入解压后的数据,并读取"""
    with open('data/mnist_pkl/mnist.pkl','rb') as f:
        try:
            train_data,validation_data,test_data = cPickle.load(f)
            print " the file open sucessfully"
            # print train_data[0].shape  #(50000,784)
            # print train_data[1].shape   #(50000,)
            return (train_data,validation_data,test_data)
        except EOFError:
            print 'the file open error'
            return None

def data_transform():
    """将数据转化为计算格式"""
    t_d,va_d,te_d = load_data()
    # print t_d[0].shape  # (50000,784)
    # print te_d[0].shape  # (10000,784)
    # print va_d[0].shape  # (10000,784)
    # n1 = [np.reshape(x,784,1) for x in t_d[0]] # 将5万个数据分别逐个取出化成(784,1),逐个排列
    n = [np.reshape(x, (784, 1)) for x in t_d[0]]  # 将5万个数据分别逐个取出化成(784,1),逐个排列
    # print 'n1',n1[0].shape
    # print 'n',n[0].shape
    m = [vectors(y) for y in t_d[1]] # 将5万标签(50000,1)化为(10,50000)
    train_data = zip(n,m)  # 将数据与标签打包成元组形式
    n = [np.reshape(x, (784, 1)) for x in va_d[0]]  # 将5万个数据分别逐个取出化成(784,1),排列
    validation_data = zip(n,va_d[1])   # 没有将标签数据矢量化
    n = [np.reshape(x, (784, 1)) for x in te_d[0]]  # 将5万个数据分别逐个取出化成(784,1),排列
    test_data = zip(n, te_d[1])  # 没有将标签数据矢量化
    # print train_data[0][0].shape  #(784,)
    # print "len(train_data[0])",len(train_data[0]) #2
    # print "len(train_data[100])",len(train_data[100]) #2
    # print "len(train_data[0][0])", len(train_data[0][0]) #784
    # print "train_data[0][0].shape", train_data[0][0].shape #(784,1)
    # print "len(train_data)", len(train_data)  #50000
    # print train_data[0][1].shape  #(10,1)
    # print test_data[0][1] # 7
    return (train_data,validation_data,test_data)
def vectors(y):
    """赋予标签"""
    label = np.zeros((10,1))
    label[y] = 1.0 #浮点计算
    return label


2)网络构建

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017-03-12 16:07
# @Author  : CC
# @File    : net_network.py

import numpy as np
import random
class Network(object):   #默认为基类?用于继承:print isinstance(network,object)
    def __init__(self,sizes):
        self.num_layers = len(sizes)
        self.sizes = sizes
        # print 'num_layers', self.num_layers
        self.weight = [np.random.randn(a1, a2) for (a1, a2) in zip(sizes[1:], sizes[:-1])] #产生一个个数组
        self.bias = [np.random.randn(a3,1) for a3 in sizes[1:]]
        # print self.weight[0].shape  #(20,10)

    def SGD(self,train_data,min_batch_size,epoches,eta,test_data=False):
        """ 1) 打乱样本,将训练数据划分成小批次
            2)计算出反向传播梯度
            3) 获得权重更新"""
        if test_data: n_test = len(test_data)
        n = len(train_data)   #50000
        random.shuffle(train_data)  # 打乱
        min_batches = [train_data[k:k+min_batch_size] for k in xrange(0,n,min_batch_size)] #提取批次数据
        for k in xrange(0,epoches):   #利用更新后的权值继续更新
            random.shuffle(train_data)  # 打乱
            for min_batch in min_batches:  #逐个传入,效率很低
                self.updata_parameter(min_batch,eta)
            if test_data:
                num = self.evaluate(test_data)
                print "the {0}th epoches: {1}/{2}".format(k,num,len(test_data))
            else:
                print 'epoches {0} completed'.format(k)

    def forward(self,x):
        """获得各层激活值"""
        for w,b in zip(self.weight,self.bias):
            x = sigmoid(np.dot(w, x)+b)
        return x

    def updata_parameter(self,min_batch,eta):
        """1) 反向传播计算每个样本梯度值
           2) 累加每个批次样本的梯度值
           3) 权值更新"""
        ndeltab = [np.zeros(b.shape) for b in self.bias]
        ndeltaw = [np.zeros(w.shape) for w in self.weight]
        for x,y in min_batch:
            deltab,deltaw = self.backprop(x,y)
            ndeltab = [nb +db for nb,db in zip(ndeltab,deltab)]
            ndeltaw = [nw + dw for nw,dw in zip(ndeltaw,deltaw)]
        self.bias = [b - eta * ndb/len(min_batch) for ndb,b in zip(ndeltab,self.bias)]
        self.weight = [w - eta * ndw/len(min_batch) for ndw,w in zip(ndeltaw,self.weight)]


    def backprop(self,x,y):
        """执行前向计算,再进行反向传播,返回deltaw,deltab"""
        # [w for w in self.weight]
        # print 'len',len(w)
        # print "self.weight",self.weight[0].shape
        # print w[0].shape
        # print w[1].shape
        # print w.shape
        activation = x
        activations = [x]
        zs = []
        # feedforward
        for w, b in zip(self.weight, self.bias):
            # print w.shape,activation.shape,b.shape
            z = np.dot(w, activation) +b
            zs.append(z)   #用于计算f(z)导数
            activation = sigmoid(z)
            # print 'activation',activation.shape
            activations.append(activation)  # 每层的输出结果
        delta = self.top_subtract(activations[-1],y) * dsigmoid(zs[-1]) #最后一层的delta,np.array乘,相同维度乘
        deltaw = [np.zeros(w1.shape) for w1 in self.weight]  #每一次将获得的值作为列表形式赋给deltaw
        deltab = [np.zeros(b1.shape) for b1 in self.bias]
        # print 'deltab[0]',deltab[-1].shape
        deltab[-1] = delta
        deltaw[-1] = np.dot(delta,activations[-2].transpose())
        for k in xrange(2,self.num_layers):
            delta = np.dot(self.weight[-k+1].transpose(),delta) * dsigmoid(zs[-k])
            deltab[-k] = delta
            deltaw[-k] = np.dot(delta,activations[-k-1].transpose())
        return (deltab,deltaw)

    def evaluate(self,test_data):
        """评估验证集和测试集的精度,标签直接一个数作为比较"""
        z = [(np.argmax(self.forward(x)),y) for x,y in test_data]
        zs = np.sum(int(a == b) for a,b in z)
        # zk = sum(int(a == b) for a,b in z)
        # print "zs/zk:",zs,zk
        return zs

    def top_subtract(self,x,y):
        return (x - y)

def sigmoid(x):
    return 1.0/(1.0+np.exp(-x))

def dsigmoid(x):
    z = sigmoid(x)
    return z*(1-z)


3) 网络测试

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017-03-12 15:24
# @Author  : CC
# @File    : net_test.py

import net_load_data
# net_load_data.load_data()
train_data,validation_data,test_data = net_load_data.data_transform()

import net_network as net
net1 = net.Network([784,30,10])
min_batch_size = 10
eta = 3.0
epoches = 30
net1.SGD(train_data,min_batch_size,epoches,eta,test_data)
print "complete"

4) 结果

the 9th epoches: 9405/10000
the 10th epoches: 9420/10000
the 11th epoches: 9385/10000
the 12th epoches: 9404/10000
the 13th epoches: 9398/10000
the 14th epoches: 9406/10000
the 15th epoches: 9396/10000
the 16th epoches: 9413/10000
the 17th epoches: 9405/10000
the 18th epoches: 9425/10000
the 19th epoches: 9420/10000

总体来说这本书的实例,用来熟悉python和神经网络非常好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python构建深度神经网络(DNN) 的相关文章

  • 在 python 2 和 3 的spyder之间切换

    根据我在文档中了解到的内容 它指出您只需使用命令提示符创建一个新变量即可轻松在 2 个 python 环境之间切换 如果我已经安装了 python 2 7 则 conda create n python34 python 3 4 anaco
  • 如何 json_normalize() df 中的特定字段并保留其他列? [复制]

    这个问题在这里已经有答案了 这是我的简单示例 我的实际数据集中的 json 字段非常嵌套 因此我一次解压一层 我需要在 json normalize 之后保留数据集上的某些列 https pandas pydata org docs ref
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • DataFrame 中的字符串,但 dtype 是对象

    为什么 Pandas 告诉我我有对象 尽管所选列中的每个项目都是一个字符串 即使在显式转换之后也是如此 这是我的数据框
  • 对打开文件的脚本进行单元测试

    我编写了一个脚本 它打开一个文件 读取内容并进行一些操作和计算 并将它们存储在集合和字典中 我该如何为这样的事情编写单元测试 我的问题具体是 我会测试文件是否打开 文件很大 这是unix字典文件 我如何对计算进行单元测试 我真的必须手动计算
  • 如何在“python setup.py test”中运行 py.test 和 linter

    我有一个项目setup py文件 我用pytest作为测试框架 我还在我的代码上运行各种 linter pep8 pylint pydocstyle pyflakes ETC 我用tox在多个 Python 版本中运行它们 并使用以下命令构
  • multiprocessing.freeze_support()

    为什么多处理模块需要调用特定的function http docs python org dev library multiprocessing html multiprocessing freeze support在被 冻结 以生成 Wi
  • 使用reduce方法的斐波那契数列

    于是 我看到有人用reduce方法来计算斐波那契数列 这是他的想法 1 0 1 1 2 1 3 2 5 3 对应于 1 1 2 3 5 8 13 21 代码如下所示 def fib reduce n initial 1 0 dummy ra
  • Python 相当于 Bit Twiddling Hacks 中的 C 代码?

    我有一个位计数方法 我正在尝试尽可能快地实现 我想尝试下面的算法位摆弄黑客 http graphics stanford edu seander bithacks html CountBitsSetParallel 但我不知道 C 什么是
  • 别碰我的女人

    我讨厌的一件事迪斯图尔斯 http docs python org distutils 我猜他是邪恶的人 他这样做了 https github com python cpython blob 300dd552b15825abfe0e367a
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • Python time.sleep - 永不醒来

    我认为这将是那些简单的问题之一 但它让我感到困惑 停止媒体 我是对的 找到了解决方案 查看答案 我正在使用 Python 的单元测试框架来测试多线程应用程序 很好而且很直接 我有 5 个左右的工作线程监视一个公共队列 以及一个为它们制作工作
  • PermanentTaskFailure:“模块”对象没有属性“迁移”

    我在 google appengine 上使用 Nick Johnson 的批量更新库 http blog notdot net 2010 03 Announcing a robust datastore bulk update utili
  • python 中的基本矩阵转置

    我尝试了 python 中矩阵转置的最基本方法 但是 我没有得到所需的结果 接下来是代码 A 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 print A def TS A B A for i in range len A
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 获取运行云功能的运行时服务帐户

    有没有办法以编程方式从云功能获取运行时服务帐户的电子邮件 我知道我可以 猜测 默认的 App Engine 帐户 因为它始终是 appspot gserviceaccount com 但这不是我想要的 我本来期待有一些环境变量 https

随机推荐

  • 线性代数 --- 矩阵求逆的4种方法

    线性代数 矩阵求逆的4种方法 写在最前面 在大多数情况下 我们学习线性代数的目的是为了求解线性方程组Ax b 而不是为了求A的逆 单就解方程而言 LU分解是最实用的算法 只需按照A LU gt Ax b LUx b gt Ly b 正向回代
  • Redhat6.5的云主机停在某一个状态,不能继续启动

    Redhat6 5的云主机停在某一个状态 不能继续启动 1 现象 云主机 不能启动 状态如图 2 分析及诊断 制作云主机快照 导入到virt manager环境 使用guestfish工具 移除了 ss5 尝试启动 启动成功了 移除后 et
  • Oracle中group by用法

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组 一旦使用分组后select操作的对象变为各个分组后的数据 使用聚组函数返回的是每一个组的汇总信息 使用having子句 限制返回的结
  • sql用于判断的函数decode\case when then else语法

    简单的判断可以用decode函数 例如 如果字段a是null 值为0 如果是 值也为0 否则就是a的值 select decode a null 0 0 a from table 当需要有多个条件并列的时候 用case when then
  • 物联网技术和计算机网络技术,物联网技术下计算机网络技术专业建设探讨

    摘 要 物联网应用领域的高速扩张为高校人才培养带来新的机遇和挑战 本文论述了计算机网络技术专业开设物联网方向的必要性和可行性 研究结合学院行业资源及优势专业培养网络技术专业人才的新思路 提出融合多专业的以智慧交通 智慧物流等物联网应用为特色
  • springboot 微信小程序支付

    简单对支付封装 使用到maven 依赖 版本依照自己项目情况自行添加
  • 惠普136nw打印机清零_HP打印机清零方法(冷复位恢复出厂设置)

    一体机的 冷复位 可以将一体机内部的程序恢复到出厂时的设置 通过此操作 可以解决以下问题 随机驱动程序版本高于 V6 0 以后的一体机 连接电脑时可以通过软件查看墨水余量 这部 分一体机如果执行冷复位 会将墨水信息清除 这时将 无法识别该墨
  • 过TP保护与解除游戏驱动保护

    名称 Nakd KiAttachProcess 功能 My RecoveryHook KiAttachProcess的中继函数 参数 返回 static NAKED VOID Nakd KiAttachProcess asm mov edi
  • (9.1.1)线性代数之行列式

    1 行列式的基本公式 2 行列式的基本性质 3 行列式的求值 4 克拉默法则求解方程组 5 典型例题 1 行列式的基本公式 公式1 公式2 公式3 2 行列式的基本性质 性质1 行列式与它的转置行列式相等 性质2 互换行列式的两行 列 行列
  • Python爬虫详解

    初识爬虫 爬虫的概念 什么是爬虫 爬虫 通过编写程序 模拟浏览器上网 并抓取有价值的数据的过程 反爬虫 门户网站通过制定相应的策略或技术手段 来阻止爬虫程序对其网站数据的爬取 反反爬 爬虫程序可以采用一些技术手段 来绕过或破坏门户网站的反爬
  • JPA JPQL语句 高级分页查询

    JPA 04 JPQL JPQL 掌握 1 什么是JPQL JPQL全称Java Persistence Query Language ava持久化查询语言 JPQL 是一种可移植的查询语言 旨在以面向对象表达式语言的表达式 jpql和sq
  • 多态中虚函数同名参数不同

    案例 class A public A virtual A virtual void says int x int y void A says int x int y std cout lt lt A n class B public A
  • 时序预测

    时序预测 MATLAB实现MLP多层感知机时间序列预测 目录 时序预测 MATLAB实现MLP多层感知机时间序列预测 预测效果 基本介绍 模型特性 程序设计 学习总结 预测效果 基本介绍
  • ABP学习资源整理

    不同的编程语言都有构建Web Application的框架 比如C 中的ASP NET Core和ABP Java中的Spring Boot和Spring Cloud Python中的Django和Flask Node js中的Expres
  • 使用Gitlab一键安装包后的日常备份恢复与迁移

    Gitlab 创建备份 使用Gitlab一键安装包安装Gitlab非常简单 同样的备份恢复与迁移也非常简单 使用一条命令即可创建完整的Gitlab备份 gitlab rake gitlab backup create 使用以上命令会在 va
  • openssh升级报错configure: error: Your OpenSSL headers do not match your library. Check config.log for d

    整体的报错是这样的 checking OpenSSL library version 1010104f OpenSSL 1 1 1d 10 Sep 2019 checking whether OpenSSL s headers match
  • 挖洞思路:前端源码泄露漏洞并用source map文件还原

    0x01漏洞简介 webpack是一个JavaScript应用程序的静态资源打包器 module bundler 它会递归构建一个依赖关系图 dependency graph 其中包含应用程序需要的每个模块 然后将所有这些模块打包成一个或多
  • 关于CSS样式的层叠顺序

    CSS支持给同一元素多次设置相同的规则 这就是所谓竞争规则 浏览器会使用层叠顺序来确定一组竞争规则中生效的规则 例如 浏览器给每个元素设置默认规则 当我们给一个元素设置规则时 它会与默认规则竞争 但由于有较高的层叠顺序 所以我们设置的规则会
  • java中讲讲DataOutputStream的用法,举例?

    1 4 DataOutputStream的用法 马克 to win 一定要注意DataOutputStream 与DataInputStream必须配合使用 以便将基本数据类型 int char long String等 写入一个数据流 详
  • python构建深度神经网络(DNN)

    本文学习Neural Networks and Deep Learning 在线免费书籍 http neuralnetworksanddeeplearning com index html 用python构建神经网络识别手写体的一个总结 代