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

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

3天内不再提示

如何使用Numpy搭建神经网络

电子工程师 来源:未知 2019-05-18 11:02 次阅读

很多同学入门机器学习之后,直接用TensorFlow调包实现神经网络,对于神经网络内在机理知之甚少。

编程语言与技术框架变化更新非常之快,理解背后的原理才是王道。下面文摘菌和大家一起用Numpy实现一步一步实现神经网络。

此篇文章旨在帮大家梳理神经网络知识点,且此篇文章是第一部分,只是简单搭一个简单的框架。暂时不涉及梯度下降、学习率调参等知识点。

最简单的神经网络包含三个要素,输入层,隐藏层以及输出层。关于其工作机理其完全可以类比成一个元函数:Y=W*X+b。

一个简单的神经网络可以理解为两次一元函数的输入和输出。

第一次:Y1=A1(W1*X+b1) ,其中X是原始数据的输入,A1代表激活函数。

第二次:Y2=A2(W2*Y1+b2),其中Y1是第一次的输出,A2是激活函数。参数W1、W2、b1、b2原则上各不相同。

本篇文章我们用到的激活函数有两个,一个是tan(x),另一个是softmax。两者的函数曲线如下。

两个函数都有相同的特点,即函数值在零点左右变化较大,当输入值远离零点,其输出较稳定。

首先导入相关的库,需要两个库,一个用于科学计算的Numpy,另一个是math。

importnumpyasnpimport math

然后定义激活函数,

def tanh(x): return np.tanh(x)def softmax(x): exp=np.exp(x-x.max()) return exp/exp.sum()

这两个激活函数,其中tanh函数,Numpy直接内嵌。softmax根据数学定义进行设置。第二个激活函数因为是指数函数,其值会变化较大,所以我们用x-x.max 缩小其变化范围,这对结果不影响。

我们使用的图片大小是 28*28像素。以后会用手写数字数据集训练网络,所以会有10个数字输入,分别是[1,2,3,4,5,6,7,8,9,10]。所以要先定义三个列表。

dinensions=[28*28,10]activation=[tanh,softmax]distribution=[{'b':[0,0]},{'b':[0,0],'w':[-math.sqrt(6/(dinensions[0]+dinensions[1])),math.sqrt(6/(dinensions[0]+dinensions[1]))]}]

dinensions列表里面包含两个数,第一个是图片的像素大小,第二个是数字的输入变化量。

activation列表包含两个激活函数,分别为tanh,softmax。

distribution 列表里面对应的是字典格式的数据,分别对应神经网络参数取值范围。

其中第一层不包含参数W。

definit_parameters_b(layer):dist=distribution[layer]['b'] return np.random.rand(dinensions[layer])*(dist[1]-dist[0])+dist[0] #使得生成的随机数在 b 的区间内definit_parameters_w(layer):dist=distribution[layer]['w'] return np.random.rand(dinensions[layer-1],dinensions[layer])*(dist[1]-dist[0])+dist[0] #使得生成的随机数在 b 的区间内

上面代码是对b和w这两个参数初始化,因为我们输入的是28*28个数字,输出的是10个数字。所以第一层的 b 也有28*28个数字组成。根据矩阵的乘法规则,第二层的时候,w的维度只有是28*28行,10列才能满足输出的10个数字。因此第二层的b是10个数字。

dinensions[X] 意思是取切片,dinensions[1] 取得是10,dinensions[0],取得是28*28。

又因为np.random.rand()这一函数输出值的范围在[0,1],括号里面的参数(即dinensions[layer]只是确保输出的数字个数满足要求),所以为了让输出的值在一开始设置的 b 的区间内,我们设置先乘(dist[1]-dist[0])然后加上dist[0]。dist[1]和dist[0]分别对应参数的上下限。

definit_parameters():parameters=[]foriinrange(len(distribution)):layer_parameters={}forjindistribution[i].keys():ifj=='b':layer_parameters['b']=init_parameters_b(i)continueifj=='w':layer_parameters['w']=init_parameters_w(i)continueparameters.append(layer_parameters) return parameters

上面代码是将三个参数的初始化集成达到一个函数里面。

先定义一个空列表(不要写错成空字典)是为了将三个参数统一输出。

注:字典类型不能用append,列表可以用,列表.append(字典) 也是可以的。

然后从零开始遍历distribution。用if循环语句,目的是把参数全部包含进来。

第二层for循环和if语句是判断,并正确添加参数。

parameters=init_parameters() #将参数赋值给新的变量。defpredict(img,parameters):I0_in=img+parameters[0]['b']I0_out=activation[0](I0_in)I1_in=np.dot(I0_out,parameters[1]['w']+parameters[1]['b'])I1_out=activation[1](I1_in) return I1_out

定义输出函数,思路是这样的:输入数据后,根据函数:y=wx+b,进行变换,第一层w全为1。然后经过激活函数(第一个激活函数是tanh,所以用activation[0]),得出第一层的输入I0_out。 然后进入第二层,第一层的输出作为输入,根据函数:y=wx+b,进行变换,第二层的w为parameters[1]['w'],第二层的b为parameters[1]['b']。然后再经过激活函数softmax,得到输出。

