BP神经网络详解,Python实现求解异或问题

神经网络学习笔记(十二):异或问题 在Rosenblatt单层感知机中已经对异或问题做了介绍,并论证说明了只适用于线性分类问题的Rosenblatt感知机无法对异或问题进行分类。然而非线性问题是普遍存在的,下面就使用带隐藏节点的神经网络来解决异或问题。 异或问题:         异或(XOR)问题可以看做是单位正方形的四个角,响应的输入模式为(0,0),(0,1),(1,1),(1,0)。第一个和第三个模式属于 阅读详情

BP神经网络

符号及其含义

  • nln_lnl​表示第lll层神经元的个数;
  • f(⋅)f(·)f(⋅)表示神经元的激活函数;
  • W(l)∈Rni∗ni−1W^{(l)}\in\mathbb R^{n_i*n_{i-1}}W(l)∈Rni​∗ni−1​表示第l−1l-1l−1层到第lll层的权重矩阵;
  • wij(l)w_{ij}^{(l)}wij(l)​是权重矩阵W(l)W^{(l)}W(l)中的元素,表示第l−1l-1l−1层第jjj个神经元到第lll层第iii个神经元的连接的权重(注意标号的顺序);
  • b(l)=(b1(l),b2(l),...,bnl(l))T∈R(nl)b^{(l)}=(b_1^{(l)},b_2^{(l)},...,b_{nl}^{(l)})^T\in\mathbb R^{(nl)}b(l)=(b1(l)​,b2(l)​,...,bnl(l)​)T∈R(nl)表示l−1l-1l−1层到第lll层的偏置;
  • z(l)=(z1(l),z2(l),...,znl(l))T∈R(nl)z^{(l)}=(z_1^{(l)},z_2^{(l)},...,z_{nl}^{(l)})^T\in\mathbb R^{(nl)}z(l)=(z1(l)​,z2(l)​,...,znl(l)​)T∈R(nl)表示lll层神经元的状态;
  • a(l)=(a1(l),a2(l),...,anl(l))T∈R(nl)a^{(l)}=(a_1^{(l)},a_2^{(l)},...,a_{nl}^{(l)})^T\in\mathbb R^{(nl)}a(l)=(a1(l)​,a2(l)​,...,anl(l)​)T∈R(nl)表示lll层神经元的激活值(即输出值)。

在这里插入图片描述

图1图1图1
显然,图1所示神经网络的第2层神经元的状态及激活值可以通过下面的计算得到:
z1(2)=w11(2)x1+w12(2)x2+w13(2)x3+b1(2)z_1^{(2)}=w_{11}^{(2)}x_1+w_{12}^{(2)}x_2+w_{13}^{(2)}x_3+b_1^{(2)}z1(2)​=w11(2)​x1​+w12(2)​x2​+w13(2)​x3​+b1(2)​
z2(2)=w21(2)x1+w22(2)x2+w23(2)x3+b2(2)z_2^{(2)}=w_{21}^{(2)}x_1+w_{22}^{(2)}x_2+w_{23}^{(2)}x_3+b_2^{(2)}z2(2)​=w21(2)​x1​+w22(2)​x2​+w23(2)​x3​+b2(2)​
z3(2)=w31(2)x1+w32(2)x2+w33(2)x3+b3(2)z_3^{(2)}=w_{31}^{(2)}x_1+w_{32}^{(2)}x_2+w_{33}^{(2)}x_3+b_3^{(2)}z3(2)​=w31(2)​x1​+w32(2)​x2​+w33(2)​x3​+b3(2)​
a1(2)=f(z1(2))a_1^{(2)}=f(z_1^{(2)})a1(2)​=f(z1(2)​)
a2(2)=f(z2(2))a_2^{(2)}=f(z_2^{(2)})a2(2)​=f(z2(2)​)
a3(2)=f(z3(2))a_3^{(2)}=f(z_3^{(2)})a3(2)​=f(z3(2)​)
(1)(1)(1)
类似地,第3层神经元的状态及激活值可以通过下面的计算得到:
z1(3)=w11(3)a1(2)+w12(3)a2(2)+w13(3)a3(2)+b1(3)z_1^{(3)}=w_{11}^{(3)}a_1^{(2)}+w_{12}^{(3)}a_2^{(2)}+w_{13}^{(3)}a_3^{(2)}+b_1^{(3)}z1(3)​=w11(3)​a1(2)​+w12(3)​a2(2)​+w13(3)​a3(2)​+b1(3)​
z2(3)=w21(3)a1(2)+w22(3)a2(2)+w23(3)a3(2)+b2(3)z_2^{(3)}=w_{21}^{(3)}a_1^{(2)}+w_{22}^{(3)}a_2^{(2)}+w_{23}^{(3)}a_3^{(2)}+b_2^{(3)}z2(3)​=w21(3)​a1(2)​+w22(3)​a2(2)​+w23(3)​a3(2)​+b2(3)​
a1(3)=f(z1(3))a_1^{(3)}=f(z_1^{(3)})a1(3)​=f(z1(3)​)
a2(3)=f(z2(3))a_2^{(3)}=f(z_2^{(3)})a2(3)​=f(z2(3)​)
(2)(2)(2)
可总结出,第l(2<=l<=L)l(2<=l<=L)l(2<=l<=L)层神经元的状态及激活值为(下面式子是向量表示形式):
z(l)=W(l)a(l−1)+b(l)(3)z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}\\(3)z(l)=W(l)a(l−1)+b(l)(3)

