机器学习(三)使用Python和R语言从头开始理解和编写神经网络(二)

简介: 机器学习(三)使用Python和R语言从头开始理解和编写神经网络(二)

神经网络方法的可视化步骤


我们将重复上述步骤,可视化输入,权重,偏差,输出,误差矩阵,以了解神经网络(MLP)的工作方法。

  • 注意:
  • 对于良好的可视化图像,我有2或3个位置的十进制小数位。
  • 黄色填充的细胞代表当前活动细胞
  • 橙色单元格表示用于填充当前单元格值的输入
  • 步骤1:读取输入和输出

    1.png

     Step 1


  • 步骤2:用随机值初始化权重和偏差(有初始化权重和偏差的方法,但是现在用随机值初始化)

    2.png
    Step 2


  • 步骤3:计算隐层输入:

    hidden_layer_input= matrix_dot_product(X,wh) + bh


3.png

Step 3


  • 步骤4:对隐藏的线性输入进行非线性变换

    hiddenlayer_activations = sigmoid(hidden_layer_input)


4.png

Step 4


  • 步骤5:在输出层执行隐层激活的线性和非线性变换

    output_layer_input = matrix_dot_product (hiddenlayer_activations * wout ) + bout

    output = sigmoid(output_layer_input)

5.png

Step 5


  • 步骤6:计算输出层的误差(E)梯度

    E = y-output

6.png

Step 6


  • 步骤7:计算输出和隐藏层的斜率

    Slope_output_layer= derivatives_sigmoid(output)

    Slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)

7.png

py26-10.png


  • 步骤8:计算输出层的增量

    d_output = E * slope_output_layer*lr

8.png

py26-11.png


  • 步骤9:计算隐藏层的误差

    Error_at_hidden_layer = matrix_dot_product(d_output, wout.Transpose)

9.png

py26-12.png


  • 步骤10:计算隐藏层的增量

    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer

10.png

py26-13.png


  • 步骤11:更新输出和隐藏层的权重

    wout = wout + matrix_dot_product(hiddenlayer_activations.Transpose, d_output)*learning_rate

    wh = wh+ matrix_dot_product(X.Transpose,d_hiddenlayer)*learning_rate

11.png

py26-14.png


  • 步骤12:更新输出和隐藏层的偏置量

    bh = bh + sum(d_hiddenlayer, axis=0) * learning_rate

    bout = bout + sum(d_output, axis=0)*learning_rate

12.png

py26-15.png


以上,您可以看到仍然有一个很好的误差而不接近于实际目标值,因为我们已经完成了一次训练迭代。 如果我们多次训练模型,那么这将是一个非常接近的实际结果。 我完成了数千次迭代,我的结果接近实际的目标值([[0.98032096] [0.96845624] [0.04532167]])。


使用Numpy(Python)实现NN



import numpy as np
#Input array
X=np.array([[1,0,1,0],[1,0,1,1],[0,1,0,1]])
#Output
y=np.array([[1],[1],[0]])
#Sigmoid Function
def sigmoid (x):
    return 1/(1 + np.exp(-x))
#Derivative of Sigmoid Function
def derivatives_sigmoid(x):
    return x * (1 - x)
#Variable initialization
epoch=5000 #Setting training iterations
lr=0.1 #Setting learning rate
inputlayer_neurons = X.shape[1] #number of features in data set
hiddenlayer_neurons = 3 #number of hidden layers neurons
output_neurons = 1 #number of neurons at output layer
#weight and bias initialization
wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))
bh=np.random.uniform(size=(1,hiddenlayer_neurons))
wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))
bout=np.random.uniform(size=(1,output_neurons))
for i in range(epoch):
    #Forward Propogation
    hidden_layer_input1=np.dot(X,wh)
    hidden_layer_input=hidden_layer_input1 + bh
    hiddenlayer_activations = sigmoid(hidden_layer_input)
    output_layer_input1=np.dot(hiddenlayer_activations,wout)
    output_layer_input= output_layer_input1+ bout
    output = sigmoid(output_layer_input)
    #Backpropagation
    E = y-output
    slope_output_layer = derivatives_sigmoid(output)
    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
    d_output = E * slope_output_layer
    Error_at_hidden_layer = d_output.dot(wout.T)
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
    wout += hiddenlayer_activations.T.dot(d_output) *lr
    bout += np.sum(d_output, axis=0,keepdims=True) *lr
    wh += X.T.dot(d_hiddenlayer) *lr
    bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr
