深度学习 | 前馈神经网络与反向传播算法

news2024/12/23 10:52:15

目录

一、Logistic函数

二、前馈神经网络(FNN)

三、反向传播算法(BP算法)

​四、基于前馈神经网络的手写体数字识别


一、Logistic函数

Logistic函数是学习前馈神经网络的基础。所以在介绍前馈神经网络之前,我们首先来看一看Logistic函数。

Logistic函数定义为:

\sigma \left ( x \right )=\frac{1}{1+exp\left ( -x \right )}

Logistic函数可以看成是一个“挤压”函数, 把一个实数域的输入“挤压”到(0,1)。当输入值在0附近时。Sigmoid型函数近似为线性函数;当输入值靠近两侧时,对输入进行抑制。输入越小,越接近于0;输入越大,越接近于1。

这样的特点也和生物神经元类似,对一些输入会产生兴奋(输入为1),对另一些输入产生抑制(输出为0)。和感知器使用的阶跃激活函数相比,Logistic函数是连续可导的,其数学性质更好。

因为Logistic函数的性质,使得装备了Logistic激活函数的神经元具有以下两点性质:

(1)其输出直接可以看作概率分布,使得神经网络可以更好地和统计学习模型进行结合;

(2)其可以看作一个软性门,用来控制其他神经元输出信息的数量。

