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

news2024/12/23 22:45:09

BP神经网络

符号及其含义

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

在这里插入图片描述

图 1 图1 1
显然,图1所示神经网络的第2层神经元的状态及激活值可以通过下面的计算得到:
z 1 ( 2 ) = w 11 ( 2 ) x 1 + w 12 ( 2 ) x 2 + w 13 ( 2 ) x 3 + b 1 ( 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)
z 2 ( 2 ) = w 21 ( 2 ) x 1 + w 22 ( 2 ) x 2 + w 23 ( 2 ) x 3 + b 2 ( 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)
z 3 ( 2 ) = w 31 ( 2 ) x 1 + w 32 ( 2 ) x 2 + w 33 ( 2 ) x 3 + b 3 ( 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)
a 1 ( 2 ) = f ( z 1 ( 2 ) ) a_1^{(2)}=f(z_1^{(2)}) a1(2)=f(z1(2))
a 2 ( 2 ) = f ( z 2 ( 2 ) ) a_2^{(2)}=f(z_2^{(2)}) a2(2)=f(z2(2))
a 3 ( 2 ) = f ( z 3 ( 2 ) ) a_3^{(2)}=f(z_3^{(2)}) a3(2)=f(z3(2))
( 1 ) (1) (1)
类似地,第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 ) 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)
z 2 ( 3 ) = w 21 ( 3 ) a 1 ( 2 ) + w 22 ( 3 ) a 2 ( 2 ) + w 23 ( 3 ) a 3 ( 2 ) + b 2 ( 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)
a 1 ( 3 ) = f ( z 1 ( 3 ) ) a_1^{(3)}=f(z_1^{(3)}) a1(3)=f(z1(3))
a 2 ( 3 ) = f ( z 2 ( 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(l1)+b(l)(3)

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

对于误差项 δ \delta δ(增量),引入他除了可以简化计算 ∂ E ∂ w \frac{\partial E}{\partial w} wE以外,更重要的是可以通过 δ ( 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)=(ya(L))f(z(L))w(L)=δ(l)(a(L1))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)
再以隐藏层的 w 11 ( 2 ) w_{11}^{(2)} w11(2)为例,按照链式求导规则可以展开为两项和:
∂ E ∂ w 11 ( 2 ) = ∂ E ∂ a 1 ( 3 ) ∂ a 1 ( 3 ) ∂ z 1 ( 3 ) ∂ z 1 ( 3 ) ∂ a 1 ( 2 ) ∂ a 1 ( 2 ) ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 2 ) + ∂ E ∂ a 2 ( 3 ) ∂ a 2 ( 3 ) ∂ z 2 ( 3 ) ∂ z 2 ( 3 ) ∂ a 1 ( 2 ) ∂ a 1 ( 2 ) ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 2 ) = − ( y − a 1 ( 3 ) ) f ′ ( z 1 ( 3 ) ) w 11 ( 3 ) f ′ ( z 1 ( 2 ) ) x 1 − ( y − a 2 ( 3 ) ) f ′ ( z 2 ( 3 ) ) w 21 ( 3 ) f ′ ( z 1 ( 2 ) ) x 1 = [ ( y − a 1 ( 3 ) ) f ′ ( z 1 ( 3 ) ) w 11 ( 3 ) − ( y − a 2 ( 3 ) ) f ′ ( z 2 ( 3 ) ) w 21 ( 3 ) ] f ′ ( z 1 ( 2 ) ) x 1 = ( δ 1 ( 3 ) w 11 ( 3 ) + δ 2 ( 3 ) w 21 ( 3 ) ) f ′ ( z 1 ( 2 ) ) x 1 \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)Ez1(3)a1(3)a1(2)z1(3)z1(2)a1(2)w11(2)z1(2)+a2(3)Ez2(3)a2(3)a1(2)z2(3)z1(2)a1(2)w11(2)z1(2)=(ya1(3))f(z1(3))w11(3)f(z1(2))x1(ya2(3))f(z2(3))w21(3)f(z1(2))x1=[(ya1(3))f(z1(3))w11(3)(ya2(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 ∂ w 11 ( 2 ) = ∂ E ∂ z 1 ( 2 ) ∂ z 1 ( 2 ) ∂ w 11 ( 2 ) = δ 1 ( 2 ) x 1 \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)Ew11(2)z1(2)=δ1(2)x1 ( 13 ) (13) (13)
( 12 ) ( 13 ) (12)(13) (12)(13)可得:
∂ E ∂ w 11 ( 2 ) = ( δ 1 ( 3 ) w 11 ( 3 ) + δ 2 ( 3 ) w 21 ( 3 ) ) f ′ ( z 1 ( 2 ) ) x 1 = δ 1 ( 2 ) x 1 \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

从以上公式可以看出,第 l l l层的误差项可以通过第 l + 1 l+1 l+1层的误差项计算得到,这就是误差的反向传播。
反向传播算法的含义是:第 l l l层的一个神经元的误差项是所有与该神经元相连的第 l + 1 l+1 l+1层的神经元的误差项的权重和。然后,再乘上该神经元激活函数的梯度。
以矩阵的形式可以写为:
δ ( l ) = ( ( W ( l + 1 ) ) T δ ( l + 1 ) ) ⊙ f ′ ( z ( l ) ) △ w ( L ) = δ ( L ) X T ( 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))  # 测试

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于tensorflow的ResNet50V2网络识别动物

前言 之前很多人在&#xff0c;如何进行XXX的识别&#xff0c;对应的神经网络如何搭建。对应神经网络怎么搭建&#xff0c;我也是照本宣科&#xff0c;只能说看得懂而已&#xff0c;没有对这块进行深入的研究&#xff0c;但是现在tensorflow&#xff0c;paddle这些工具&#x…

长期稳定的项目—steam搬砖

大家好&#xff0c;我是阿阳 steam搬砖项目一直稳稳定定的进行着&#xff0c;有些朋友基本都观察了近2年 所以很多人问我公众号的项目是不能做了吗&#xff1f;怎么最近做新的去了&#xff1f;很明显这是几乎不可能的事情&#xff0c;steam做2年了&#xff0c;本公众号都能翻到…

这几个数据分析项目,让我看到了什么才叫专业!!

大家好&#xff0c;我是小一 新的一周又来了&#xff0c;从今天开始&#xff0c;会出一个新的系列《数分实验室》 实验室会介绍一些有内核、有科技的数据分析实战项目。 项目数据集、源代码都是公开的&#xff0c;非常适合想练手但是又没数据、没参考案例的同学 今天先热热…

ES的基础概念

1、ES是什么 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作:分布式实时文件存储&am…

6-1分支限界法

6-1分支限界法 1.分支限界法与回溯法的不同 &#xff08;1&#xff09;求解目标: 回溯法的求解目标是找出解空间树中满足约束条件的所有解&#xff08;或一个最优解&#xff09;&#xff0c; 而分支限界法的求解目标则是找出满足约束条件的一个解&#xff08;或最优解&#x…

组织机器学习代码

组织机器学习代码 从note本转移到 Python 脚本时组织代码。 Intuition 有组织的代码就是有可读的、可重现的、健壮的代码。您的团队、经理&#xff0c;最重要的是&#xff0c;您未来的自己&#xff0c;将感谢您为组织工作付出的最初努力。在本课中&#xff0c;将讨论如何将代码…

pytest测试框架入门1

pytest单元测试框架 单元测试是指在软件开发当中&#xff0c;针对软件的最小单位&#xff08;函数&#xff0c;方法&#xff09;进行正确性的检查测试 单元测试框架主要做什么 测试发现&#xff1a;从多个文件里面找到我们的测试用例测试执行&#xff1a;按照一定的顺序和规则…

初学者指南: 使用NumPy数组进行图像处理

这里写自定义目录标题初学者指南: 使用NumPy数组进行图像处理1、加载图像2、裁剪图像3、分离颜色4、转换5、灰度转换6、图像分割结语初学者指南: 使用NumPy数组进行图像处理 由于图像也可以被视为由数组组成&#xff0c;因此我们也可以使用NumPy执行不同的图像处理任务。在本文…

【Lilishop商城】No2-6.确定软件架构搭建五(本篇包括定时任务xxl-job)

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑&#xff0c;具体编写看源代码就行&#xff0c;读起来也不复杂~ 谨慎&#xf…

如何配置一台适合oc渲染器的电脑?

众所周知&#xff0c;Octane 是最流行的渲染引擎之一。此外&#xff0c;Octane 是一个 GPU 渲染引擎&#xff0c;它使用一种计算最终生成的图片的方法&#xff0c;试图达到照片般的真实感。Octane 是一种利用 GPU 技术的无偏渲染引擎&#xff0c;非常接近物理精度。一台好的 PC…

计算机组成原理习题课第三章-2(唐朔飞)

计算机组成原理习题课第三章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

天宇优配|平台助企“抱团出海” “小而美”中觅“先机”

天津华图轿车物流有限公司一批二手新能源车从连云港装船发往阿联酋迪拜。&#xff08;采访方针供图&#xff09; 最近&#xff0c;一笔100.8万美元的出口信誉稳妥保单融资借款&#xff0c;被划到了天津华图轿车物流有限公司的账户上。正值客户“下单”高峰期&#xff0c;这笔及…

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)&#xff08;一&#xff09; 本文目录&#xff1a; 一、【旋转的精灵女孩】案例运行效果 二、Three.js简介 三、Three.js代码正常运行显示条件 &#xff08;1&#xff09;不载入任何纹理贴图的网页 &#xff08;2&…