print("output of Forward Propogation:\n{}".format(output))
print("wout,bout of Backpropagation:\n{},\n{}".format(wout,bout))


output of Forward Propogation:
[[ 0.98497471]
 [ 0.96956956]
 [ 0.0416628 ]]
wout,bout of Backpropagation:
[[ 3.34342103]
 [-1.97924327]
 [ 3.90636787]],
[[-1.71231223]]


在R中实现NN



# input matrix
X=matrix(c(1,0,1,0,1,0,1,1,0,1,0,1),nrow = 3, ncol=4,byrow = TRUE)
# output matrix
Y=matrix(c(1,1,0),byrow=FALSE)
#sigmoid function
sigmoid<-function(x){
1/(1+exp(-x))
}
# derivative of sigmoid function
derivatives_sigmoid<-function(x){
x*(1-x)
}
# variable initialization
epoch=5000
lr=0.1
inputlayer_neurons=ncol(X)
hiddenlayer_neurons=3
output_neurons=1
#weight and bias initialization
wh=matrix( rnorm(inputlayer_neurons*hiddenlayer_neurons,mean=0,sd=1), inputlayer_neurons, hiddenlayer_neurons)
bias_in=runif(hiddenlayer_neurons)
bias_in_temp=rep(bias_in, nrow(X))
bh=matrix(bias_in_temp, nrow = nrow(X), byrow = FALSE)
wout=matrix( rnorm(hiddenlayer_neurons*output_neurons,mean=0,sd=1), hiddenlayer_neurons, output_neurons)
bias_out=runif(output_neurons)
bias_out_temp=rep(bias_out,nrow(X))
bout=matrix(bias_out_temp,nrow = nrow(X),byrow = FALSE)
# forward propagation
for(i in 1:epoch){
hidden_layer_input1= X%*%wh
hidden_layer_input=hidden_layer_input1+bh
hidden_layer_activations=sigmoid(hidden_layer_input)
output_layer_input1=hidden_layer_activations%*%wout
output_layer_input=output_layer_input1+bout
output= sigmoid(output_layer_input)
# Back Propagation
E=Y-output
slope_output_layer=derivatives_sigmoid(output)
slope_hidden_layer=derivatives_sigmoid(hidden_layer_activations)
d_output=E*slope_output_layer
Error_at_hidden_layer=d_output%*%t(wout)
d_hiddenlayer=Error_at_hidden_layer*slope_hidden_layer
wout= wout + (t(hidden_layer_activations)%*%d_output)*lr
bout= bout+rowSums(d_output)*lr
wh = wh +(t(X)%*%d_hiddenlayer)*lr
bh = bh + rowSums(d_hiddenlayer)*lr
}
output


[可选]反向传播算法的数学理解


设Wi为输入层和隐层之间的权重。 Wh是隐层和输出层之间的权重。

现在,h =σ(u)=σ(WiX),即h是u的函数,u是Wi和X的函数。这里我们将我们的函数表示为σ