Logistic函数的导数为\sigma ^{'}\left ( x \right )=\sigma \left ( x \right )\left ( 1-\sigma \left ( x \right ) \right ),其推导过程如下:

\sigma \left ( x \right )=\frac{1}{1+e^{-x}}

\sigma ^{'}\left ( x \right )=\frac{e^{-x}}{\left ( 1+e^{-x} \right )^{2}}

=\frac{1+e^{-x}}{\left ( 1+e^{-x} \right )^{2}}-\frac{1}{\left ( 1+e^{-x} \right )^{2}}

=\frac{1}{1+e^{-x}}-\frac{1}{\left ( 1+e^{-x} \right )^{2}}

=\frac{1}{1+e^{-x}}\left ( 1-\frac{1}{1+e^{-x}} \right )

=\sigma \left ( x \right )\left ( 1-\sigma \left ( x \right ) \right )

Logistic函数的图像如下:

二、前馈神经网络(FNN)

前馈神经网络其实是由多层的Logistic回归模型(连续的非线性函数)组成,而不是由多层的感知器(不连续的非线性函数)组成。

在前馈神经网络中, 各神经元分别属于不同的层。每一层的神经元可以接收前一层神经元的信号,并产生信号输出到下一层。第0层称为输入层,最后一层称为输出层,其他中间层称为隐藏层。整个网络中无反馈,信号从输入层向输出层单向传递,可用一个有向无环图表示。

接下来,我们以下面的一个神经网络为例,推导前馈神经网络的数学模型。

图中,a_{i}^{\left ( j \right )}代表第j层第i个神经元的活性值,\Theta ^{\left ( j \right )}代表控制激活函数从第j层映射到第j+1层的权重矩阵。 

这里的激活函数我们使用的是Logistic函数,这里我们用g(x)表示。

因此,有:

x=\begin{bmatrix} x_{0}\\ x_{1}\\ x_{2} \end{bmatrix}=a^{(1)}=\begin{bmatrix} a_{0}^{(1)}\\ a_{1}^{(1)}\\ a_{2}^{(1)} \end{bmatrix}

x_{0}=1 , a_{0}^{(1)}=1 

\Theta ^{(1)}=\begin{bmatrix} \Theta _{10}^{(1)} & \Theta _{11}^{(1)} &\Theta _{12}^{(1)} \\ \Theta _{20}^{(1)} & \Theta _{21}^{(1)} & \Theta _{22}^{(1)} \end{bmatrix} 

z_{1}^{(2)}=\Theta _{10}^{(1)}a_{0}^{(1)}+\Theta _{11}^{(1)}a_{1}^{(1)}+\Theta _{12}^{(1)}a_{2}^{(1)} 

z_{2}^{(2)}=\Theta _{20}^{(1)}a_{0}^{(1)}+\Theta _{21}^{(1)}a_{1}^{(1)}+\Theta _{22}^{(1)}a_{2}^{(1)} 

a_{1}^{(2)}=g(z_{1}^{(2)}) 

a_{2}^{(2)}=g(z_{2}^{(2)}) 

a^{(2)}=\begin{bmatrix} 1\\ a^{(2)} \end{bmatrix}=\begin{bmatrix} a_{0}^{(2)}\\ a_{1}^{(2)}\\ a_{2}^{(2)} \end{bmatrix} 

 \Theta ^{(2)}=\begin{bmatrix} \Theta _{10}^{(2)} & \Theta _{11}^{(2)} &\Theta _{12}^{(2)} \\ \Theta _{20}^{(2)} & \Theta _{21}^{(2)} & \Theta _{22}^{(2)} \end{bmatrix}

 z_{1}^{(3)}=\Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{11}^{(2)}a_{1}^{(2)}+\Theta _{12}^{(2)}a_{2}^{(2)}

z_{2}^{(3)}=\Theta _{20}^{(2)}a_{0}^{(2)}+\Theta _{21}^{(2)}a_{1}^{(2)}+\Theta _{22}^{(2)}a_{2}^{(2)}

a_{1}^{(3)}=g(z_{1}^{(3)})

a_{2}^{(3)}=g(z_{2}^{(3)})

a^{(3)}=\begin{bmatrix} 1\\ a^{(3)} \end{bmatrix}=\begin{bmatrix} a_{0}^{(3)}\\ a_{1}^{(3)}\\ a_{2}^{(3)} \end{bmatrix} 

 \Theta ^{(3)}=\begin{bmatrix} \Theta _{10}^{(3)} & \Theta _{11}^{(3)} & \Theta _{12}^{(3)} \end{bmatrix}

z_{1}^{(4)}=\Theta _{10}^{(3)}a_{0}^{(3)}+\Theta _{11}^{(3)}a_{1}^{(3)}+\Theta _{12}^{(3)}a_{2}^{(3)}

a_{1}^{(4)}=g(z_{1}^{(4)})

我们也可以将上面的公式写成向量的形式:

 z^{(2)}=\begin{bmatrix} z_{1}^{(2)}\\ z_{2}^{(2)} \end{bmatrix} , a^{(2)}=\begin{bmatrix} a_{1}^{(2)}\\ a_{2}^{(2)} \end{bmatrix}

z^{(2)}=\Theta ^{(1)}a^{(1)}

a^{(2)}=g(z^{(2)})

 z^{(3)}=\begin{bmatrix} z_{1}^{(3)}\\ z_{2}^{(3)} \end{bmatrix} , a^{(3)}=\begin{bmatrix} a_{1}^{(3)}\\ a_{2}^{(3)} \end{bmatrix}

z^{(3)}=\Theta ^{(2)}a^{(2)}

a^{(3)}=g(z^{(3)})

z^{(4)}=\begin{bmatrix} z_{1}^{(4)} \end{bmatrix} , a^{(4)}=\begin{bmatrix} a_{1}^{(4)} \end{bmatrix}

 z^{(4)}=\Theta ^{(3)}a^{(3)}

a^{(4)}=g(z^{(4)})

因此,该前馈神经网络最后的输出值为:

h_{\Theta }(x^{(i)})=a^{(4)}

                      =g(z^{(4)})

                              =g(\Theta ^{(3)}a^{(3)})

                                    =g(\Theta ^{(3)}g(z^{(3)}))

                                           =g(\Theta ^{(3)}g(\Theta ^{(2)}a^{(2)}))

                                                 =g(\Theta ^{(3)}g(\Theta ^{(2)}g(z^{(2)})))

                                                         =g(\Theta ^{(3)}g(\Theta ^{(2)}g(\Theta ^{(1)}a^{(1)}))) 

可以看出,这是一个复合函数

三、反向传播算法(BP算法)

这里,我们还是使用上面的神经网络模型:

这里,\delta _{j}^{(l)}代表第l层第j个神经元的误差。

该神经网络的损失函数为:

J(\Theta )=-\frac{1}{m}\sum_{i=1}^{m}\left [ y^{(i)}logh_{\Theta }(x^{(i)})+(1-y^{(i)})log(1-h_{\Theta }(x^{(i)})) \right ]+\frac{\lambda }{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_{l}}\sum_{j=1}^{s_{l+1}}(\Theta _{ji}^{(l)})^{2}

这里,我们令 cost(i)=-\left [ y^{(i)}logh_{\Theta }(x^{(i)})+(1-y^{(i)})log(1-h_{\Theta }(x^{(i)})) \right ],并且有cost(i)\approx (h_{\Theta }(x^{(i)})-y^{(i)})^{2},在不考虑正则项的情况下,有:

\frac{\partial }{\partial\Theta _{ij}^{(l)} }J(\Theta )=\frac{1}{m}\frac{\partial }{\partial\Theta _{ij}^{(l)} }cost(I)

 于是,反向传播算法的推导过程如下:

首先,令

\delta _{j}^{(4)}=a_{j}^{(4)}-y_{j}=(h_{\Theta }(x))_{j}-y_{j}

\delta ^{(4)}=a^{(4)}-y(=预测值-真实值) 

根据链式求导法则有:

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(3)}}=\frac{\partial cost(I)}{\partial z^{(4)}}\cdot \frac{\partial z^{(4)}}{\partial \Theta _{ij}^{(3)}}

