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

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

3天内不再提示

【连载】深度学习笔记1:利用numpy从零搭建一个神经网络

人工智能实训营 2018-08-06 17:36 次阅读


很多人说深度学习就是个黑箱子,把图像预处理之后丢进 tensorflow 就能出来预测结果,简单有效又省时省力。但正如我在上一篇推送中所说,如果你已是一名功力纯厚的深度学习工程师,这么做当然没问题。但我想大多数人也和我一样,都是走在学习深度学习的路上,一上来就上框架并没有什么特别不妥之处,但总归是对你理解深度学习的黑箱机制是了无裨益的。所以,我建议在学习深度学习的路上,从最简单的感知机开始写起,一步一步捋清神经网络的结构,以至于激活函数怎么写、采用何种损失函数、前向传播怎么写、后向传播又怎么写,权值如何迭代更新,都需要你自己去实现。若在一开始就直接调用框架,小的 demo 可以跑起来,糊弄一时,看起来就像是鸠摩智在内力未到的情形下强行练习少林寺的 72 绝技,最后走火入魔。

无论你是在看那本深度学习的书,还是在学习 Adrew NG 的 deeplearningai,或者是在cs231n ,对神经网络的基本理论了如指掌的你一定想亲手用 python 来实现它。在不借助任何深度学习框架的基础上,利用 python 的科学计算库 numpy 由最初级的感知机开始,从零搭建一个神经网络模型。

640?wx_fmt=png

感知机结构


对于感知机模型、神经网络理论这里就不再叙述,相信在精通深度学习的你对此一定很熟练了。至于对于神经网络中的输入层、隐藏层、输出层、权重与偏置、激活函数、损失函数、前向传播、反向传播、权值更新、梯度下降、微积分中的链式求导、方向梯度等概念,我也假设你很熟练了。所以,接下来就让我们从零搭建一个最初级的神经网络模型。

在写代码前,必须先捋一下思路,咱们先要什么,然后再写什么,你心中必须有个数。要从零开始写一个神经网络,通常的方法是:

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

  • 初始化模型参数

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


有了上面这个思路,我们就可以开始写了。当然了,本节是写一个最简单的感知机模型,所以网络结构就无需特别定义。首先来定义我们的激活函数,激活函数有很多种,这里我们使用大名鼎鼎的 sigmoid 函数:


直接利用 numpy 进行定义 sigmoid()

import numpy as np
def sigmoid(x): return 1 / (1 + np.exp(-x))

在无需定义网络结构的情形下,第二步我们就可以直接对模型参数进行初始化。模型参数主要包括权值 w 和偏置 b ,这也是神经网络学习过程要学的东西。继续利用 numpy 对参数进行初始化:

definitilize_with_zeros(dim):
w=np.zeros((dim,1))
b=0.0
#assert(w.shape==(dim,1))
#assert(isinstance(b,float)orisinstance(b,int))
returnw,b

接下来就要进入模型的主体部分,执行最后一步那个大的循环操作,这个循环中包括前向传播和计算损失、反向传播和权值更新。这也是神经网络训练过程中每一次需要迭代的部分。这里简单说一下,很多初学者容易被这两个概念绕住,前向传播简单而言就是计算预测 y 的过程,而后向传播则是根据预测值和实际值之间的误差不断往回推更新权值和偏置的过程。

640?wx_fmt=jpeg

前后传播与后向传播

下面我们来定义一个大的前向传播函数,预测值y为模型从输入到经过激活函数处理后的输出的结果。损失函数我们采用交叉熵损失,利用 numpy 定义如下函数:

def propagate(w, b, X, Y):
  m = X.shape[1]
  A = sigmoid(np.dot(w.T, X) + b)
  cost = -1/m * np.sum(Y*np.log(A) + (1-Y)*np.log(1-A))

  dw = np.dot(X, (A-Y).T)/m
  db = np.sum(A-Y)/m  
assert(dw.shape == w.shape)
assert(db.dtype == float) cost = np.squeeze(cost)
assert(cost.shape == ()) grads = { 'dw': dw,
'db': db }

return grads, cost

在上面的前向传播函数中,我们先是通过激活函数直接表示了感知机输出的预测值,然后通过定义的交叉熵损失函数计算了损失,最后根据损失函数计算了权值 w 和偏置 b的梯度,将参数梯度结果以字典和损失一起作为函数的输出进行返回。这就是前向传播的编写思路。

接下来循环操作的第二步就是进行反向传播操作,计算每一步的当前损失根据损失对权值进行更新。同样定义一个函数 backward_propagation :

def backward_propagation(w, b, X, Y, num_iterations, learning_rate, print_cost=False):
  cost = []  
