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

    文章

    4759

    浏览量

    100458
  • AI
    AI
    +关注

    关注

    87

    文章

    29925

    浏览量

    268226
  • 人工智能
    +关注

    关注

    1791

    文章

    46736

    浏览量

    237294
收藏 人收藏

    评论

    相关推荐

    深度学习中的卷积神经网络模型

    深度学习近年来在多个领域取得了显著的进展,尤其是在图像识别、语音识别和自然语言处理等方面。卷积神经网络作为深度学习
    的头像 发表于 11-15 14:52 156次阅读

    如何编写BP神经网络

    传播过程,即误差从输出反向传播回输入,并据此调整网络参数。本文将详细阐述如何编写BP神经网络
    的头像 发表于 07-11 16:44 409次阅读

    神经网络中的卷积、池化与全连接

    深度学习中,卷积神经网络(Convolutional Neural Network, CNN)是种特别适用于处理图像数据的神经网络结构。
    的头像 发表于 07-11 14:18 4410次阅读

    神经网络模型的基本结构是什么

    神经网络模型是种常见的深度学习模型,它由输入、隐藏
    的头像 发表于 07-11 10:59 640次阅读

    神经网络模型的优缺点

    神经网络模型是种常见的深度学习模型,它由输入、两
    的头像 发表于 07-11 10:58 386次阅读

    PyTorch神经网络模型构建过程

    PyTorch,作为广泛使用的开源深度学习库,提供了丰富的工具和模块,帮助开发者构建、训练和部署神经网络模型。在
    的头像 发表于 07-10 14:57 426次阅读

    深度神经网络与基本神经网络的区别

    在探讨深度神经网络(Deep Neural Networks, DNNs)与基本神经网络(通常指传统神经网络或前向神经网络)的区别时,我们需
    的头像 发表于 07-04 13:20 614次阅读

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

    随着人工智能技术的飞速发展,深度学习和卷积神经网络(Convolutional Neural Network, CNN)作为其中的重要分支,已经在多个领域取得了显著的应用成果。从图像识别、语音识别
    的头像 发表于 07-02 18:19 782次阅读

    卷积神经网络一层的作用

    卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习算法,广泛应用于图像识别、自然语言处理等领域。本文将详细介绍卷积
    的头像 发表于 07-02 15:28 1058次阅读

    构建神经网络模型方法有几种

    构建神经网络模型是深度学习领域的核心任务之。本文将详细介绍构建神经网络模型的几种方法,包括前飨神经网络
    的头像 发表于 07-02 10:15 302次阅读

    深度神经网络模型cnn的基本概念、结构及原理

    深度神经网络模型CNN(Convolutional Neural Network)是种广泛应用于图像识别、视频分析和自然语言处理等领域的深度学习
    的头像 发表于 07-02 10:11 9490次阅读

    深度神经网络模型有哪些

    深度神经网络(Deep Neural Networks,DNNs)是类具有多个隐藏神经网络,它们在许多领域取得了显著的成功,如计算机视
    的头像 发表于 07-02 10:00 1100次阅读

    利用深度循环神经网络对心电图降噪

    一个是它们由堆叠在起的多个 (> 2) 组成 - 这 种方法也称为深度学习。这种深层
    发表于 05-15 14:42

    助听器降噪神经网络模型

    抑制任务是语音增强领域的重要学科, 随着深度神经网络的兴起,提出了几种基于深度模型的音频处理新方法[1,
    发表于 05-11 17:15

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

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