双十二蓝牙耳机啥牌子好?2022年度热销蓝牙耳机排名

这期双十二数码好物分享&#xff0c;工作室打算来跟大家说说蓝牙耳机这个话题&#xff0c;它已经成为出行必带的装备&#xff0c;上班族、学生党、游戏党都离不开蓝牙耳机。今年我们测评过数十款型号了&#xff0c;本期我们盘点了今年热销的蓝牙耳机排名&#xff0c;让大家直观…

【学习笔记】《Python深度学习》第五章:深度学习用于计算机视觉

文章目录1 卷积神经网络简介1.1 卷积运算1.2 最大池化运算2 在小型数据集上从头开始训练一个卷积神经网络2.1 下载数据2.2 构建网络2.3 数据预处理2.4 数据增强3 使用预训练的卷积神经网络3.1 特征提取3.2 微调模型3.3 小结4 卷积神经网络的可视化4.1 可视化中间激活4.2 可视化…

新手想开一个传奇该如何操作?开一个传奇必须掌握哪些知识要点

对于这个问题&#xff0c;近期问的人比较多&#xff0c;相比这也是热爱传奇这个游戏的朋友会问到的一个问题&#xff0c;因为喜欢玩这个游戏&#xff0c;也想要自己去开一个 经营一个 不管是电脑端也好 还是手机端也好&#xff0c;但是对于一些新手确实不知道该如何开始操作 从…

