0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【连载】深度学习笔记2:手写一个单隐层的神经网络

人工智能实训营 2018-08-06 17:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

笔记1中我们利用 numpy 搭建了神经网络最简单的结构单元:感知机。笔记2将继续学习如何手动搭建神经网络。我们将学习如何利用 numpy 搭建一个含单隐层的神经网络。单隐层顾名思义,即仅含一个隐藏层的神经网络,抑或是成为两层网络。

继续回顾一下搭建一个神经网络的基本思路和步骤:

  • 定义网络结构(指定输出层、隐藏层、输出层的大小)

  • 初始化模型参数

  • 循环操作:执行前向传播/计算损失/执行后向传播/权值更新

定义网络结构

假设 X 为神经网络的输入特征矩阵,y标签向量。则含单隐层的神经网络的结构如下所示:

640?wx_fmt=png

网络结构的函数定义如下:

deflayer_sizes(X,Y):
n_x=X.shape[0]#sizeofinputlayer
n_h=4#sizeofhiddenlayer
n_y=Y.shape[0]#sizeofoutputlayer
return(n_x,n_h,n_y)

其中输入层和输出层的大小分别与 Xyshape 有关。而隐层的大小可由我们手动指定。这里我们指定隐层的大小为4。

初始化模型参数

假设 W1 为输入层到隐层的权重数组、b1 为输入层到隐层的偏置数组;W2 为隐层到输出层的权重数组,b2 为隐层到输出层的偏置数组。于是我们定义参数初始化函数如下:

def initialize_parameters(n_x, n_h, n_y):
  W1 = np.random.randn(n_h, n_x)*0.01
  b1 = np.zeros((n_h, 1))
  W2 = np.random.randn(n_y, n_h)*0.01
  b2 = np.zeros((n_y, 1)) 

assert (W1.shape == (n_h, n_x))
assert (b1.shape == (n_h, 1))
assert (W2.shape == (n_y, n_h))
assert (b2.shape == (n_y, 1)) parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2}

return parameters

其中对权值的初始化我们利用了 numpy 中的生成随机数的模块 np.random.randn ,偏置的初始化则使用了 np.zero 模块。通过设置一个字典进行封装并返回包含初始化参数之后的结果。

前向传播

在定义好网络结构并初始化参数完成之后,就要开始执行神经网络的训练过程了。而训练的第一步则是执行前向传播计算。假设隐层的激活函数为 tanh 函数, 输出层的激活函数为 sigmoid 函数。则前向传播计算表示为:

640?wx_fmt=png


定义前向传播计算函数为:

def forward_propagation(X, parameters):  # Retrieve each parameter from the dictionary "parameters"
  W1 = parameters['W1']
  b1 = parameters['b1']
  W2 = parameters['W2']
  b2 = parameters['b2']  
# Implement Forward Propagation to calculate A2 (probabilities) Z1 = np.dot(W1, X) + b1 A1 = np.tanh(Z1) Z2 = np.dot(W2, Z1) + b2 A2 = sigmoid(Z2)
assert(A2.shape == (1, X.shape[1]))
cache = {"Z1": Z1, "A1": A1, "Z2": Z2, "A2": A2}
return A2, cache

从参数初始化结果字典里取到各自的参数,然后执行一次前向传播计算,将前向传播计算的结果保存到 cache 这个字典中, 其中 A2 为经过 sigmoid 激活函数激活后的输出层的结果。

计算当前训练损失

前向传播计算完成后我们需要确定以当前参数执行计算后的的输出与标签值之间的损失大小。与笔记1一样,损失函数同样选择为交叉熵损失:

640?wx_fmt=png

定义计算损失函数为:

def compute_cost(A2, Y, parameters):
  m = Y.shape[1] # number of example
  # Compute the cross-entropy cost
  logprobs = np.multiply(np.log(A2),Y) + np.multiply(np.log(1-A2), 1-Y)
  cost = -1/m * np.sum(logprobs)
  cost = np.squeeze(cost)   # makes sure cost is the dimension we expect.

  assert(isinstance(cost, float))  
return cost
执行反向传播

当前向传播和当前损失确定之后,就需要继续执行反向传播过程来调整权值了。中间涉及到各个参数的梯度计算,具体如下图所示:

640?wx_fmt=png

根据上述梯度计算公式定义反向传播函数:

def backward_propagation(parameters, cache, X, Y):
  m = X.shape[1]  
# First, retrieve W1 and W2 from the dictionary "parameters". W1 = parameters['W1'] W2 = parameters['W2']
# Retrieve also A1 and A2 from dictionary "cache". A1 = cache['A1'] A2 = cache['A2']
# Backward propagation: calculate dW1, db1, dW2, db2. dZ2 = A2-Y dW2 = 1/m * np.dot(dZ2, A1.T) db2 = 1/m * np.sum(dZ2, axis=1, keepdims=True) dZ1 = np.dot(W2.T, dZ2)*(1-np.power(A1, 2)) dW1 = 1/m * np.dot(dZ1, X.T) db1 = 1/m * np.sum(dZ1, axis=1, keepdims=True) grads = {"dW1": dW1,
"db1": db1,
"dW2": dW2,
"db2": db2}
return grads

将各参数的求导计算结果放入字典 grad 进行返回。

这里需要提一下的是涉及到的关于数值优化方面的知识。在机器学习中,当所学问题有了具体的形式之后,机器学习就会形式化为一个求优化的问题。不论是梯度下降法、随机梯度下降、牛顿法、拟牛顿法,抑或是 Adam 之类的高级的优化算法,这些都需要花时间掌握去掌握其数学原理。

640?wx_fmt=gif

权值更新

迭代计算的最后一步就是根据反向传播的结果来更新权值了,更新公式如下:

640?wx_fmt=png

由该公式可以定义权值更新函数为:

def update_parameters(parameters, grads, learning_rate = 1.2):  # Retrieve each parameter from the dictionary "parameters"
  W1 = parameters['W1']
  b1 = parameters['b1']
  W2 = parameters['W2']
  b2 = parameters['b2']  
# Retrieve each gradient from the dictionary "grads" dW1 = grads['dW1'] db1 = grads['db1'] dW2 = grads['dW2'] db2 = grads['db2']
# Update rule for each parameter W1 -= dW1 * learning_rate b1 -= db1 * learning_rate W2 -= dW2 * learning_rate b2 -= db2 * learning_rate parameters = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2}
return parameters

这样,前向传播-计算损失-反向传播-权值更新的神经网络训练过程就算部署完成了。当前了,跟笔记1一样,为了更加 pythonic 一点,我们也将各个模块组合起来,定义一个神经网络模型:

def nn_model(X, Y, n_h, num_iterations = 10000, print_cost=False):
  np.random.seed(3)
  n_x = layer_sizes(X, Y)[0]
  n_y = layer_sizes(X, Y)[2]  
# Initialize parameters, then retrieve W1, b1, W2, b2. Inputs: "n_x, n_h, n_y". Outputs = "W1, b1, W2, b2, parameters". parameters = initialize_parameters(n_x, n_h, n_y) W1 = parameters['W1'] b1 = parameters['b1'] W2 = parameters['W2'] b2 = parameters['b2']
# Loop (gradient descent) for i in range(0, num_iterations):
# Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache". A2, cache = forward_propagation(X, parameters)
# Cost function. Inputs: "A2, Y, parameters". Outputs: "cost". cost = compute_cost(A2, Y, parameters)
# Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads". grads = backward_propagation(parameters, cache, X, Y)
# Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters". parameters = update_parameters(parameters, grads, learning_rate=1.2)
# Print the cost every 1000 iterations if print_cost and i % 1000 == 0:
print ("Cost after iteration %i: %f" %(i, cost))

return parameters

以上便是本节的主要内容,利用 numpy 手动搭建一个含单隐层的神经网路。从零开始写起,打牢基础,待到结构熟练,原理吃透,再去接触一些主流的深度学习框架才是学习深度学习的最佳途径。

本文来自《自兴动脑人工智能》项目部:凯文。