由于 

z^{(4)}=\Theta _{10}^{(3)}a_{0}^{(3)}+\Theta _{11}^{(3)}a_{1}^{(3)}+\Theta _{12}^{(3)}a_{2}^{(3)}

 \frac{\partial z^{(4)}}{\partial \Theta _{ij}^{(3)}}=a_{j}^{(3)}

由于

cost(I)=-\left [ y^{(i)}logh_{\Theta }(x^{(i)})+(1-y^{(i)})log(1-h_{\Theta }(x^{(i)})) \right ]

\frac{\partial cost(I)}{\partial z^{(4)}}=-[y^{(i)}\cdot \frac{1}{g(z^{(4)})}g^{'}(z^{(4)})+(1-y^{(i)})\cdot \frac{1}{1-g(z^{(4)})}(-g^{'}(z^{(4)}))]

 =-[y^{(i)}\cdot \frac{1}{g(z^{(4)})}g(z^{(4)})(1-g(z^{(4)}))-(1-y^{(i)})\cdot \frac{1}{1-g(z^{(4)})}\cdot g(z^{(4)})\cdot (1-g(z^{(4)}))]

              =-[y^{(i)}(1-g(z^{(4)}))-(1-y^{(i)})\cdot g(z^{(4)})]

              =-[y^{(i)}-y^{(i)}g(z^{(4)})-g(z^{(4)})+y^{(i)}g(z^{(4)})]

              =g(z^{(4)})-y^{(i)}

              =h_{\Theta }(x^{(i)})-y^{(i)}

              =\delta ^{(4)}

因此,

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(3)}}=\delta ^{(4)}a_{j}^{(3)}

接下来,我们先来推导一下\delta ^{(3)}

首先,\delta ^{(3)}=\frac{\partial cost(I)}{\partial z^{(3)}}

根据链式求导法则,有:

 \frac{\partial cost(I)}{\partial z^{(3)}}=\frac{\partial cost(I)}{\partial z^{(4)}}\cdot \frac{\partial z^{(4)}}{\partial z^{(3)}}

已知\frac{\partial cost(I)}{\partial z^{(4)}}=\delta ^{(4)}

又由于

z^{(4)}=\Theta ^{(3)}a^{(3)}=\Theta ^{(3)}g(z^{(3)}) 

故有:

\frac{\partial z^{(4)}}{\partial z^{(3)}}=\Theta ^{(3)}g^{'}(z^{(3)})

因此,有:

\delta ^{(3)}=\delta ^{(4)}\cdot \Theta ^{(3)}g^{'}(z^{(3)}) 

接着,再推导\delta ^{(2)}

 \frac{\partial cost(I)}{\partial z^{(2)}}=\frac{\partial cost(I)}{\partial z^{(4)}}\cdot \frac{\partial z^{(4)}}{\partial z^{(3)}}\cdot \frac{\partial z^{(3)}}{\partial z^{(2)}}

已知 \frac{\partial cost(I)}{\partial z^{(4)}}=\delta ^{(4)}\frac{\partial z^{(4)}}{\partial z^{(3)}}=\Theta ^{(3)}g^{'}(z^{(3)})

又由于

z^{(3)}=\Theta ^{(2)}a^{(2)}=\Theta ^{(2)}g(z^{(2)})

故有:

\frac{\partial z^{(3)}}{\partial z^{(2)}}=\Theta ^{(2)}g^{'}(z^{(2)}) 

因此,有:

\delta ^{(2)}=\delta ^{(4)}\cdot\Theta ^{(3)}g^{'}(z^{(3)})\cdot \Theta ^{(2)}g^{'}(z^{(2)})=\delta ^{(3)}\cdot \Theta ^{(2)}g^{'}(z^{(2)}) 

下面继续推导 \frac{\partial cost(I)}{\partial \Theta _{ij}^{(2)}}:

由链式求导法则有:

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(2)}}=\frac{\partial cost(I)}{\partial z^{(4)}}\cdot \frac{\partial z^{(4)}}{\partial z^{(3)}}\cdot \frac{\partial z^{(3)}}{\partial \Theta _{ij}^{(2)}}

已知 \frac{\partial cost(I)}{\partial z^{(4)}}=\delta ^{(4)}\frac{\partial z^{(4)}}{\partial z^{(3)}}=\Theta ^{(3)}g^{'}(z^{(3)})

又由于

z_{1}^{(3)}=\Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{11}^{(2)}a_{1}^{(2)}+\Theta _{12}^{(2)}a_{2}^{(2)}

 z_{2}^{(3)}=\Theta _{20}^{(2)}a_{0}^{(2)}+\Theta _{21}^{(2)}a_{1}^{(2)}+\Theta _{22}^{(2)}a_{2}^{(2)}

故有:

\frac{\partial z^{(3)}}{\partial \Theta _{ij}^{(2)}}=a_{j}^{(2)}

因此, 

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(2)}}=\delta ^{(4)}\cdot\Theta ^{(3)}g^{'}(z^{(3)})\cdot a_{j}^{(2)}=\delta ^{(3)}a_{j}^{(2)}

接着,继续推导\frac{\partial cost(I)}{\partial \Theta _{ij}^{(1)}}

由链式求导法则有:

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(1)}}=\frac{\partial cost(I)}{\partial z^{(4)}}\cdot \frac{\partial z^{(4)}}{\partial z^{(3)}}\cdot \frac{\partial z^{(3)}}{\partial z^{(2)}}\cdot \frac{\partial z^{(2)}}{\partial \Theta _{ij}^{(1)}}

已知 \frac{\partial cost(I)}{\partial z^{(4)}}=\delta ^{(4)}\frac{\partial z^{(4)}}{\partial z^{(3)}}=\Theta ^{(3)}g^{'}(z^{(3)})\frac{\partial z^{(3)}}{\partial z^{(2)}}=\Theta ^{(2)}g^{'}(z^{(2)})

又由于

z_{1}^{(2)}=\Theta _{10}^{(1)}a_{0}^{(1)}+\Theta _{11}^{(1)}a_{1}^{(1)}+\Theta _{12}^{(1)}a_{2}^{(1)}

z_{2}^{(2)}=\Theta _{20}^{(1)}a_{0}^{(1)}+\Theta _{21}^{(1)}a_{1}^{(1)}+\Theta _{22}^{(1)}a_{2}^{(1)}

故有:

\frac{\partial z^{(2)}}{\partial \Theta _{ij}^{(1)}}=a_{j}^{(1)} 

因此,

 \frac{\partial cost(I)}{\partial \Theta _{ij}^{(1)}}=\delta ^{(4)}\cdot\Theta ^{(3)}g^{'}(z^{(3)})\cdot\Theta ^{(2)}g^{'}(z^{(2)})\cdot a_{j}^{(1)}

                                                   =\delta ^{(3)}\cdot \Theta ^{(2)}g^{'}(z^{(2)})\cdot a_{j}^{(1)}

                                                   =\delta ^{(2)}a_{j}^{(1)}

综上,有:

 \frac{\partial cost(I)}{\partial \Theta _{ij}^{(3)}}=\delta ^{(4)}a_{j}^{(3)}

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(2)}}=\delta ^{(3)}a_{j}^{(2)}

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(1)}}=\delta ^{(2)}a_{j}^{(1)}

因此,有:

\frac{\partial cost(I)}{\partial \Theta _{ij}^{(l)}}=\delta ^{(l+1)}a_{j}^{(l)}

四、基于前馈神经网络的手写体数字识别

首先查看手写体数据集情况:

from scipy.io import loadmat

data=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11data.mat")
X=data['X']
y=data['y']
print('X type:',type(X))
print('X shape:',X.shape)
print('y type:',type(y))
print('y shape:',y.shape)
X type: <class 'numpy.ndarray'>
X shape: (5000, 400)
y type: <class 'numpy.ndarray'>
y shape: (5000, 1)

接着,从数据集中随机选取100行并转化成图片:

from random import sample
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

'''随机选取100行'''
r=[int(i) for i in range(5000)]
R=sample(r,100)
X_choose=np.zeros((100,400))
for i in range(100):
    X_choose[i,:]=X[R[i],:]
    
'''将随机选取的100行数据分别转换成20X20的矩阵形式'''
X_matrix=[X_choose[i].reshape([20,20]).T for i in range(100)]

'''转换成图片'''
fig=plt.figure()
for i in range(100):
    ax=fig.add_subplot(10,10,i+1)
    ax.imshow(X_matrix[i],interpolation='nearest')
plt.show()

查看已经训练好的权重数据集情况:

from scipy.io import loadmat

weights=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11weights.mat")
theta1=weights['Theta1']
theta2=weights['Theta2']
print('theta1 tyep:',type(theta1))
print('theta1 shape:',theta1.shape)
print('theta2 type:',type(theta2))
print('tehta2 shape:',theta2.shape)
theta1 tyep: <class 'numpy.ndarray'>
theta1 shape: (25, 401)
theta2 type: <class 'numpy.ndarray'>
tehta2 shape: (10, 26)

计算前馈神经网络对手写体数字识别的准确率:

'''添加元素1'''
X0=X.tolist()
for i in range(5000):
    X0[i].insert(0,1)
X1=np.array(X0)

'''进行神经网络的第一层计算'''
Z1=[]   #5000 date of second layer
for i in range(5000):
    a=np.dot(theta1,X1[i].T)
    z1=(a.T).tolist()
    Z1.append(z1)

'''计算逻辑函数值'''
Y1=[]
for i in range(5000):
    y0=[]
    for j in range(25):
        b=1/(1+np.exp(-Z1[i][j]))
        y0.append(b)
    Y1.append(y0)


'''添加元素1'''
for i in range(5000):
    Y1[i].insert(0,1)
Y2=np.array(Y1)

'''进行神经网络的第二层计算'''
Z2=[]   #5000 date of third layer
for i in range(5000):
    a=np.dot(theta2,Y2[i].T)
    z2=(a.T).tolist()
    Z2.append(z2)
    
'''计算逻辑函数值'''
Y2=[]
for i in range(5000):
    y0=[]
    for j in range(10):
        c=1/(1+np.exp(-Z2[i][j]))
        y0.append(c)
    Y2.append(y0)
    
'''转换成输出值'''
Y=[]
for i in range(5000):
    s=Y2[i].index(max(Y2[i]))
    Y.append(s+1)
    
'''计算神经网络预测的准确率'''
n=0
for i in range(5000):
    if y[i]==Y[i]:
        n+=1
pre_ratio=n/5000
print("神经网络预测的准确率:{}".format(pre_ratio))
神经网络预测的准确率:0.9752

计算损失函数值:

from scipy.io import loadmat
import numpy as np


'''读取数据'''
data=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11data.mat")
X=data['X']
y=data['y']

weights=loadmat("C:\\Users\\LEGION\\Documents\\Tencent Files\\215503595\\FileRecv\\hw11weights.mat")
theta1=weights['Theta1']
theta2=weights['Theta2']


#进行神经网络运算
'''添加元素1'''
X0=X.tolist()
for i in range(5000):
    X0[i].insert(0,1)
X1=np.array(X0)

'''进行神经网络的第一层计算'''
Z1=[]   #5000 date of second layer
for i in range(5000):
    a=np.dot(theta1,X1[i].T)
    z1=(a.T).tolist()
    Z1.append(z1)