对于训练的数据集,使用均方误差作为损失函数来评估整体误差:
Error=12[(y1−a1(3))2+(y2−a2(3))2]Error=\frac{1}{2}\begin{bmatrix} (y_1-a_1^{(3)})^2+(y_2-a_2^{(3)})^2 \end{bmatrix}Error=21​[(y1​−a1(3)​)2+(y2​−a2(3)​)2​]
(4)(4)(4)
把EEE展开到隐藏层:
E=12[(y1−a1(3))2+(y2−a2(3))2]E=\frac{1}{2}\begin{bmatrix} (y_1-a_1^{(3)})^2+(y_2-a_2^{(3)})^2 \end{bmatrix}E=21​[(y1​−a1(3)​)2+(y2​−a2(3)​)2​]
E=12[(y1−f(z1(3)))2+(y2−f(z2(3)))2]E=\frac{1}{2}\begin{bmatrix} (y_1-f(z_1^{(3)}))^2+(y_2-f(z_2^{(3)}))^2 \end{bmatrix}E=21​[(y1​−f(z1(3)​))2+(y2​−f(z2(3)​))2​]
E=12[(y1−f(w11(3)a1(2)+w12(3)a2(2)+w13(3)a3(2)+b1(3)))2+(y2−f(w21(3)a1(2)+w22(3)a2(2)+w23(3)a3(2)+b2(3)))2]E=\frac{1}{2}\begin{bmatrix} (y_1-f(w_{11}^{(3)}a_1^{(2)}+w_{12}^{(3)}a_2^{(2)}+w_{13}^{(3)}a_3^{(2)}+b_1^{(3)}))^2+(y_2-f(w_{21}^{(3)}a_1^{(2)}+w_{22}^{(3)}a_2^{(2)}+w_{23}^{(3)}a_3^{(2)}+b_2^{(3)}))^2 \end{bmatrix}E=21​[(y1​−f(w11(3)​a1(2)​+w12(3)​a2(2)​+w13(3)​a3(2)​+b1(3)​))2+(y2​−f(w21(3)​a1(2)​+w22(3)​a2(2)​+w23(3)​a3(2)​+b2(3)​))2​]
(5)(5)(5)
我们的目的时调整权重和偏执使总体误差减小,求得误差为最小(或某一可以接受的范围)时所对应的每个wij(l)w_{ij}^{(l)}wij(l)​,bi(l)b_i^{(l)}bi(l)​。
训练过程的核心就是梯度下降,我们对每个参数wij(l)w_{ij}^{(l)}wij(l)​,bi(l)b_i^{(l)}bi(l)​求偏导,通过下降这些梯度来减小损失函数EEE的值,每次步长为α\alphaα(学习率),这也就是每个权重的更新过程,以w11(3)w_{11}^{(3)}w11(3)​为例:
以w11(3)w_{11}^{(3)}w11(3)​为例,由链式求导法则,对w11(3)w_{11}^{(3)}w11(3)​求偏导结果为:
∂E∂w11(3)=∂E∂z1(3)∂z1(3)∂w11(3)=∂E∂a1(3)∂a1(3)∂z1(3)∂z1(3)∂w11(3)=−(y1−a1(3))f′(z1(3))∂z1(3)∂w11(3)=−(y1−a1(3))f′(z1(3))a1(2)\frac{\partial E}{\partial w_{11}^{(3)}} = \frac{\partial E}{\partial z_{1}^{(3)}} \frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}} = \frac{\partial E}{\partial a_{1}^{(3)}} \frac{\partial a_{1}^{(3)}}{\partial z_{1}^{(3)}}\frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}} = -(y_1-a_1^{(3)})f^{'}(z_1^{(3)}) \frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}} = -(y_1-a_1^{(3)})f^{'}(z_1^{(3)}) a_1^{(2)}∂w11(3)​∂E​=∂z1(3)​∂E​∂w11(3)​∂z1(3)​​=∂a1(3)​∂E​∂z1(3)​∂a1(3)​​∂w11(3)​∂z1(3)​​=−(y1​−a1(3)​)f′(z1(3)​)∂w11(3)​∂z1(3)​​=−(y1​−a1(3)​)f′(z1(3)​)a1(2)​
(6)(6)(6)
其中偏导数∂E∂zi(l)\frac{\partial E}{\partial z_{i}^{(l)}}∂zi(l)​∂E​表示第lll层第iii个神经元对最终损失的影响,也反映了最终损失对第lll层神经元的敏感程度,因此一般称为第lll层神经元的误差项,用δ(l)\delta^{(l)}δ(l)来表示。
δ(l)≡∂E∂zi(l)(7)\delta^{(l)}≡\frac{\partial E}{\partial z_{i}^{(l)}}\\(7)δ(l)≡∂zi(l)​∂E​(7)
∂E∂w11(3)=∂E∂z1(3)∂z1(3)∂w11(3)=δ1(3)a1(2)(8)\frac{\partial E}{\partial w_{11}^{(3)}} = \frac{\partial E}{\partial z_{1}^{(3)}} \frac{\partial z_{1}^{(3)}}{\partial w_{11}^{(3)}}=\delta_1^{(3)}a_1^{(2)}\\(8)∂w11(3)​∂E​=∂z1(3)​∂E​∂w11(3)​∂z1(3)​​=δ1(3)​a1(2)​(8)
其中:δ1(3)=∂E∂z1(3)=∂E∂a1(3)∂a1(3)∂z1(3)=−(y1−a1(3))f′(z1(3))\delta_1^{(3)}= \frac{\partial E}{\partial z_{1}^{(3)}}= \frac{\partial E}{\partial a_{1}^{(3)}} \frac{\partial a_{1}^{(3)}}{\partial z_{1}^{(3)}} =-(y_1-a_1^{(3)})f^{'}(z_1^{(3)})δ1(3)​=∂z1(3)​∂E​=∂a1(3)​∂E​∂z1(3)​∂a1(3)​​=−(y1​−a1(3)​)f′(z1(3)​)

对于误差项δ\deltaδ(增量),引入他除了可以简化计算∂E∂w\frac{\partial E}{\partial w}∂w∂E​以外,更重要的是可以通过δ(l+1)\delta^{(l+1)}δ(l+1)来求解δ(l)\delta^{(l)}δ(l),这样可以便于理解和加快计算速度。

以下是输出层(L)(L)(L)计算误差项和梯度的矩阵形式(⊙表示矩阵中对应位置元素相乘)
δ(L)=−(y−a(L))⊙f′(z(L))△w(L)=δ(l)(a(L−1))T(9)\delta^{(L)}=-(y-a^{(L)})⊙f^{'}(z^{(L)})\\△w^{(L)}=\delta^{(l)}(a^{(L-1)})^T\\(9)δ(L)=−(y−a(L))⊙f′(z(L))△w(L)=δ(l)(a(L−1))T(9)
权重更新公式(α为学习率\alpha为学习率α为学习率):
w(L)=w(L)−α△w(L)(10)w^{(L)}=w^{(L)}-\alpha△w^{(L)}\\(10)w(L)=w(L)−α△w(L)(10)
再以隐藏层的w11(2)w_{11}^{(2)}w11(2)​为例,按照链式求导规则可以展开为两项和:
∂E∂w11(2)=∂E∂a1(3)∂a1(3)∂z1(3)∂z1(3)∂a1(2)∂a1(2)∂z1(2)∂z1(2)∂w11(2)+∂E∂a2(3)∂a2(3)∂z2(3)∂z2(3)∂a1(2)∂a1(2)∂z1(2)∂z1(2)∂w11(2)=−(y−a1(3))f′(z1(3))w11(3)f′(z1(2))x1−(y−a2(3))f′(z2(3))w21(3)f′(z1(2))x1=[(y−a1(3))f′(z1(3))w11(3)−(y−a2(3))f′(z2(3))w21(3)]f′(z1(2))x1=(δ1(3)w11(3)+δ2(3)w21(3))f′(z1(2))x1\frac{\partial E}{\partial w_{11}^{(2)}} \\ = \frac{\partial E}{\partial a_{1}^{(3)}} \frac{\partial a_{1}^{(3)}}{\partial z_{1}^{(3)}} \frac{\partial z_{1}^{(3)}}{\partial a_{1}^{(2)}} \frac{\partial a_{1}^{(2)}}{\partial z_{1}^{(2)}} \frac{\partial z_{1}^{(2)}}{\partial w_{11}^{(2)}} + \frac{\partial E}{\partial a_{2}^{(3)}} \frac{\partial a_{2}^{(3)}}{\partial z_{2}^{(3)}} \frac{\partial z_{2}^{(3)}}{\partial a_{1}^{(2)}} \frac{\partial a_{1}^{(2)}}{\partial z_{1}^{(2)}} \frac{\partial z_{1}^{(2)}}{\partial w_{11}^{(2)}}\\ = -(y-a_1^{(3)})f^{'}(z_1^{(3)})w_{11}^{(3)}f^{'}(z_1^{(2)})x1 - (y-a_2^{(3)})f^{'}(z_2^{(3)})w_{21}^{(3)}f^{'}(z_1^{(2)})x1\\ =\begin{bmatrix} (y-a_1^{(3)})f^{'}(z_1^{(3)})w_{11}^{(3)} - (y-a_2^{(3)})f^{'}(z_2^{(3)})w_{21}^{(3)} \end{bmatrix} f^{'}(z_1^{(2)})x1\\ =(\delta_1^{(3)}w_{11}^{(3)}+\delta_2^{(3)}w_{21}^{(3)})f^{'}(z_1^{(2)})x1∂w11(2)​∂E​=∂a1(3)​∂E​∂z1(3)​∂a1(3)​​∂a1(2)​∂z1(3)​​∂z1(2)​∂a1(2)​​∂w11(2)​∂z1(2)​​+∂a2(3)​∂E​∂z2(3)​∂a2(3)​​∂a1(2)​∂z2(3)​​∂z1(2)​∂a1(2)​​∂w11(2)​∂z1(2)​​=−(y−a1(3)​)f′(z1(3)​)w11(3)​f′(z1(2)​)x1−(y−a2(3)​)f′(z2(3)​)w21(3)​f′(z1(2)​)x1=[(y−a1(3)​)f′(z1(3)​)w11(3)​−(y−a2(3)​)f′(z2(3)​)w21(3)​​]f′(z1(2)​)x1=(δ1(3)​w11(3)​+δ2(3)​w21(3)​)f′(z1(2)​)x1 (12)(12)(12)

又因为:
∂E∂w11(2)=∂E∂z1(2)∂z1(2)∂w11(2)=δ1(2)x1\frac{\partial E}{\partial w_{11}^{(2)}} = \frac{\partial E}{\partial z_{1}^{(2)}} \frac{\partial z_{1}^{(2)}}{\partial w_{11}^{(2)}} = \delta_1^{(2)}x_1∂w11(2)​∂E​=∂z1(2)​∂E​∂w11(2)​∂z1(2)​​=δ1(2)​x1​ (13)(13)(13)
由(12)(13)(12)(13)(12)(13)可得:
∂E∂w11(2)=(δ1(3)w11(3)+δ2(3)w21(3))f′(z1(2))x1=δ1(2)x1\frac{\partial E}{\partial w_{11}^{(2)}}\\ =(\delta_1^{(3)}w_{11}^{(3)}+\delta_2^{(3)}w_{21}^{(3)})f^{'}(z_1^{(2)})x1\\ =\delta_1^{(2)}x_1∂w11(2)​∂E​=(δ1(3)​w11(3)​+δ2(3)​w21(3)​)f′(z1(2)​)x1=δ1(2)​x1​

从以上公式可以看出,第lll层的误差项可以通过第l+1l+1l+1层的误差项计算得到,这就是误差的反向传播。
反向传播算法的含义是:第lll层的一个神经元的误差项是所有与该神经元相连的第l+1l+1l+1层的神经元的误差项的权重和。然后,再乘上该神经元激活函数的梯度。
以矩阵的形式可以写为:
δ(l)=((W(l+1))Tδ(l+1))⊙f′(z(l))△w(L)=δ(L)XT(14)\delta^{(l)}=((W^{(l+1)})^T\delta^{(l+1)})⊙f^{'}(z^{(l)})\\ △w^{(L)}=\delta^{(L)}X^T\\ (14)δ(l)=((W(l+1))Tδ(l+1))⊙f′(z(l))△w(L)=δ(L)XT(14)

Python实现BP求解异或问题

# -*- coding: utf-8 -*-
import numpy as np


# 双曲正切函数,该函数为奇函数
def tanh(x):
    return np.tanh(x)


# tanh导函数性质:f'(t) = 1 - f(x)^2
def tanh_prime(x):
    return 1.0 - tanh(x) ** 2

class NeuralNetwork:
    def __init__(self, layers, activation='tanh'):
        """
        :参数layers: 神经网络的结构(输入层-隐含层-输出层包含的结点数列表)
        :参数activation: 激活函数类型
        """
        if activation == 'tanh':  # 也可以用其它的激活函数
            self.activation = tanh
            self.activation_prime = tanh_prime
        else:
            pass

        # 存储权值矩阵
        self.weights = []

        # range of weight values (-1,1)
        # 初始化输入层和隐含层之间的权值
        print('------------------', len(layers))    # 3
        for i in range(1, len(layers) - 1):
            # layer[i-1]+1 = layer[0]+1 = 2+1 = 3
            # layers[i] + 1 = layer[1]+1 = 3
            r = 2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1  # add 1 for bias node
            self.weights.append(r)

        # 初始化输出层权值
        r = 2 * np.random.random((layers[i] + 1, layers[i + 1])) - 1
        self.weights.append(r)

    def fit(self, X, Y, learning_rate=0.2, epochs=10000):
        # 将一列一加到X
        # 这是为了将偏置单元添加到输入层
        # np.hstack()将两个数组按水平方向组合起来, 4*2 --> 4*3
        X = np.hstack([np.ones((X.shape[0], 1)), X])

        for k in range(epochs):  # 训练固定次数
            # if k % 1000 == 0: print('epochs:', k)

            # 从区间中的离散均匀分布返回随机整数 [0, low).[0, 4)
            i = np.random.randint(X.shape[0], high=None)
            a = [X[i]]  # 从m个输入样本中随机选一组
            # len(self.weights) 2
            for l in range(len(self.weights)):
                # 每组输入样本(第一列未偏执值b)与权值进行矩阵相乘,a:1*3, weights:3*3 ---> 1*3
                dot_value = np.dot(a[l], self.weights[l])  # 权值矩阵中每一列代表该层中的一个结点与上一层所有结点之间的权值
                activation = self.activation(dot_value)     # 放入激活函数
                a.append(activation)

            '''
            反向传播算法的含义是:第l层的一个神经元的误差项delta(l)是
            所有与该神经元相连的第l+1层的神经元的误差项delta(l+1)的权重
            和。然后,再乘上该神经元激活函数的梯度。
            '''
            # 均方误差函数   E = 1/2 * (Y - a)**2
            # 反向递推计算delta:从输出层开始,先算出该层的delta,再向前计算
            error = Y[i] - a[-1]  # 计算输出层delta
            deltas = [error * self.activation_prime(a[-1])]

            # 从倒数第2层开始反向计算delta
            for l in range(len(a) - 2, 0, -1):
                deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_prime(a[l]))

            # [level3(output)->level2(hidden)]  => [level2(hidden)->level3(output)]
            deltas.reverse()  # 逆转列表中的元素

            # backpropagation
            # 1. 将其输出增量与输入激活相乘,得到权重的梯度。
            # 2. 从权重中减去渐变的比率(百分比)。
            for i in range(len(self.weights)):  # 逐层调整权值
                layer = np.atleast_2d(a[i])  # 将输入作为至少具有两个维度的数组查看
                delta = np.atleast_2d(deltas[i])
                self.weights[i] += learning_rate * np.dot(layer.T, delta)  # 每输入一次样本,就更新一次权值

    def predict(self, x):
        a = np.concatenate((np.ones(1), np.array(x)))  # a为输入向量(行向量)
        for l in range(0, len(self.weights)):  # 逐层计算输出
            a = self.activation(np.dot(a, self.weights[l]))
        return a


if __name__ == '__main__':
    nn = NeuralNetwork([2, 2, 1])  # 网络结构: 2输入1输出,1个隐含层(包含2个结点)

    X = np.array([[0, 0],  # 输入矩阵(每行代表一个样本,每列代表一个特征)
                  [0, 1],
                  [1, 0],
                  [1, 1]])
    Y = np.array([0, 1, 1, 0])  # 期望输出

    nn.fit(X, Y)  # 训练网络

    print('w:', nn.weights)  # 调整后的权值列表

    for s in X:
        print(s, nn.predict(s))  # 测试

运行结果:

在这里插入图片描述

从异或问题到前馈神经网络 (from XOR problem to FNN) KaTeX parse error: Undefined control sequence: \usepackage at position 1: \̲u̲s̲e̲p̲a̲c̲k̲a̲g̲e̲{amsmath} 关于非线性问题 Non-Linear Problem 有以下三种 solution 1 Non-Linear Transformation 非线性转化 ϕ:X→Z\phi:\mathcal{X}\to \mathcal{Z}ϕ:X→Z 即构造函数 ϕ\phiϕ,将 input space X\ma. 阅读详情

相关推荐

BP神经网络简单python实现

BP神经网络简单python实现 假设输入层有3个神经元,隐藏层有4个神经元,输出层有1个神经元,分析如何用3层(1输入层+1隐藏层+1输出层)BP神经网络来解决异或问题。

info_kerwin的博客 1484

机器学习——神经网络(五):BP神经网络解决异或问题

BP神经网络解决异或问题 BP神经网络的推导、python实现代码及结果视图请移至机器学习——神经网络(四):BP神经网络 单层感知器异或问题请移至机器学习——神经网络(二):单层感知机异或问题 python 3.6 numpy、matplotlib库 import numpy as np import matplotlib.pyplot as plt # 载入数据 x_data = np.array([[1,0,0], [1,0,1],

Liu Feng's Blog 4657

利用BP神经网络解决异或问题:Python实战教程

在BP神经网络中,要映射异或问题,需要构造一个可以学习并表示非线性决策边界的网络。BP神经网络通过多层处理单元(神经元)构成的网络结构来逼近复杂的函数映射。每个处理单元执行一个加权输入的总和,通过非线性激活函数转换成输出信号。对于异或问题,需要一个至少包含一个隐藏层的网络结构。隐藏层使得网络能够学习到输入数据的更复杂表示,从而能够解决异或问题。均方误差(MSE):是最常用的回归任务误差函数,计算预测值和真实值之间差值的平方的平均数。MSE对异常值敏感,因为它会将较大的误差进行平方。

weixin_35257663的博客 791

【机器学习基础】使用python实现BP算法

用pytorch跟tensorflow实现神经网络固然爽。但是想要深入学习神经网络,光学会调包是不够的,还是得亲自动手去实现一个神经网络,才能更好去理解。一、问题介绍传说中线性分类器无法...

fengdu78的博客 7250

BP神经网络解决异或问题的深度剖析

在人工智能领域,BP神经网络(Backpropagation Neural Network)是一个核心概念,它属于前馈神经网络的一种,通过反向传播算法实现网络权重的迭代优化。BP网络因其结构简单、学习能力强,被广泛应用于函数逼近、模式识别、数据分析等众多领域。接下来的章节将深入探讨BP神经网络的网络结构、权重调整、反向传播算法的原理和机制,以及在解决特定问题如异或问题中的应用方法。在讨论反向传播算法之前,首先需要理解损失函数。损失函数衡量的是模型预测值与实际值之间的差异。

weixin_34620658的博客 905

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2105

用BP神经网络解决异或问题

初步的神经网络入门分为三篇 1:神经网络简析 2:Back Propagation算法 3:用BP神经网络解决异或问题 这一篇主要是讲解一下关于用BP神经网络解决异或问题 对于我们的输入 [0,0],[0,1],[1,0],[1,1] 对于我们的输出 0或1 这里我们需要借用上一篇文章的一张图片 构建双层神经网络 #导入numpy import numpy as ...

weixin_43272605的博客 7235

VS Code + EIDE + Clangd 构建 Keil/MDK 嵌入式开发新范式

嵌入式C/C++开发长期受限于传统IDE的语法理解弱、导航卡顿、跨工程复用难等问题。Clangd作为基于AST的现代语言服务器,结合EIDE对Keil uVision和ARM MDK工程文件(.uvprojx)的深度解析能力,可将编译配置、芯片型号、内存模型、扩展关键字等语义精准翻译为标准compile_commands.json,从而实现智能跳转、宏展开识别、结构体实时展开等高阶编辑体验。该方案不替换Keil/MDK编译与烧录流程,仅升级代码理解层,天然兼容STC8051、STM32 Cortex-M、G

weixin_34321753的博客 352

【深度学习】2:BP算法原理,BP算法解决异或问题

BP神经网络介绍

zzZ_CMing的博客 9228

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5844

ZYNQ平台AXI DMA传输避坑指南:如何快速定位‘errors:200‘等中断故障

本文详细解析了ZYNQ平台AXI DMA传输中常见的'errors:200'等中断故障,提供了从寄存器解析到压力测试的完整解决方案。通过深入分析XILINX_DMA中断机制、错误分类及五步排查法,帮助开发者快速定位并解决DMA传输问题,提升系统稳定性与性能。

weixin_29159613的博客 439

BP神经网络Python实现异或问题

# -*- coding: UTF-8 -*- import matplotlib as mpl import numpy as np import matplotlib.pyplot as plt #BP神经网络实现异或问题 X=np.array([[1,0,0], [1,0,1], [1,1,0], [1,1

王猛的专栏 1935

ORB-SLAM3的Euroc数据集测试

(一)测试运行 不同模式测试过程(以MH_03为例) 1、pure mono 运行SLAM: cd ORB-SLAM3/Example #run slam ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH03 ./Monocular/EuRoC_TimeStamps/MH03.txt dataset-MH03_mono 利用ORB-SLAM3自带..

ljtx200888的博客 9146

python bp神经网络 异或_【神经网络】BP算法解决XOR异或问题MATLAB版

第一种%%%用神经网络解决异或问题clearclcclosems=4;%设置4个样本a=[0 0;0 1;1 0;1 1];%设置输入向量y=[0,1,1,0];%设置输出向量n=2;%输入量的个数m=3;%隐层量的个数k=1;%输出层的个数w=rand(n,m);%为输入层到隐层的权值赋初值v=rand(m,k);%为隐层到输出层的权值赋权值yyuzhi=rand(1,m);%为输入层到隐层的阈...

weixin_39548972的博客 1193

RK3568 NFS rootfs配置与调试实战指南(已验证)

本文提供了在RK3568开发板上配置NFS rootfs的完整实战指南。通过详细步骤讲解如何配置uboot的bootargs参数、编译支持NFS的内核,并在PC端搭建TFTP与NFS服务器,最终实现从网络挂载根文件系统,从而极大提升驱动调试和应用程序开发的迭代效率。

weixin_29175469的博客 282

无人机开发平台全解析:从开源飞控到企业级应用实战指南

无人机开发平台是无人机从飞行器演变为智能空中机器人的核心,其本质是提供了一套标准化的软硬件接口与工具链,使开发者能够基于稳定可靠的底层系统,专注于上层应用创新。从技术原理上看,一个完整的开发平台通常包含飞行控制器、机载计算机、传感器套件等硬件层,以及飞控固件、机器人操作系统(ROS/ROS 2)、软件开发套件(SDK)等软件层,通过分层架构实现飞行控制、感知决策与任务执行的解耦。其技术价值在于大幅降低了无人机行业应用的开发门槛,使开发者无需从零构建飞行控制系统,即可快速实现自动巡检、精准农业、物流配送等复杂

weixin_28712491的博客 412

三层BP神经网络的python实现

这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络。 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏层的节点数,看节点数增加了,预测的精度会否提升 import math import random import string random.seed(0) # 生成...

不二的博客 6211

三菱FX5U-PLC建立CClink的IO通讯

最新需要用三菱的FX5U的PLC搭建一个CClink通讯,PLC做主站,控制CClink从站的IO,下面2个输入模块AJ65SBTB1-32D,两个输出模块AJ65SBTB1-32T。3、在右侧的部件,选择网络模块:FX5-CCL-MS,CC-link主站模块。依次把加入两个AJ65SBTB1-32D,两个AJ65SBTB1-32T。7、基本设置,网络配置设置,链路刷新设置,设置好下面参数,应用。6、基本设置,网络配置设置,CC-Link配置设置。8、部件选择,模块,右键,添加模块标签。

wzz418550729的博客 1001

用python实现BP算法 判别异或

BP算法第一次简单实现,遇到了很多问题就记录下来了。

qq_43235540的博客 2685

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

BP神经网络原理与异或实例分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录BP神经网络原理介绍一、BP神经网络算法原理是什么?二、激活函数1.激活函数作用三、BP神经网络异或实例分析1.问题:2.分析:3.代码总结 BP神经网络原理介绍 BP神经网络算法(Back-Propagation Neural Network) 一、BP神经网络算法原理是什

阿宾的地盘儿 2216

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python bp神经网络 异或_BP神经网络求解异或问题(Python实现)

反向传播算法(Back Propagation)分二步进行,即正向传播和反向传播。这两个过程简述如下:1.正向传播输入的样本从输入层经过隐单元一层一层进行处理,传向输出层;在逐层处理的过程中。在输出层把当前输出和期望输出进行比较,如果现行输出不等于期望输出,则进入反向传播过程。2.反向传播反向传播时,把误差信号按原来正向传播的通路反向传回,逐层修改连接权值,以望代价函数趋向最小。下面以单隐层的神经...

weixin_39596668的博客 768

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

BP神经网络(python代码)

神经网络是深度学习的基础。个人理解神经网络就是可以拟合任何一种广义线性模型的结构,本文主要记录python代码的学习笔记。

骆驼分析师的博客 1万+

用pytorch实现 bp网络 判别异或

用pytorch实现bp网络---判别异或

qq_43235540的博客 1908

python3_实现BP神经网络 + BP神经网络应用实例

1.BP神经网络简介 BP神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。 优点:具有任意复杂的模式分类能力和优良的多维函数映射能力,解决了简单感知器不能解决的异或或者一些其他的问题。从结构上讲,BP神经网络具有输入层、隐含层和输出层;从本质上讲,BP算法就是以网络误差平方目标函数...

也许有一天我们再相逢 睁开眼睛看清楚 我才是英雄! 6万+

深度学习之bp算法介绍及python代码实现

目录1.bp算法介绍1.1 背景1.2 多层向前神经网络(Multilayer Feed-Forward Neural Network)1.3 神经网络结构的设计1.4 bp算法过程1.4.1 初始化1.4.2 正向更新神经元值1.4.3 反向更新权重与阈值1.4.4 算法停止1.5 bp算法举例2.bp算法理论推导3.bp算法代码举例新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右Smarty

Hariod的博客 7511

人工智能学习——神经网络(matlab+python实现)

神经网络 文章目录神经网络前言一、神经网络理论知识二、matlab实现神经网络1.引入库2.读入数据三、python实现神经网络1.引入库总结 前言 此文章仅作为个人学习笔记使用,主要介绍理论以及学习过程,仅供参考! 一、神经网络理论知识 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、matlab实现神经网络 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.p

m0_57171062的博客 1万+
上一篇: 共计10万余字!数据结构知识详细梳理!
下一篇: VSCode扩展工具Copilot MCP使用教程【MCP】
UniqueUnit
博客等级 码龄9年 4万+粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值