声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4842

    浏览量

    108163
  • AI
    AI
    +关注

    关注

    91

    文章

    41101

    浏览量

    302577
  • 人工智能
    +关注

    关注

    1820

    文章

    50324

    浏览量

    266915
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    神经网络的初步认识

    日常生活中的智能应用都离不开深度学习,而深度学习则依赖于神经网络的实现。什么是神经网络
    的头像 发表于 12-17 15:05 460次阅读
    <b class='flag-5'>神经网络</b>的初步认识

    自动驾驶中常提的卷积神经网络啥?

    在自动驾驶领域,经常会听到卷积神经网络技术。卷积神经网络,简称为CNN,是种专门用来处理网格状数据(比如图像)的深度学习模型。CNN在图像
    的头像 发表于 11-19 18:15 2244次阅读
    自动驾驶中常提的卷积<b class='flag-5'>神经网络</b>是<b class='flag-5'>个</b>啥?

    激活函数ReLU的理解与总结

    激活函数的作用 神经网络中使用激活函数来加入非线性因素,提高模型的表达能力。 如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很
    发表于 10-31 06:16

    CNN卷积神经网络设计原理及在MCU200T上仿真测试

    数的提出很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题。当x&gt;0 时,梯度恒为1,无梯度耗散问题,收敛快;当x&lt;0 时,该的输出为0。 CNN
    发表于 10-29 07:49

    NMSIS神经网络库使用介绍

    (q7_t) 和 16 位整数 (q15_t)。 卷积神经网络示例: 本示例中使用的 CNN 基于来自 Caffe 的 CIFAR-10 示例。神经网络由 3 卷积组成,中间散布
    发表于 10-29 06:08

    构建CNN网络模型并优化的般化建议

    :Dropout随机跳过神经网络模型中某些神经元之间的连接,通过随机制造缺陷进行训练提升整个神经网络的鲁棒性。 6)指定合理的学习率策
    发表于 10-28 08:02

    在Ubuntu20.04系统中训练神经网络模型的些经验

    本帖欲分享在Ubuntu20.04系统中训练神经网络模型的些经验。我们采用jupyter notebook作为开发IDE,以TensorFlow2为训练框架,目标是训练
    发表于 10-22 07:03

    CICC2033神经网络部署相关操作

    在完成神经网络量化后,需要将神经网络部署到硬件加速器上。首先需要将所有权重数据以及输入数据导入到存储器内。 在仿真环境下,可将其存于文件,并在 Verilog 代码中通过 read
    发表于 10-20 08:00

    液态神经网络(LNN):时间连续性与动态适应性的神经网络

    1.算法简介液态神经网络(LiquidNeuralNetworks,LNN)是种新型的神经网络架构,其设计理念借鉴自生物神经系统,特别是秀丽
    的头像 发表于 09-28 10:03 1557次阅读
    液态<b class='flag-5'>神经网络</b>(LNN):时间连续性与动态适应性的<b class='flag-5'>神经网络</b>

    神经网络的并行计算与加速技术

    随着人工智能技术的飞速发展,神经网络在众多领域展现出了巨大的潜力和广泛的应用前景。然而,神经网络模型的复杂度和规模也在不断增加,这使得传统的串行计算方式面临着巨大的挑战,如计算速度慢、训练时间长等
    的头像 发表于 09-17 13:31 1294次阅读
    <b class='flag-5'>神经网络</b>的并行计算与加速技术

    如何在机器视觉中部署深度学习神经网络

    图 1:基于深度学习的目标检测可定位已训练的目标类别,并通过矩形框(边界框)对其进行标识。 在讨论人工智能(AI)或深度学习时,经常会出现“神经网络
    的头像 发表于 09-10 17:38 1049次阅读
    如何在机器视觉中部署<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>神经网络</b>

    无刷电机小波神经网络转子位置检测方法的研究

    摘要:论文通过对无刷电机数学模型的推导,得出转角:与三相相电压之间存在映射关系,因此构建了以三相相电压为输人,转角为输出的小波神经网络来实现转角预测,并采用改进遗传算法来训练网络
    发表于 06-25 13:06

    神经网络专家系统在电机故障诊断中的应用

    摘要:针对传统专家系统不能进行自学习、自适应的问题,本文提出了基于种经网络专家系统的并步电机故障诊断方法。本文将小波神经网络和专家系统相结合,充分发挥了二者故障诊断的优点,很大程度上降低了对电机
    发表于 06-16 22:09

    神经网络RAS在异步电机转速估计中的仿真研究

    ,在定程度上扩展了转速估计范围。 纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:神经网络RAS在异步电机转速估计中的仿真研究.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权
    发表于 06-16 21:54

    基于FPGA搭建神经网络的步骤解析

    本文的目的是在神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后通过python程序将txt文件转化为coe
    的头像 发表于 06-03 15:51 1502次阅读
    基于FPGA搭建<b class='flag-5'>神经网络</b>的步骤解析