精华内容
下载资源
问答
  • 主要介绍了numpy实现神经网络反向传播算法的步骤,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友们下面随着小编来一起学习学习吧
  • 一、任务实现一个4 层全连接网络实现二分类任务,网络输入节点数为2,隐藏层节点数设计为:25,50,25,输出层2 个节点,分别表示属于类别1 概率和类别2 概率,如图所示。我们并没有采用Softmax 函数将网络...

    一、任务

    实现一个4 层的全连接网络实现二分类任务,网络输入节点数为2,隐藏层的节点数设计为:25,50,25,输出层2 个节点,分别表示属于类别1 的概率和类别2 的概率,如图所示。我们并没有采用Softmax 函数将网络输出概率值之和进行约束,而是直接利用均方差误差函数计算与One-hot 编码的真实标签之间的误差,所有的网络激活函数全部采用Sigmoid 函数,这些设计都是为了能直接利用梯度推导公式。

    二、数据集

    通过scikit-learn 库提供的便捷工具生成2000 个线性不可分的2 分类数据集,数据的特征长度为2,采样出的数据分布如图 所示,所有的红色点为一类,所有的蓝色点为一类,可以看到数据的分布呈月牙状,并且是是线性不可分的,无法用线性网络获得较好效果。为了测试网络的性能,按照7: 3比例切分训练集和测试集,其中2000 ∗ 0 3 =600个样本点用于测试,不参与训练,剩下的1400 个点用于网络的训练。

    import matplotlib.pyplot as plt

    import seaborn as sns #要注意的是一旦导入了seaborn,matplotlib的默认作图风格就会被覆盖成seaborn的格式

    from sklearn.datasets import make_moons

    from sklearn.model_selection import train_test_split

    N_SAMPLES = 2000 # 采样点数

    TEST_SIZE = 0.3 # 测试数量比率

    # 利用工具函数直接生成数据集

    X, y = make_moons(n_samples = N_SAMPLES, noise=0.2, random_state=100)

    # 将2000 个点按着7:3 分割为训练集和测试集

    X_train, X_test, y_train, y_test = train_test_split(X, y,

    test_size=TEST_SIZE, random_state=42)

    print(X.shape, y.shape)

    # 绘制数据集的分布,X 为2D 坐标,y 为数据点的标签

    def make_plot(X, y, plot_name, file_name=None, XX=None, YY=None, preds=None,dark=False):

    if (dark):

    plt.style.use('dark_background')

    else:

    sns.set_style("whitegrid")

    plt.figure(figsize=(16,12))

    axes = plt.gca()

    axes.set(xlabel="$x_1$", ylabel="$x_2$")

    plt.title(plot_name, fontsize=30)

    plt.subplots_adjust(left=0.20)

    plt.subplots_adjust(right=0.80)

    if(XX is not None and YY is not None and preds is not None):

    plt.contourf(XX, YY, preds.reshape(XX.shape), 25, alpha = 1,cmap=plt.cm.Spectral)

    plt.contour(XX, YY, preds.reshape(XX.shape), levels=[.5],cmap="Greys", vmin=0, vmax=.6)

    # 绘制散点图,根据标签区分颜色

    plt.scatter(X[:, 0], X[:, 1], c=y.ravel(), s=40, cmap=plt.cm.Spectral,edgecolors='none')

    plt.savefig('dataset.svg')

    plt.close()

    # 调用make_plot 函数绘制数据的分布,其中X 为2D 坐标,y 为标签

    make_plot(X, y, "Classification Dataset Visualization ")

    plt.show()

    三、网络层

    通过新建类Layer 实现一个网络层,需要传入网络层的数据节点数,输出节点数,激活函数类型等参数,权值weights 和偏置张量bias 在初始化时根据输入、输出节点数自动生成并初始化:

    class Layer:

    # 全连接网络层

    def __init__(self, n_input, n_neurons, activation=None, weights=None,

    bias=None):

    """

    :param int n_input: 输入节点数

    :param int n_neurons: 输出节点数

    :param str activation: 激活函数类型

    :param weights: 权值张量,默认类内部生成

    :param bias: 偏置,默认类内部生成

    """

    # 通过正态分布初始化网络权值,初始化非常重要,不合适的初始化将导致网络不收敛

    self.weights = weights if weights is not None else

    np.random.randn(n_input, n_neurons) * np.sqrt(1 / n_neurons)

    self.bias = bias if bias is not None else np.random.rand(n_neurons) *0.1

    self.activation = activation # 激活函数类型,如'sigmoid'

    self.last_activation = None # 激活函数的输出值o

    self.error = None # 用于计算当前层的delta 变量的中间变量

    self.delta = None # 记录当前层的delta 变量,用于计算梯度

    def activate(self, x):

    # 前向传播

    r = np.dot(x, self.weights) + self.bias # X@W+b

    # 通过激活函数,得到全连接层的输出o

    self.last_activation = self._apply_activation(r)

    return self.last_activation

    # 其中self._apply_activation 实现了不同的激活函数的前向计算过程:

    def _apply_activation(self, r):

    # 计算激活函数的输出

    if self.activation is None:

    return r # 无激活函数,直接返回

    # ReLU 激活函数

    elif self.activation == 'relu':

    return np.maximum(r, 0)

    # tanh

    elif self.activation == 'tanh':

    return np.tanh(r)

    # sigmoid

    elif self.activation == 'sigmoid':

    return 1 / (1 + np.exp(-r))

    return r

    # 针对于不同的激活函数,它们的导数计算实现如下:

    def apply_activation_derivative(self, r):

    # 计算激活函数的导数

    # 无激活函数,导数为1

    if self.activation is None:

    return np.ones_like(r)

    # ReLU 函数的导数实现

    elif self.activation == 'relu':

    grad = np.array(r, copy=True)

    grad[r > 0] = 1.

    grad[r <= 0] = 0.

    return grad

    # tanh 函数的导数实现

    elif self.activation == 'tanh':

    return 1 - r ** 2

    # Sigmoid 函数的导数实现

    elif self.activation == 'sigmoid':

    return r * (1 - r)

    return r

    四、网络模型

    完成单层网络类后,再实现网络模型的类NeuralNetwork,它内部维护各层的网络层Layer 类对象,可以通过add_layer 函数追加网络层,实现如下:

    class NeuralNetwork:

    # 神经网络大类

    def __init__(self):

    self._layers = [] # 网络层对象列表

    def add_layer(self, layer):

    # 追加网络层

    self._layers.append(layer)

    # 网络的前向传播只需要循环调用个网络层对象的前向计算函数即可

    def feed_forward(self, X):

    # 前向传播

    for layer in self._layers:

    # 依次通过各个网络层

    X = layer.activate(X)

    return X

    #网络模型的反向传播实现稍复杂,需要从最末层开始,计算每层的𝛿变量,根据我们

    #推导的梯度公式,将计算出的𝛿变量存储在Layer类的delta变量中

    # 因此,在backpropagation 函数中,反向计算每层的𝛿变量,并根据梯度公式计算每层参数的梯度值,

    # 按着梯度下降算法完成一次参数的更新。

    def backpropagation(self, X, y, learning_rate):

    # 反向传播算法实现

    # 前向计算,得到输出值

    output = self.feed_forward(X)

    for i in reversed(range(len(self._layers))): # 反向循环

    layer = self._layers[i] # 得到当前层对象

    # 如果是输出层

    if layer == self._layers[-1]: # 对于输出层

    layer.error = y - output # 计算2 分类任务的均方差的导数

    # 关键步骤:计算最后一层的delta,参考输出层的梯度公式

    layer.delta = layer.error * layer.apply_activation_derivative(output)

    else: # 如果是隐藏层

    next_layer = self._layers[i + 1] # 得到下一层对象

    layer.error = np.dot(next_layer.weights, next_layer.delta)

    # 关键步骤:计算隐藏层的delta,参考隐藏层的梯度公式

    layer.delta = layer.error * layer.apply_activation_derivative(layer.last_activation)

    # 在反向计算完每层的𝛿变量后,只需要按着式计算每层的梯度,并更新网络参数即可。

    # 由于代码中的delta 计算的是−𝛿,因此更新时使用了加号。

    # 循环更新权值

    for i in range(len(self._layers)):

    layer = self._layers[i]

    # o_i 为上一网络层的输出

    o_i = np.atleast_2d(X if i == 0 else self._layers[i-1].last_activation)

    # 梯度下降算法,delta 是公式中的负数,故这里用加号

    layer.weights += layer.delta * o_i.T * learning_rate

    def train(self, X_train, X_test, y_train, y_test, learning_rate,max_epochs):

    # 网络训练函数

    # one-hot 编码

    y_onehot = np.zeros((y_train.shape[0], 2))

    y_onehot[np.arange(y_train.shape[0]), y_train] = 1

    mses = []

    for i in range(max_epochs): # 训练1000 个epoch

    for j in range(len(X_train)): # 一次训练一个样本

    self.backpropagation(X_train[j], y_onehot[j], learning_rate)

    if i % 10 == 0:

    # 打印出MSE Loss

    mse = np.mean(np.square(y_onehot - self.feed_forward(X_train)))

    mses.append(mse)

    print('Epoch: #%s, MSE: %f' % (i, float(mse)))

    # 统计并打印准确率

    print('Accuracy: %.2f%%' % (self.accuracy(self.predict(X_test),y_test.flatten()) * 100))

    return mses

    def accuracy(self,y_pre,y_true):

    return np.mean((np.argmax(y_pre, axis=1) == y_true))

    def predict(self,X_test):

    return self.feed_forward(X_test)

    五、实例化NeuralNetwork类,进行训练

    nn = NeuralNetwork() # 实例化网络类

    nn.add_layer(Layer(2, 25, 'sigmoid')) # 隐藏层1, 2=>25

    nn.add_layer(Layer(25, 50, 'sigmoid')) # 隐藏层2, 25=>50

    nn.add_layer(Layer(50, 25, 'sigmoid')) # 隐藏层3, 50=>25

    nn.add_layer(Layer(25, 2, 'sigmoid')) # 输出层, 25=>2

    learning_rate = 0.01

    max_epochs = 1000

    nn.train(X_train, X_test, y_train, y_test, learning_rate,max_epochs)

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 在上一节中,我们介绍了反向传播算法,对很多人来说,当第一次看到这种算法时,第一印象通常是,这个算法需要那么多繁杂的步骤,简直是太复杂了,实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,...
    在上一节中,我们介绍了反向传播算法,对很多人来说,当第一次看到这种算法时,第一印象通常是,这个算法需要那么多繁杂的步骤,简直是太复杂了,实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,里面充满了复杂的步骤。如果你对反向传播算法也有这种感受的话,这其实是正常的,相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法似乎并不简洁,对于反向传播这种算法,其实我已经使用了很多年了,但即便如此,即使是现在,我也经常感觉自己对反向传播算法的理解并不是十分深入,对于反向传播算法究竟是如何执行的,并没有一个很直观的理解。做过编程练习的同学应该可以感受到这些练习或多或少能帮助你,将这些复杂的步骤梳理了一遍,巩固了反向传播算法具体是如何实现的,这样你才能自己掌握这种算法。在这一节中,我想更加深入地讨论一下反向传播算法的这些复杂的步骤,并且希望给你一个更加全面直观的感受,理解这些步骤究竟是在做什么,也希望通过这段视频,你能理解,它至少还是一个合理的算法。但可能你即使看了这段视频,你还是觉得反向传播依然很复杂,依然像一个黑箱,太多复杂的步骤,依然感到有点神奇,这也是没关系的。即使是我接触反向传播这么多年了,有时候仍然觉得这是一个难以理解的算法,但还是希望这段视频能有些许帮助,为了更好地理解反向传播算法,我们再来仔细研究一下前向传播的原理:

    8a87d3c027cfae81c50c124800c9d1a1.png

    这是一个含有两个输入单元的神经网络结构,当然,没有把偏置单元放进去,第二层和第三层各有两个隐藏单元,不过最后只有一个输出单元。

    c00f2a0a71bd6bec1512a63f5e4c1ffc.png

    为了更好的理解反向传播函数,我们来看一下损失函数,这个损失函数只适用于有一个输出单元的情况,如果有不止一个输出单元,只需要用k作为输出单元的下标,然后对他们进行求和即可。

    3c2326f1de4b12652dccf315cc4cace8.png

    b850b0f1e38ddca5038882f93bb37b05.png

    展开全文
  • 神经网络BP反向传播算法原理和详细推导流程

    万次阅读 多人点赞 2018-05-09 22:25:53
    1 反向传播算法和BP网络简介 误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它基本思想为:(1)先计算每一层状态和激活值,直到最后一...

    1  反向传播算法和BP网络简介

     

        误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想为:(1)先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);(2)计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);(3)更新参数(目标是误差变小)。迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。

        本文的记号说明:

     

     

     

    下面以三层感知器(即只含有一个隐藏层的多层感知器)为例介绍“反向传播算法(BP 算法)”。

    2 信息前向传播

     

     

    3 误差反向传播

    3.1 输出层的权重参数更新

    3.2  隐藏层的权重参数更新

    3.3输出层和隐藏层的偏置参数更新

    3.4 BP算法四个核心公式

     

    3.5 BP 算法计算某个训练数据的代价函数对参数的偏导数

    3.6 BP 算法总结:用“批量梯度下降”算法更新参数

    4 梯度消失问题及其解决办法

    5 加快 BP 网络训练速度:Rprop 算法

     

     

     

     

    展开全文
  • 实现神经网络前向传播和反响传播的步骤及心得 1.初始化参数矩阵的值 目的:防止神经网络参数的高度冗余。 在线性回归和logistic回归中,通常把初始化参数设置为0,但如果神经网络把初始化参数设置为0,就无法得到一...

    实现神经网络前向传播和反响传播的步骤及心得

    1.初始化参数矩阵的值
    在这里插入图片描述
    目的:防止神经网络参数的高度冗余。
    在线性回归和logistic回归中,通常把初始化参数设置为0,但如果神经网络把初始化参数设置为0,就无法得到一个很好的拟合参数集。

    2.实现向前传播算法 对每一个输入值得到对应的假设输出值
    在这里插入图片描述
    步骤:在这里插入图片描述
    1.根据输入样本通过对应的参数矩阵的计算得到输出值,并且要对每一层的假设输出值代入sigmoid函数中进行激活,激活值当作下一层的输入参数和对应的参数矩阵进行计算。这样最后会输出一个或多个假设值。
    2.每两层假设矩阵之间的维数通常是下一层的单元数*(上一层的单元数+1),这是因为上一层有一个隐含的biasunit导致的。

    3计算代价函数J(θ)

    在这里插入图片描述
    代价函数为:
    在这里插入图片描述
    对代价函数的理解:第一项中的k是输出个数值,m是总样本值。
    1.如果输出结果为单值,k=1,和logistic回归一样。
    2.如果输出结果为多值。对每一个输入值(1<i<=m)得到的1.2.3…k个输出单元进行代价计算ym,求和。然后对m个输出单元求和得到总的代价函数

    4.反向传播算法在这里插入图片描述
    目的:求出每一个参数的偏导数。
    步骤:在这里插入图片描述
    1.在一个for循环中,循环的次数是样本数量
    经过前面的前向传播算法的实现,每一个输入值都对应一个或多个输出值。通过输出值与y值得差,我们反向传递给前面层数的数据。在这里插入图片描述
    在这里插入图片描述
    接着对?进行更新,循环遍历m次,最后得到的一组参数值就是每一个参数的导数值
    5.对每一个导数值进行检验
    在这里插入图片描述
    通过数值计算
    在这里插入图片描述
    来验证计算结果的准确性,并关掉算法中的梯度检测。
    6.找到适合神经网络的权值数组。
    通过导数值:我们就可以实行梯度下降,通过matlab中自带的算法,找到使代价
    函数最小的局部最优解

    展开全文
  • 一、任务实现一个4 层全连接网络实现二分类任务,网络输入节点数为2,隐藏层节点数设计为:25,50,25,输出层2 个节点,分别表示属于类别1 概率和类别2 概率,如图所示。我们并没有采用Softmax 函数将网络...
  • 反向传播算法推导

    2020-06-01 20:24:39
    1 反向传播算法和BP网络简介 误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它基本思想为:(1)先计算每一层状态和激活值,直到最后...
  • 这里把按 [1] 推导BP算法(Backpropagation)步骤整理一下。突然想整理这个原因是知乎上看到了一个帅呆了求矩阵微分方法(也就是 [2]),不得不感叹作者功力。[1] 中直接使用矩阵微分记号进行推导,整个...
  • 【开始时间】: 【结束时间】: 【论文】:王铁林, 沈国良. 误差反向传播算法的数学推导及实现步骤. 辽阳石油化高等专科学校学报,2002.9(2)1-3. 【论文链接】: ...
  • 反向传播算法

    2019-10-05 08:25:13
    后向传播是在训练时候,根据最终输出误差来调整倒数第二层、倒数第三层……第一层参数过程。...后向传播算法步骤 转载于:https://www.cnblogs.com/danscarlett/p/9008295.html...
  • BP反向传播算法

    2019-07-04 22:54:45
    说到神经网络实现,其实就是调整各个神经元之间参数(w,b),但是介于各层神经元之间连接,所以推出反向传播来实现各个参数调整,接下来,我们看一下如何进行反向传播。 什么是反向传播? ...
  • 反向传播算法的实现过程分为两个步骤: 1.正向传播:由输入层经过隐藏层传播到输出层,计算损失函数和误差 2.反向传播:在反向传播中,首先计算输出层神经元损失函数梯度,再计算隐藏层神经元损失函数梯度,再...
  • 0. 前言 上篇博客对BP算法的大致步骤进行了总结,本篇博客将通过一个具体例子来模拟一下这个算法的实现过程 ! 1. BP算法之例 网络结构
  • 反向传播算法和BP网络简介 误差反向传播算法简称反向传播算法(BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它基本思想为:(1)先计算每一层状态和激活值,直到最后一层...
  • 那么我们就要训练出一个最符合真实数据映射f,那么训练最符合真实数据f过程就是神经网络训练过程,神经网络训练可以分为两个步骤:一个是前向传播,另外一个是反向传播。 前向传播就是从输入层开始(Layer1...
  • 算法介绍反向传播算法(Backpropagation)是一种适合于多层神经元网络学习算法,通常用于训练大规模深度学习网络。反向传播算法主要基于梯度下降法,其过程由前向传播、反向传播、权重更新这三步构成。下面将...
  • 快速计算梯度魔法--反向传播算法

    千次阅读 2017-06-16 15:40:59
    前向传递节点,反向传递梯度。 我们先从计算图底部开始向上,逐个节点计算函数值并保存下来。这个步骤,叫做前向计算(forward)。...这个步骤,叫做反向传播(backward)或者更明确一点叫做反向梯度传播。
  • 误差反向传播算法简称反向传播算法(Back Propagation)。使用反向传播算法的多层感知器又称为 BP ...在反向传播的过程中,根据误差调整各种参数的值(相连神经元的权重),使得总损失 函数减小。 迭代上述三个步骤(即对
  • 关于反向传播算法,尚未理解清楚: 下面两个链接给出了一个简单的反向传播算法的详细步骤: 中英对照:英文原文(可能需要翻墙)   中文翻译-无公式
  • BP算法学习笔记 1 学习基础–神经网络基本原理和前向过程 ​ 如下图所示,这时一个简单神经网络模型,通过...​ 现在我们先明确一下图中参数意义:w表示权重,b表示偏置,下面是基本计算步骤。 z11=a1∗w1,11+a2
  • 前馈神经网络和反向传播算法

    千次阅读 2017-07-03 23:28:00
       所以可知前向传播的步骤如下,就是一步一步对节点对应的值进行计算: 二、反向传播算法    反向传播算法是为了更好更快的训练前馈神经网络,从而得到神经网络每一层的权重参数和偏置参数。下面以一组图来...
  • 误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想为: 先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的); ...
  • 反向传播算法是神经网络一个关键步骤,通过反向传播算法,可以计算出假设函数对所有神经网络参数偏导数。  神经网络算法的工作流程为:首先通过人工或其它算法确定特征x\mathbf{x}x,并随机初始化所有神经网络...
  • 神经网络-反向传播算法神经网络学习神经网络模型特征和直观理解多类分类神经网络参数的反向传播代价函数反向传播算法反向传播算法的直观理解展开参数梯度检验综合起来(使用神经网络步骤)自主驾驶 神经网络学习...
  • 神经网络训练过程,就是通过已有样本,求取使代价函数最小化时所对应参数。代价函数测量是模型对样本预测值与其真实值之间误差,最小化... 其中最重要的步骤就是求梯度,这可以通过反向传播算法(...
  • 计算机视觉05:神经网络与误差反向传播算法 文章目录计算机视觉05:神经网络与误差反向传播算法1. 神经网络1. 前馈神经网络(无反馈)2. Delta学习规则3. 梯度下降4. 权重如何改变5. 示例6.其他梯度下降7.典型机器...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

反向传播的算法步骤