'''计算逻辑函数值'''
Y1=[]
for i in range(5000):
    y0=[]
    for j in range(25):
        b=1/(1+np.exp(-Z1[i][j]))
        y0.append(b)
    Y1.append(y0)


'''添加元素1'''
for i in range(5000):
    Y1[i].insert(0,1)
Y2=np.array(Y1)

'''进行神经网络的第二层计算'''
Z2=[]   #5000 date of third layer
for i in range(5000):
    a=np.dot(theta2,Y2[i].T)
    z2=(a.T).tolist()
    Z2.append(z2)
    
'''计算逻辑函数值'''
Y2=[]
for i in range(5000):
    y0=[]
    for j in range(10):
        c=1/(1+np.exp(-Z2[i][j]))
        y0.append(c)
    Y2.append(y0)
    
'''转换成输出值'''
Y=[]
for i in range(5000):
    s=Y2[i].index(max(Y2[i]))
    Y.append(s+1)
    
#计算损失函数值
cost=0
for i in range(5000):
    cost0=0
    d=[0 for i in range(10)]
    d[y[i][0]-1]=1
    for j in range(10):
        p=d[j]*np.log(Y2[i][j])+(1-d[j])*np.log(1-Y2[i][j])
        cost0=cost0+p
    cost=cost+cost0
cost=cost*(-1/5000)
print("损失函数值:{}".format(cost))
损失函数值:0.2876291651613188

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

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

相关文章

RHEL8_Linux使用podman管理容器

本章主要介绍使用 podman 管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像 1.了解容器及和镜像的关系 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里举一个例子。想象一下…

crmeb v5自动生成代码报错(adminInfo方法或404路由不存在的问题)

404 现象 调试器中出现了404 , 那肯定是路由出了问题,也就是说,crmeb 为我们生成的路由没有对应的加载上,先来看一下, 自动代码为我们生成的路由是什么样子的 所以有一种最简单的解决办法,就是 把 新生成的路由文件从子目录中挪出一级来,就可以解决404的问题了 下面来说…

机器学习的12个基础问题

1.阐述批归一化的意义 算法 1&#xff1a;批归一化变换&#xff0c;在一个 mini-batch 上应用于激活 x。 批归一化是一种用于训练神经网络模型的有效方法。这种方法的目标是对特征进行归一化处理&#xff08;使每层网络的输出都经过激活&#xff09;&#xff0c;得到标准差为 …

MX6ULL学习笔记(九)MISC设备驱动

前言 misc 的意思是混合、杂项的&#xff0c;因此 MISC 驱动也叫做杂项驱动。也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动&#xff0c;通常嵌套在 platform 总线驱动中&#xff0c;实现复杂的驱动&#xff0…

.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性

医院检验系统LIS源码&#xff0c;LIS系统全套商业源码 LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理&#xff08;采集、传输、处理、输出、发布&#xff09;、报表管理过程的自动化&#xff0c;使实验室的操作人员和管理者从繁杂的手工劳…

开利网络的数字化技术加持下,加快扶贫和乡村振兴的效果和进程!

今日&#xff0c;来自山区省份的从事公益、区域民族文化传播、帮扶贫困地区脱贫、农业兴村贵州项目组一行来开利进行数字化脱贫、帮助乡村振兴解决方案探讨交流&#xff0c;交流中&#xff0c;开利网络总结出历经多年实践验证且行之有效的数字化经营、数字化建设经验得到与会成…

Elasticsearch:使用 OpenAI 生成嵌入并进行向量搜索 - nodejs

在我之前的文章&#xff1a; Elasticsearch&#xff1a;使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation &#xff08;一&#xff09;&#xff08;二&#xff09;&#xff08;三&#xff09;&#xff08;四&#xff09;​​​​​ 我详细地描述了如何使用…

做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)

19. 删除链表的倒数第 N 个结点 最初的想法进阶实现&#xff08;Java&#xff09; 最初的想法 计算出链表中的节点总数&#xff0c;然后遍历找到目标节点并删除。 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode cur head;int count0;w…

直流电、交流电、电磁波、光之间的联系

直流电、恒定磁场、交流电、交变磁场、电磁波、光之间的联系 频率为0Hz的直流电及恒定磁场 从频率的角度上看&#xff0c;直流电与恒定磁场的方向不变&#xff0c;频率为0Hz. 如可充电锂离子电池的电压3.7V, 干电池的电压1.5V. 磁铁的磁场方向从N极到S极&#xff0c;始终保持…