Y =σ(u')=σ(Whh),即Y是u'的函数,u'是Wh和h的函数。

我们将不断参考上述方程来计算偏导数。

我们主要感兴趣的是找到两个项:∂E/∂Wi和∂E/∂Wh即改变输入和隐藏层之间权重的误差变化,改变隐层和输出之间权重的变化 层。

但是为了计算这两个偏导数,我们将需要使用部分微分的链规则,因为E是Y的函数,Y是u'的函数,u'是Wi的函数。

让我们把这个属性很好的用于计算梯度。

`∂E/∂Wh = (∂E/∂Y).( ∂Y/∂u’).( ∂u’/∂Wh), ……..(1)

We know E is of the form E=(Y-t)2/2.

So, (∂E/∂Y)= (Y-t)`

现在,σ是一个S形函数,并具有σ(1-σ)形式的有意义的区分。 我敦促读者在他们身边进行验证。

所以, (∂Y/∂u’)= ∂( σ(u’)/ ∂u’= σ(u’)(1- σ(u’)).

但是, σ(u’)=Y, So,

(∂Y/∂u’)=Y(1-Y)

现在得出, ( ∂u’/∂Wh)= ∂( Whh)/ ∂Wh = h

取代等式(1)中的值我们得到,

∂E/∂Wh = (Y-t). Y(1-Y).h

所以,现在我们已经计算了隐层和输出层之间的梯度。 现在是计算输入层和隐藏层之间的梯度的时候了。

∂E/∂Wi =(∂ E/∂ h). (∂h/∂u).( ∂u/∂Wi)

但是,(∂ E/∂ h) = (∂E/∂Y).( ∂Y/∂u’).( ∂u’/∂h). 在上述方程中替换这个值得到:

∂E/∂Wi =[(∂E/∂Y).( ∂Y/∂u’).( ∂u’/∂h)]. (∂h/∂u).( ∂u/∂Wi)……………(2)

那么,首先计算隐层和输出层之间的梯度有什么好处?

如等式(2)所示,我们已经计算出∂E/∂Y和∂Y/∂u'节省了空间和计算时间。 我们会在一段时间内知道为什么这个算法称为反向传播算法。

让我们计算公式(2)中的未知导数。

∂u’/∂h = ∂(Whh)/ ∂h = Wh

∂h/∂u = ∂( σ(u)/ ∂u= σ(u)(1- σ(u))

但是, σ(u)=h, So,

(∂Y/∂u)=h(1-h)

得出, ∂u/∂Wi = ∂(WiX)/ ∂Wi = X

取代等式(2)中的所有这些值,我们得到:

∂E/∂Wi = [(Y-t). Y(1-Y).Wh].h(1-h).X

所以现在,由于我们已经计算了两个梯度,所以权重可以更新为:

Wh = Wh + η . ∂E/∂Wh

Wi = Wi + η . ∂E/∂Wi

其中η是学习率。

所以回到这个问题:为什么这个算法叫做反向传播算法?

原因是:如果您注意到∂E/∂Wh和∂E/∂Wi的最终形式,您将看到术语(Yt)即输出错误,这是我们开始的,然后将其传播回输入 层重量更新。

那么,这个数学在哪里适合代码?

hiddenlayer_activations= H

E = Y-t

Slope_output_layer = Y(1-Y)

lr =η

slope_hidden_layer = h(1-h)

wout = Wh

现在,您可以轻松地将代码与数学联系起来。


结束语


本文主要从头开始构建神经网络,并了解其基本概念。 我希望你现在可以理解神经网络的工作,如前向和后向传播的工作,优化算法(全批次和随机梯度下降),如何更新权重和偏差,Excel中每个步骤的可视化以及建立在python和R的代码.

因此,在即将到来的文章中,我将解释在Python中使用神经网络的应用,并解决与以下问题相关的现实生活中的挑战:

  1. 计算机视觉
  2. 言语
  3. 自然语言处理

我在写这篇文章的时候感到很愉快,并希望从你的反馈中学习。 你觉得这篇文章有用吗? 感谢您的建议/意见。 请随时通过以下意见提出您的问题。


(转载请注明来源)
相关文章
|
8天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
127 55
|
18天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
104 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
11天前
|
Unix 编译器 C语言
[oeasy]python052_[系统开发语言为什么默认是c语言
本文介绍了C语言为何成为系统开发的首选语言,从其诞生背景、发展历史及特点进行阐述。C语言源于贝尔实验室,与Unix操作系统相互促进,因其简洁、高效、跨平台等特性,逐渐成为主流。文章还提及了C语言的学习资料及其对编程文化的影响。
22 5
|
18天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
44 3
|
23天前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
38 6
|
26天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
51 8
|
25天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
28天前
|
机器学习/深度学习 人工智能 数据挖掘
打破传统:机器学习与神经网络获2024年诺贝尔物理学奖引发的思考
诺贝尔物理学奖首次授予机器学习与神经网络领域,标志该技术在物理学研究中的重要地位。本文探讨了这一决定对物理学研究的深远影响,包括数据分析、理论物理突破及未来科研方向的启示,同时分析了其对学术跨界合作与全球科研产业的影响。
50 4
|
28天前
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
99 1
|
1月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络

热门文章

最新文章