predict(np.random.rand(784),parameters).argmax()

最后,随便输入一个784维数据(像素),都可以输出一个图片标签

预测图片中的数字

好了,我们第一个简单的神经网络就搭建好了,关于如何使用梯度下降和学习率,如何训练网络以及如何加载图片数据,我们在以后的文章中会介绍。

注:此篇文章受B站up主大野喵渣的启发,并参考了其代码,感兴趣的同学可以去B站观看他关于神经网络的教学视频

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

    关注

    42

    文章

    4771

    浏览量

    100712
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62569
  • 机器学习
    +关注

    关注

    66

    文章

    8406

    浏览量

    132558

原文标题:TensorFlow什么的都弱爆了,强者只用Numpy搭建神经网络

文章出处:【微信号:BigDataDigest,微信公众号:大数据文摘】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    神经网络教程(李亚非)

      第1章 概述  1.1 人工神经网络研究与发展  1.2 生物神经元  1.3 人工神经网络的构成  第2章人工神经网络基本模型  2.1 MP模型  2.2 感知器模型  2.3
    发表于 03-20 11:32

    【PYNQ-Z2试用体验】神经网络基础知识

    语言,使用numpy.dot方法即可计算矩阵乘法。 以上便是一个简单神经网络的基本原理,对神经网络有了基本的认识之后,我们才能进行复杂的神经网络设计。总结本文讲解了
    发表于 03-03 22:10

    【PYNQ-Z2试用体验】基于PYNQ-Z2的神经网络图形识别[结项]

    前言前面我们简单讲解了神经网络的基本概念和工作原理,接下来,将通过具体的python代码来完成基于神经网络的图形识别。这里使用手写的数字图像作为输入,神经网络将输出图像所对应的数字。获取神经网
    发表于 03-18 21:51

    卷积神经网络如何使用

    卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。
    发表于 07-17 07:21

    【案例分享】ART神经网络与SOM神经网络

    今天学习了两个神经网络,分别是自适应谐振(ART)神经网络与自组织映射(SOM)神经网络。整体感觉不是很难,只不过一些最基础的概念容易理解不清。首先ART神经网络是竞争学习的一个代表,
    发表于 07-21 04:30

    如何构建神经网络

    原文链接:http://tecdat.cn/?p=5725 神经网络是一种基于现有数据创建预测的计算系统。如何构建神经网络神经网络包括:输入层:根据现有数据获取输入的层隐藏层:使用反向传播优化输入变量权重的层,以提高模型的预测
    发表于 07-12 08:02

    基于BP神经网络的PID控制

    最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。利用BP
    发表于 09-07 07:43

    轻量化神经网络的相关资料下载

    视觉任务中,并取得了巨大成功。然而,由于存储空间和功耗的限制,神经网络模型在嵌入式设备上的存储与计算仍然是一个巨大的挑战。前面几篇介绍了如何在嵌入式AI芯片上部署神经网络:【嵌入式AI开发】篇五|实战篇一:STM32cubeIDE上部署
    发表于 12-14 07:35

    使用keras搭建神经网络实现基于深度学习算法的股票价格预测

    本文使用keras搭建神经网络,实现基于深度学习算法的股票价格预测。本文使用的数据来源为tushare,一个免费开源接口;且只取开票价进行预测。import numpy as npimport
    发表于 02-08 06:40

    基于Numpy实现同态加密神经网络

    在分布式AI环境下,同态加密神经网络有助于保护商业公司知识产权和消费者隐私。本文介绍了如何基于Numpy实现同态加密神经网络
    的头像 发表于 03-27 14:52 7950次阅读
    基于<b class='flag-5'>Numpy</b>实现同态加密<b class='flag-5'>神经网络</b>

    基于Numpy实现神经网络:反向传播

    和DeepMind数据科学家、Udacity深度学习导师Andrew Trask一起,基于Numpy手写神经网络,更深刻地理解反向传播这一概念。
    的头像 发表于 04-01 09:29 5140次阅读
    基于<b class='flag-5'>Numpy</b>实现<b class='flag-5'>神经网络</b>:反向传播

    【连载】深度学习笔记7:Tensorflow入门

    从前面的学习笔记中,和大家一起使用了 numpy 一步一步从感知机开始到两层网络以及最后实现了深度神经网络的算法搭建。而后我们又讨论了改善深度神经网
    的头像 发表于 08-20 12:47 3260次阅读

    如何使用numpy搭建一个卷积神经网络详细方法和程序概述

    内容将继续秉承之前 DNN 的学习路线,在利用Tensorflow搭建神经网络之前,先尝试利用numpy手动搭建卷积神经网络,以期对卷积
    的头像 发表于 10-20 10:55 6064次阅读

    卷积神经网络模型搭建

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

    使用NumPy实现前馈神经网络

    要使用NumPy实现一个前馈神经网络(Feedforward Neural Network),我们需要从基础开始构建,包括初始化网络参数、定义激活函数及其导数、实现前向传播、计算损失函数、以及实现
    的头像 发表于 07-11 16:30 1626次阅读