python: 深度学习-误差反向传播法

ReLU层的设计:

ReLU函数:

  

导数:

  

class Relu:
    def __init__(self):
        self.mask=None

    def forword(self,x):
        self.mask=(x<0)     #变量mask是由True/False构成的Numpy数组
        out=x.copy()
        out[self.mask]=0

        return out

    def backward(self,dout):
        dout[self.mask]=0
        dx=dout

        return dx

Sigmoid层的设计:

class Sigmoid:
    def __init__(self):
        self.out = None

    def forward(self, x):
        out = 1 / (1 + np.exp(-x))
        self.out = out

        return out

    def backward(self, dout):
        dx = dout * (1.0 - self.out) * self.out

        return dx

Affine 层:

class Affine:
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None
        self.db = None

    def forward(self, x):
        self.x = x
        out = np.dot(x, self.W) + self.b

        return out

    def backward(self, dout):
        dx = np.dot(dout, self.W.T)
        self.dW = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis=0)

        return dx

Softmax-with-Loss 层的实现

class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None # 损失
        self.y = None    # softmax的输出
        self.t = None    # 监督数据(one-hot vector)

    def forward(self, x, t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(self.y, self.t)

        return self.loss

    def backward(self, dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size

        return dx

对应误差反向传播法的神经网络的实现:

import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.layers import *
from common.gradient import numerical_gradient
from collections import OrderedDict

class TwoLayerNet:

    def __init__(self, input_size, hidden_size, output_size,
                 weight_init_std=0.01):
        # 初始化权重
        self.params = {}
        self.params[‘W1‘] = weight_init_std *                             np.random.randn(input_size, hidden_size)
        self.params[‘b1‘] = np.zeros(hidden_size)
        self.params[‘W2‘] = weight_init_std *                             np.random.randn(hidden_size, output_size)
        self.params[‘b2‘] = np.zeros(output_size)

        # 生成层
        self.layers = OrderedDict()   # OrderedDict是有序字典
        self.layers[‘Affine1‘] =             Affine(self.params[‘W1‘], self.params[‘b1‘])
        self.layers[‘Relu1‘] = Relu()
        self.layers[‘Affine2‘] =             Affine(self.params[‘W2‘], self.params[‘b2‘])

        self.lastLayer = SoftmaxWithLoss()

    def predict(self, x):
        for layer in self.layers.values():
            x = layer.forward(x)

        return x

    # x:输入数据, t:监督数据
    def loss(self, x, t):
        y = self.predict(x)
        return self.lastLayer.forward(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        if t.ndim != 1 : t = np.argmax(t, axis=1)
        accuracy = np.sum(y == t) / float(x.shape[0])
        return accuracy

    # x:输入数据, t:监督数据
    def numerical_gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)

        grads = {}
        grads[‘W1‘] = numerical_gradient(loss_W, self.params[‘W1‘])
        grads[‘b1‘] = numerical_gradient(loss_W, self.params[‘b1‘])
        grads[‘W2‘] = numerical_gradient(loss_W, self.params[‘W2‘])
        grads[‘b2‘] = numerical_gradient(loss_W, self.params[‘b2‘])

        return grads

    def gradient(self, x, t):
        # forward
        self.loss(x, t)

        # backward
        dout = 1
        dout = self.lastLayer.backward(dout)

        layers = list(self.layers.values())
        layers.reverse()
        for layer in layers:
            dout = layer.backward(dout)

        # 设定
        grads = {}
        grads[‘W1‘] = self.layers[‘Affine1‘].dW
        grads[‘b1‘] = self.layers[‘Affine1‘].db
        grads[‘W2‘] = self.layers[‘Affine2‘].dW
        grads[‘b2‘] = self.layers[‘Affine2‘].db

        return grads

原文地址:https://www.cnblogs.com/taoyuxin/p/11447324.html

时间: 2024-07-30 13:52:00

python: 深度学习-误差反向传播法的相关文章

深度学习之反向传播算法

直观理解反向传播 反向传播算法是用来求那个复杂到爆的梯度的. 上一集中提到一点,13000维的梯度向量是难以想象的.换个思路,梯度向量每一项的大小,是在说代价函数对每个参数有多敏感. 如上图,我们可以这样里理解,第一个权重对代价函数的影响是是第二个的32倍. 我们来考虑一个还没有被训练好的网络.我们并不能直接改动这些激活值,只能改变权重和偏置值.但记住,我们想要输出层出现怎样的变动,还是有用的. 我们希望图像的最后分类结果是2,我们期望第3个输出值变大,其余输出值变小,并且变动的大小应该与现在值

基于误差反向传播法的神经网络学习的全貌图

前提 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习.神经网络的学习分为下面4 个步骤. 步骤1(mini-batch)     从训练数据中随机选择一部分数据.步骤2(计算梯度)      计算损失函数关于各个权重参数的梯度.步骤3(更新参数)      将权重参数沿梯度方向进行微小的更新.步骤4(重复)      重复步骤1.步骤2.步骤3. 原文地址:https://www.cnblogs.com/latencytime/p/11079285.html

一文弄懂神经网络中的反向传播法——BackPropagation

最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进行补充,但是补充的又是错的,难怪觉得有问题.反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用.如果不想看公式,可以直接把数值带进去,实际的计算一下,体会一下这个过程之后再来推导公式,这样就会觉得很容

神经网络和深度学习之——误差反向传播算法

在讲解误差反向传播算法之前,我们来回顾一下信号在神经网络中的流动过程.请细细体会,当输入向量\(X\)输入感知器时,第一次初始化权重向量\(W\)是随机组成的,也可以理解成我们任意设置了初始值,并和输入做点积运算,然后模型通过权重更新公式来计算新的权重值,更新后的权重值又接着和输入相互作用,如此迭代多次,得到最终的权重. 信号向前传播,权重的更新反向传播,是这样吗? 是的,你的直觉没错,确实是反向传播. 1. 前馈的实质 反向传播这个术语经常被误解为用于多层神经网络的整个学习算法.实际上,反向传

编写C语言版本的卷积神经网络CNN之三:CNN的误差反向传播过程

原创文章 转载请注册来源http://blog.csdn.net/tostq 上一节我们介绍了卷积神经网络的前向传播过程,这一节我们重点介绍反向传播过程,反向传播过程反映神经网络的学习训练过程. 误差反向传播方法是神经网络学习的基础,网络上已经有许多相关的内容了,不过关于卷积网络的误差反向传递的公式推导却比较少,而且也不是很清晰,本文将会详细推导这个过程,虽然内容很复杂,但却值得学习. 首先我们需要知道的是误差反向传播的学习方法,实际是梯度下降法求最小误差的权重过程.当然我们的目的是求误差能量关

神经网络中的反向传播法

直观理解反向传播法 反向传播算法其实就是链式求导法则的应用.按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法去求目标函数最小值时的参数值. 反向传播算法 损失函数与正则化项 假设我们有一个固定样本集\(\{(x^{(1)},y^{(1)}),···,(x^{(m)},y^{(m)})\}\)它包含m个样本.我们可以用批量梯度下降法来求解神经网络.具体来讲,对于单个样例(x,y),其代价函数为:\[J(W,b;x,y)=\frac{1}{2}||h_{W,b}{(x

Python深度学习该怎么学?

Python想必对我们来说已经很熟悉了,Python的发展带来了一股学习Python的浪潮,聪明的人早已看准这个发展的好时机开始学习Python,那么我想问你知道Python深度学习是什么吗?不懂了吧,那让小编给你普及一下这方面的知识吧. 深度学习目前已经成为了人工智能领域的突出话题.它在"计算机视觉"和游戏(AlphaGo)等领域的突出表现而闻名,甚至超越了人类的能力.近几年对深度学习的关注度也在不断上升. 在这篇文章中,我们的目标是为所有Python深度学习的人提供一条学习之路,同

《Python深度学习》高清中文版pdf+高清英文版pdf+源代码

下载:https://pan.baidu.com/s/1fngyDdcld6rA5qoho1dQCw 更多最新的资料:http://blog.51cto.com/3215120 <Python深度学习>[中文版和英文版][高清完整版PDF]+[配套源代码] 高清中文版PDF,314页,带目录和书签,彩色配图,能够复制粘贴:高清英文版PDF,386页,带目录和书签,彩色配图,能够复制粘贴:中英文两版可以对比学习. 配套源代码: 经典书籍,讲解详细: 其中高清中文版如图 原文地址:http://b

好书推荐计划:Keras之父作品《Python 深度学习》

大家好,我禅师的助理兼人工智能排版住手助手条子.可能非常多人都不知道我.由于我真的难得露面一次,天天给禅师做底层工作. wx_fmt=jpeg" alt="640? wx_fmt=jpeg" /> 今天条子最终也熬到这一天! 最终也有机会来为大家写文章了! 激动的我啊.都忘了9月17号中午和禅师在我厂门口兰州料理吃饭.禅师要了一碗牛拉+一瓶可乐+一碟凉菜,总共30元.让我结账至今还没还钱的事儿了.真的,激动的我一点儿都想不起来了. 国庆长假就要開始了,作为人工智能头条的