H3C opsf/rip/ftp/telent/nat/acl综合

实验拓扑 拓扑下载 https://sharewh2.xuexi365.com/share/84b85b32-acb7-4f62-a389-6188680a19f3?t3 图 1-1 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备…

三天入门Redis【快速浏览版】

文章目录第一天1.1 Redis基础1.1.1 NoSql引入1.1.2 NoSql特点1.1.3 NoSql数据库1.1.4 Redis概述1.1.5 Redis文件的作用1.1.6 Redis相关介绍1.2 常用的五大类型及操作⭐️1.2.1 Redis键&#xff08;key&#xff09;1.2.2 库的一些操作1.2.3 Redis字符串1.2.4 Redis列表&#xff…

MATLAB数据导入

MATLAB数据导入 在编写一个程序时&#xff0c;经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。 MATLAB中导入数据的方式有两种&#xff0c;分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第…

ASCHIP_ISP Tool 工具 使用与更新

系列文章目录 ASCHIP-ISP Tool 版本1 2022 11 26ASCHIP-ISP Tool 版本1 使用说明 2022 11 26 软件介绍 对窗体进行初步配置&#xff0c;配置其大小与显示 一&#xff1a;软件介绍 ASCHIP_ISP Tool 工具是用于具有 ISP 功能型号类型的单片机进行 ISP 更新程序开发实验的配套上位…