for i in range(num_iterations): grad, cost = propagate(w, b, X, Y) dw = grad['dw'] db = grad['db'] w = w - learing_rate * dw b = b - learning_rate * db
if i % 100 == 0: cost.append(cost)
if print_cost and i % 100 == 0: print("cost after iteration %i: %f" %(i, cost)) params
= {"dw": w,
"db": b } grads = {"dw": dw,
"db": db }

return params, grads, costs

在上述函数中,我们先是建立了一个损失列表容器,然后将前一步定义的前向传播函数放进去执行迭代操作,计算每一步的当前损失和梯度,利用梯度下降法对权值进行更新,并用字典封装迭代结束时的参数和梯度进行返回。

如上所示,一个简单的神经网络模型(感知机)就搭建起来了。通常模型建好之后我们还需要对测试数据进行预测,所以我们也定义一个预测函数 predict,将模型的概率输出转化为0/1值。

def predict(w, b, X):
  m = X.shape[1]
  Y_prediction = np.zeros((1, m))
  w = w.reshape(X.shape[0], 1)

  A = sigmoid(np.dot(w.T, X)+b)  
for i in range(A.shape[1]):
if A[:, i] > 0.5: Y_prediction[:, i] = 1 else: Y_prediction[:, i] = 0 assert(Y_prediction.shape == (1, m))
return Y_prediction

到这里整个模型算是写完了,但是我们定义了这么多函数,调用起来太麻烦,所以致力于要写出 pythonic的代码的你们肯定想对这些函数进行一下简单的封装:

def model(X_train, Y_train, X_test, Y_test, num_iterations = 2000, learning_rate = 0.5, print_cost = False):  # initialize parameters with zeros (≈ 1 line of code)
  w, b = initialize_with_zeros(X_train.shape[0])  # Gradient descent (≈ 1 line of code)
  parameters, grads, costs = backwize(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost)  # Retrieve parameters w and b from dictionary "parameters"
  w = parameters["w"]
  b = parameters["b"]  # Predict test/train set examples (≈ 2 lines of code)
  Y_prediction_train = predict(w, b, X_train)
  Y_prediction_test = predict(w, b, X_test)  # Print train/test Errors
  print("train accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))
  print("test accuracy: {} %".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))

  d = {"costs": costs,    
"Y_prediction_test": Y_prediction_test, "Y_prediction_train" : Y_prediction_train, "w" : w, "b" : b,
"learning_rate" : learning_rate,
"num_iterations": num_iterations}
return d

如此这般一个简易的神经网络就被你用 numpy就写出来了。现在社会浮躁,很多人学习都没有耐心,总是抱着鸠摩智的心态想要一步登天。学习机器学习和深度学习方法很多,但我相信,只有对基本的算法原理每一步都捋清楚,每一步都用最基础的库去实现,你成为一名优秀的机器学习工程师只是时间问题。加油吧各位!




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

    关注

    42

    文章

    4570

    浏览量

    98703
  • 人工智能
    +关注

    关注

    1776

    文章

    43766

    浏览量

    230552
  • 机器学习
    +关注

    关注

    66

    文章

    8105

    浏览量

    130541
  • 深度学习
    +关注

    关注

    73

    文章

    5232

    浏览量

    119889
收藏 人收藏

    评论

    相关推荐

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

    在如今的网络时代,错综复杂的大数据和网络环境,让传统信息处理理论、人工智能与人工神经网络都面临巨大的挑战。近些年,深度学习逐渐走进人们的视线
    的头像 发表于 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>压缩与加速技术

    《 AI加速器架构设计与实现》+第章卷积神经网络观后感

    《 AI加速器架构设计与实现》+第章卷积神经网络观感    在本书的引言中也提到“图胜千言”,读完第章节后,对其进行了些归纳(如图
    发表于 09-11 20:34

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

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

    卷积神经网络模型搭建

    卷积神经网络模型搭建 卷积神经网络模型是一种深度学习算法。它已经成为了计算机视觉和自然语言处理等各种领域的主流算法,具有很大的应用前景。本篇
    的头像 发表于 08-21 17:11 607次阅读

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

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

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

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

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

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

    卷积神经网络计算公式

    神经网络计算公式 神经网络是一种类似于人脑的神经系统的计算模型,它是一种可以用来进行模式识别、分类、预测等任务的强大工具。在深度学习领域,
    的头像 发表于 08-21 16:49 1194次阅读

    Keras搭建神经网络般步骤

    参考https://keras.io/zh/ 的安装指引。 2 使用Keras搭建神经网络的步骤 2 示例 搭建最简单的手写数字
    发表于 08-18 07:35

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

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

    NumPy实现(1)#神经网络

    神经网络深度学习
    未来加油dz
    发布于 :2023年05月17日 11:52:42

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

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

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

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

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

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