9mysql存储过程,存储函数和触发器

MySql 存储过程和触发器_mysql存储过程和触发器-CSDN博客文章浏览阅读162次。MySql存储过程、存储函数和触发器_mysql存储过程和触发器https://blog.csdn.net/chenniorange/article/details/132376605存储过程例子 -- A. 定义局部变量, 记录累加之后的值; -- B. 每循环一次, 就…

Ai 算法之Transformer 模型的实现: 一 、Input Embedding模块和Positional Embedding模块的实现

一 文章生成模型简介 比较常见的文章生成模型有以下几种&#xff1a; RNN&#xff1a;循环神经网络。可以处理长度变化的序列数据&#xff0c;比如自然语言文本。RNN通过隐藏层中的循环结构来传递时间序列中的信息&#xff0c;从而使当前的计算可以参照之前的信息。但这种模型…

一个算法一个例题教会你算法---0-1背包问题

动态规划 0-1背包问题 0-1背包问题就是求在有重量限制的情况下如何装入价值最大的物品。 啥也别说&#xff0c;直接看题&#xff1a; 现在有四个可以放的物品&#xff0c;w代表重量&#xff0c;v代表价值。 step1&#xff1a; 我们列一个背包重量 j 从0到5的表格&#xff0…

【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

00. 目录 文章目录 00. 目录01. GPIO之LED电路图02. GPIO之LED接线图03. LED闪烁程序示例04. LED闪烁程序下载05. LED流水灯接线图06. LED流水灯程序示例07. 蜂鸣器接线图08. 蜂鸣器程序示例09. 下载10. 附录 01. GPIO之LED电路图 电路图示例1 电路图示例2 02. GPIO之LED接线图…

Navicat 技术指引 | 适用于 GaussDB 分布式的数据查看器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

CNN发展史脉络 概述图整理

CNN发展史脉络概述图整理&#xff0c;学习心得&#xff0c;供参考&#xff0c;错误请批评指正。 相关论文&#xff1a; LeNet&#xff1a;Handwritten Digit Recognition with a Back-Propagation Network&#xff1b; Gradient-Based Learning Applied to Document Recogniti…

leaflet使用热力图报L找不到的问题ReferenceError: L is not defined at leaflet-heat.js:11:3

1.在main.js中直接引入会显示找不到L 2.解决办法 直接在组件中单独引入使用 可以直接显示出来。 至于为什么main中不能引入为全局&#xff0c;我是没找到&#xff0c;我的另外一个项目可以&#xff0c;新项目不行&#xff0c;不知哪里设置的问题

在linux服上使用nginx+tomcat部署若依前后端分离版本(RuoYi-Vue)

一、先拉工程&#xff0c;地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分离权限管理系统&#xff0c;同时提供了 Vue3 的版本 二、在window上用idea打开跑通&#xff0c;可参考…

GPT-4V 在保险行业的应用

在科技的进步中&#xff0c;人工智能与大数据技术的结合产生了巨大的能量&#xff0c;推动了各行各业的创新与变革。OpenAI&#xff0c;作为全球领先的人工智能研发机构&#xff0c;在今年的9月25日&#xff0c;以一种崭新的方式&#xff0c;升级了其旗下的GPT-4模型。这次的升…

解决msvcr120.dll文件丢失问题

项目场景&#xff1a; 在VMware虚拟机中安装win7家庭版系统&#xff0c;安装MySQL数据库&#xff0c;部署项目文件。 问题描述 安装MySQL数据库过程中提示“msvcr120.dll文件丢失”。 原因分析&#xff1a; 提示丢失msvcr120.dll文件&#xff0c;我们首先要到C:\Windows\Sys…

SD-WAN解决外贸企业网络问题

为了获取全球客户&#xff0c;占领更多的市场&#xff0c;越来越多的外贸企业出现。外贸企业在发展业务的过程中会遇到很多困难&#xff0c;海外网络访问问题就是其中之一。目前该问题主要有三种解决方案&#xff1a;VPN、MPLS专线以及SD-WAN专线。 VPN通过在公网上面建立专用网…