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

    文章

    4570

    浏览量

    98702
  • AI
    AI
    +关注

    关注

    87

    文章

    26396

    浏览量

    264001
  • 人工智能
    +关注

    关注

    1776

    文章

    43766

    浏览量

    230551
收藏 人收藏

    评论

    相关推荐

    FPGA在深度学习应用中或将取代GPU

    的根本原因,它与 深度神经网络共同之处:都需要进行大量矩阵运算。 显卡可以并行执行矩阵运算,极大地加快计算速度。图形处理器可以把训练神经
    发表于 03-21 15:19

    详解深度学习神经网络与卷积神经网络的应用

    在如今的网络时代,错综复杂的大数据和网络环境,让传统信息处理理论、人工智能与人工神经网络都面临巨大的挑战。近些年,深度学习逐渐走进人们的视线
    的头像 发表于 01-11 10:51 708次阅读
    详解<b class='flag-5'>深度</b><b class='flag-5'>学习</b>、<b class='flag-5'>神经网络</b>与卷积<b class='flag-5'>神经网络</b>的应用

    浅析深度神经网络压缩与加速技术

    深度神经网络深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似
    的头像 发表于 10-11 09:14 392次阅读
    浅析<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>压缩与加速技术

    深度学习神经网络架构解析

    感知器是所有神经网络中最基本的,也是更复杂的神经网络的基本组成部分。它只连接一个输入神经元和一个输出神经元。
    发表于 08-31 16:55 837次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>的<b class='flag-5'>神经网络</b>架构解析

    常见的卷积神经网络模型 典型的卷积神经网络模型

    常见的卷积神经网络模型 典型的卷积神经网络模型 卷积神经网络(Convolutional Neural Network, CNN)是深度学习
    的头像 发表于 08-21 17:11 1915次阅读

    卷积神经网络深度神经网络的优缺点 卷积神经网络深度神经网络的区别

    深度神经网络是一种基于神经网络的机器学习算法,其主要特点是由多层神经元构成,可以根据数据自动调整神经
    发表于 08-21 17:07 2282次阅读

    卷积神经网络是什么?卷积神经网络的工作原理和应用

      卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习神经网络,主要用于图像和视频的识别、分类和预测,是计算机视觉领域中应用最广泛的
    发表于 08-21 17:03 1186次阅读

    卷积神经网络的基本原理 卷积神经网络发展 卷积神经网络三大特点

    卷积神经网络的基本原理 卷积神经网络发展历程 卷积神经网络三大特点  卷积神经网络的基本原理 卷积神经网络(Convolutional Ne
    的头像 发表于 08-21 16:49 1433次阅读

    卷积神经网络三大特点

    卷积神经网络三大特点  卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,其具有三大特点:局部感知、参数共享和下采样。 一、局部感知
    的头像 发表于 08-21 16:49 3528次阅读

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法 卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度
    的头像 发表于 08-17 16:30 900次阅读

    手写数字识别神经网络的实现(2)

    在练习二中,手写数字识别使用数值微分的方式实现了神经网络,现在用误差反向传播法来实现。两者的区别仅仅是使用不同方法求梯度。
    的头像 发表于 06-23 16:57 464次阅读

    浅析三种主流深度神经网络

    来源:青榴实验室1、引子深度神经网络(DNNs)最近在图像分类或语音识别等复杂机器学习任务中表现出的优异性能令人印象深刻。在本文中,我们将了解深度
    的头像 发表于 05-17 09:59 1058次阅读
    浅析三种主流<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>

    5 实例:卷积神经网络实现手写数字识别(2)#神经网络

    神经网络深度学习
    未来加油dz
    发布于 :2023年05月16日 19:03:42

    1.2 深度学习三要素(2)#神经网络

    神经网络深度学习
    未来加油dz
    发布于 :2023年05月16日 18:38:24

    浅析三种主流深度神经网络

    来源:青榴实验室 1、引子 深度神经网络(DNNs)最近在图像分类或语音识别等复杂机器学习任务中表现出的优异性能令人印象深刻。 在本文中,我们将了解深度
    的头像 发表于 05-15 14:20 605次阅读
    浅析三种主流<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>