如何从零开始用Python构建神经网络

如何从零开始用Python构建神经网络
如何从零开始用Python构建神经网络

这是一份用于理解深度学习内部运作方式的初学者指南。作者根据自己从零开始学习用 Python 构建神经网络的经验,编写了一份攻略。内容涵盖神经网络定义、损失函数、前向传播、反向传播、梯度下降算法,对于想要了解深度学习运作原理的各位来说,内容精彩不可错过。

动机:为了深入了解深度学习,我决定从零开始构建神经网络,并且不使用类似 Tensorflow 的深度学习库。我相信,对于任何有理想的数据科学家而言,理解神经网络内部的运作方式都非常重要。

本文涵盖了我学到的所有东西,希望你也能从中获益!

什么是神经网络?

许多有关神经网络的介绍资料会将神经网络与大脑进行类比。但我发现,将神经网络简单地描述为一个从输入映射到输出的数学函数理解起来更容易。

神经网络由以下部分组成:

一个输入层,x

任意数量的隐藏层

一个输出层,?

每两层之间都有一组权重和偏置,W 和 b

每个隐藏层都要选择一个激活函数 σ。在本文中,我们选用 Sigmoid 激活函数。

下图展示了 2 层神经网络的结构(请注意,在计算神经网络层数的时候,通常不计入输入层)。

二层神经网络的结构

利用 Python 建立神经网络非常容易。

class NeuralNetwork:

def __init__(self, x, y):

self.input = x

self.weights1 = np.random.rand(self.input.shape[1],4)

self.weights2 = np.random.rand(4,1)

self.y = y

self.output = np.zeros(y.shape)

训练神经网络

一个简单 2 层神经网络的输出 ? 可以表示为:

你可能注意到,在上面的等式当中,权重 W 和偏置 b 是影响输出 ? 的唯一变量。

自然,权重和偏差的正确值决定了预测的强度。根据输入数据微调权重和偏置的过程称为神经网络训练。

训练过程的每一次迭代包含以下步骤:

计算预测的输出 ?,称为前向传播

更新权重和偏置,称为反向传播

以下流程图说明了这个过程:

前向传播

正如我们在上图中所看到的,前向传播只是一个简单的计算。对于一个基本的 2 层神经网络,神经网络的输出计算如下:

我们可以在 Python 代码中添加一个前向传播函数来做到这一点。简单起见,我们假设偏置为 0。

class NeuralNetwork:

def __init__(self, x, y):

self.input = x

self.weights1 = np.random.rand(self.input.shape[1],4)

self.weights2 = np.random.rand(4,1)

self.y = y

self.output = np.zeros(self.y.shape)

def feedforward(self):

https://www.360docs.net/doc/708866235.html,yer1 = sigmoid(np.dot(self.input, self.weights1))

self.output = sigmoid(np.dot(https://www.360docs.net/doc/708866235.html,yer1, self.weights2))

然而,我们仍然需要一种方法来评估我们的预测的「优秀程度」(即,我们的预测与真实值相差多少?)这就需要用到损失函数了。

损失函数

损失函数有很多种,而我们问题的性质会决定我们使用哪种损失函数。在本文中,我们将采用简单的误差平方和。

误差平方和,即每个预测值和真实值之间差值的平均值。这个差值是取了平方项的,所以我们测量的是差值的绝对值。

在训练过程中,我们的目标是找到一组最佳的权重和偏置,使损失函数最小化。

反向传播

现在,我们已经找到了预测误差的方法(损失函数),那么我们需要一种方法将错误「传播」回去,从而更新权重和偏置。

为了确定权重和偏置调整的适当值,我们需要知道损失函数对权重和偏置的偏导数。

从微积分的角度来看,函数的偏导数也就是函数的斜率。

梯度下降算法

如果我们知道了偏导数,我们可以通过简单增加或减少偏导数(如上图所示)的方式来更新权重和偏置。这就是所谓的梯度下降。

然而,由于损失函数的方程不包含权重和偏置,所以我们不能直接计算损失函数对权重和偏置的偏导数。因此,我们需要链式法则来帮助计算。

以上是用于计算损失函数对权重偏导数的链式法则。简单起见,我们只展示了一层神经网络的偏导数。

唷!这看起来不大好看,但这能让我们获得所需——损失函数对权重的偏导数(斜率),以便相应调整权重。

既然我们已经有了链式法则公式,接下来我们把反向传播函数添加到 Python 代码中。

class NeuralNetwork:

def __init__(self, x, y):

self.input = x

self.weights1 = np.random.rand(self.input.shape[1],4)

self.weights2 = np.random.rand(4,1)

self.y = y

self.output = np.zeros(self.y.shape)

def feedforward(self):

https://www.360docs.net/doc/708866235.html,yer1 = sigmoid(np.dot(self.input, self.weights1))

self.output = sigmoid(np.dot(https://www.360docs.net/doc/708866235.html,yer1, self.weights2))

def backprop(self):

# application of the chain rule to find derivative of the loss function with res d_weights2 = np.dot(https://www.360docs.net/doc/708866235.html,yer1.T, (2*(self.y - self.output) * sigmoid_derivativ d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_de # update the weights with the derivative (slope) of the loss function

self.weights1 += d_weights1

self.weights2 += d_weights2

为了更深入地理解微积分和链式法则在反向传播中的应用,我强烈推荐 3Blue1Brown 的视频教程。

让我们看看神经网络在进行 1500 次迭代后的最终预测(输出):

进行1500次迭代后的预测值

我们成功了!我们的前向传播和反向传播算法成功训练了神经网络,且预测值收敛到了真实值。

请注意,预测值和真实值之间还是有一些轻微差异的。这是可取的,因为它防止了过度拟合,并且使得神经网络具有更强的泛化能力。

下一步

幸运的是,我们的探索还没有结束。关于神经网络和深度学习还有很多需要学习的地方。例如:

除了 Sigmoid 函数之外,我们还可以使用哪些激活函数?

在训练神经网络时使用学习率

使用卷积进行图像分类任务

python 接口自动化、UI自动化开发环境(全)

一、环境及软件最新下载地址 二、安装配置JDK 三、安装配置python 四、安装配置eclipse 五、eclipse配置python开发环境 六、eclipse新建python项目 七、接口自动化环境搭建 八、UI自动化环境搭建 九、Windows GUI程序自动化环境搭建 十、框架 一、环境及软件最新下载地址 1. 操作系统: win10 企业版 2. JDK:1.8.0_241; 3. eclipse:Oxygen.3a Release ( 4.7.3a); 4. python:3.8.1 5. 本例所以软件下载地址: 链接: https://https://www.360docs.net/doc/708866235.html,/s/1hVd--DOvFNW-yhwNiSxmkg 提 取码: iyei 6. JDK最新下载地址: https://https://www.360docs.net/doc/708866235.html,/java/technologies/javase-downloads.html 7. eclipse最新下载地址: https://https://www.360docs.net/doc/708866235.html,/downloads/ 8. python最新下载地址: https://https://www.360docs.net/doc/708866235.html,/ftp/python/ 二、安装配置JDK 第一步:安装JDK 双击“jdk-8u241-windows-x64.exe”,点击下一步一直到安装完成 第二步:配置JDK 我的电脑-->属性-->高级系统设置-->环境变量 1. 新建系统环境变量 JAVA_HOME C:\Program Files\Java\jdk1.8.0_241 (JDK的安装路径) 2. 新建系统环境变量 PATH(如已存在,即双击编辑新建) %JAVA_HOME%\bin %JAVA_HOME%\jre\bin 3. .新建系统环境变量 CLASSPATH(如已存在,即双击编辑) .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 4. 测试环境变量配置是否成功: 开始-->运行--〉CMD 键盘分别敲入: JAVAC(输入完毕, 回车键)JAVA输入完毕,回车键) 出现相应的命令,而不是出错信息,即表示配置成功

接口自动化测试框架实例详解教程python+requests

接口自动化测试框架实例详解教程python+requests 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,这套自动化框架目前已经基本完成了,于是进行一些总结,便于以后回顾温习,有许多不完善的地方,也遇到了许多的问题,希望大神们多多指教。下面我就进行今天的主要内容吧。 1、首先,我们先来理一下思路。 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具—> 配置需要的接口参数—> 进行测试—> 检查测试结果(有的需要数据库辅助)—> 生成测试报告(html报告) 那么,我们就根据这样的过程来一步步搭建我们的框架。在这个过程中,我们需要做到业务和数据的分离,这样才能灵活,达到我们写框架的目的。只要好好做,一定可以成功。这也是我当初对自己说的。 接下来,我们来进行结构的划分。 我的结构是这样的,大家可以参考下: common:存放一些共通的方法 result:执行过程中生成的文件夹,里面存放每次测试的结果 testCase:用于存放具体的测试case testFile:存放测试过程中用到的文件,包括上传的文件,测试用例以及数据库的sql 语句 caselist:txt文件,配置每次执行的case名称 config:配置一些常量,例如数据库的相关信息,接口的相关信息等 readConfig:用于读取config配置文件中的内容 runAll:用于执行case

如何用 Python实现自动化测试

如何用 Python实现自动化测试 近期一直在看王阳明的相关书籍,他的一个观点我非常赞同,不管要学习什么一定要立志,立志是非常非常重要的,但是立志前一定要有动机,或者说要有"打击",那种让 你内心感到瓦凉瓦凉的打击!我在软件测试这个行业工作了12年之久,截至5年前,我 一直很愉悦地,内心充盈地做着黑盒测试,曾几何时我也觉得最好离"开发"远远的,因为 很多人都说:女孩子做测试挺好的~~ 但是,我遇到很一个非常现实而残忍的问题:"裁员",想想自己也挺奇葩的,在一个公司竟然待了12年之久,在这12年里,因为各种原因,我经历了大大小小的裁员有5次之多,一有裁员需求,老板第一个考虑的就是测试人员。每一次裁员,都是自己团队里的兄弟姐妹,我要亲自告诉他或她,因为公司现在裁员,需 要你离开公司,虽然你的工作是合格的,甚至是优秀的~~然后我要鼓起勇气陪着哭泣的他或她去立刻办理离职手续,一刻也不能停留~~你能想象我内心的崩溃吗?每一次我都会问为什么又是我们?每一次老板都会坦率地告诉我,为什么裁员考虑的是我们测试团队:就 是因为可取代性太强了!!我真的实实在在意识到了黑盒测试的无力。 公司在寒冬时,需要"蓄积能量",也就是需要减少开支,老板就要开始衡量,哪类研 发人员被裁,后续如果公司渡过难关后补起来比较容易,很不幸,每一次评估下来都是测 试人员。有个声音在我脑海里越来越清晰:不能这样,我们团队不能总是做可取代性强的 工作!!所以测试的发展方向是什么?我要有什么样的技能才能改观老板对我们的认知??我开始在网上找,当然也在51testing这样专业的网站上找寻,我找寻的结果是:未来的 测试应该是以自动化为主,手动测试为辅。所以测试人员必须要学会编程,因为测试是一 个无穷尽的工作,如何体现测试人员的价值,就是在单位时间内能有更多的产出,有让老 板瞠目结舌的产出!! 怎么学习Python在第二类问题中有详细说明,期间遇到的困难实在太多了,首要的 问题就是团队的信心不足,我们离开coding实在太久了,这个困难,我只能说,受到的 打击越大,越深,信心就会越足,容许我先哭一会~~ 除了这些形而上的困难,当然也有 实实在在的困难,我举一个实际且非常具体的问题:电脑1开发的脚本,可以正常运行,移植到电脑2就无法运行? 我们在开发时遇到上述问题,开发者开始一直纠结是电脑环境的问题,问题一直在发散,一直在发散,最后问题越来越复杂,搞到最后不可收拾......,最后他告诉我,这个开发任务无法进行@_@,这个小伙子成功在他的小主管的心里留下了:解决实际问题差的印象...... 他的问题在于没有回到问题的本质:Python的作用是定位,操作;就首先回到确认 窗口是否定位的思路上(当时他竟然还质疑他的小主管:窗口肯定定位了,因为在他的开 发电脑上都是定位的好好的*_*):真的发现窗口没有被成功定位。开发者就很困惑,为什么在电脑1是好的,电脑2就不行。他根本没想到是定位出的问题,所以连简单的确认动作也没做!然后再网上一通乱搜,真的越搜越晕,越搜问题越发散。

python实现接口测试

刚进一个新公司,可能要做接口测试,没有用过工具,抄了几行代码,根据自己的理解整理一下,供自己以后学习备用 贴上源码,也希望感兴趣的朋友一起讨论,mail: lnbcc0727@https://www.360docs.net/doc/708866235.html, 使用说明:1.XML可以根据需要,组织测试案例, 2.EXCEL除了预期结果列要写上预期之外,其它列不用填写 3.源码实现执行XML案例,然后与EXCEL中预期做对比,最后将测试结果写入 EXCEL中(执行案例时不要打开EXCEL,以免影响写入操作) 一、XML案例源码(casedata.xml) ...... ...... ........ > 二、保存结果的EXCEL(WebServiceCases.xlsx) 三、python源码: import requests from xml.dom.minidom import parse from openpyxl.reader.excel import load_workbook # 读取XML案例和存有结果的excel AUTO_RESULT=u"WebServiceCases.xlsx" case_file=open(u"casedata.xml","rb")

python多接口测试

python多接口测试 # -*- coding:utf-8 -*- import requests import json import unittest class TestTruck(unittest.TestCase): @classmethod def setUpClass(self): print"---setUpClass---" def test_login(self): '''获取token,需要图形验证码''' url = "http://192.168.3.21:30226/auth/token/profile/get/" headers = {'Content-Type':'application/json;charset=UTF-8'} request_param = { 'username' : '10086', 'password' : '10086', 'captcha':'XHUV', 'hashkey':'7265011fcd710066653b8615fb0fbb8ef44652a8' } response = requests.post(url, data=json.dumps(request_param), headers=headers) # print response.json()['token'] def auth_token_get(self): '''直接获取token,跳过图形验证码''' url = "http://192.168.3.21:30226/auth/token/get/" request_param = { 'username' : '10086', 'password' : '10086'

基于Python的网站速度监测api调用代码实例

基于Python的网站速度监测api调用代码实例代码描述:基于Python的网站速度监测api调用代码实例 代码平台:聚合数据 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib from urllib import urlencode #---------------------------------- # 网站监测调用示例代码-聚合数据 # 在线接口文档:https://www.360docs.net/doc/708866235.html,/docs/140 #---------------------------------- def main(): #配置您申请的APPKey appkey = "*********************" #1.创建任务 request1(appkey,"GET") #2.获取监测任务列表 request2(appkey,"GET") #3.获取监测网站实时数据 request3(appkey,"GET") #4.获取监测网站实时ping响应 request4(appkey,"GET")

#5.获取监测网站实时http响应 request5(appkey,"GET") #6.获取监测网站实时运营商数据 request6(appkey,"GET") #创建任务 def request1(appkey, m="GET"): url = "https://www.360docs.net/doc/708866235.html,/webxmf/createTask" params = { "key" : appkey, #您申请到的APPKEY "url" : "", #要监测的网站的根域名,注意:必须是根域名,其他不支持 "dtype" : "", #返回的数据格式,json或xml,默认json "contactPhone" : "", # } params = urlencode(params) if m =="GET": f = urllib.urlopen("%s?%s" % (url, params)) else: f = urllib.urlopen(url, params) content = f.read() res = json.loads(content) if res: error_code = res["error_code"] if error_code == 0: #成功请求 print res["result"] else: print "%s:%s" % (res["error_code"],res["reason"]) else: print "request api error" #获取监测任务列表

人工智能时代如何使用Python进行自动化测试

人工智能时代如何使用Python进行自动化测试Python在自动化测试中用途很广,人工智能时代的到来又给Python带来了很大的提升空间,那么在人工智能跨速发展的今天,又是如何使用Python 进行自动化测试呢?今天简单的跟大家介绍一下Python自动化测试,这里主要介绍一些Python测试框架。 1.单元测试 2.使用python进行windows GUI测试 3.使用python进行Web自动化测试 4.使用python进行性能测试 Python对服务器端的自动化测试

Python对web的自动化测试 Python对数据库的自动化测试 Python对GUI的自动化测试 Python高性能网络测试框架欧诺个 Python实现远程性能监控 Python实现自动化性能测试 Python对Android APP的自动化测试 Python对Java代码做单元测试 用python做测试的优点: 学习难度小,开发周期短。对目前国内大多数测试人员来说,编码经验不足,python是个很好的入门语言。胶水语言,能与C++, Java, COM, and .NET,Object-C 整合。 测试部门要做单元测试,接口测试,因为人员比例的关系,不可能让测试人员同时掌握多门语言,python可以对C/C++, Java, Object-C进行接口封装后,实现单元测试。语法简约,清晰。减少后期维护的难度。

跨平台 大量可用的库(但python的库有个缺点是,不像perl一样,有个CPAN 类库集中地,大部分集中在SourceForge,其实有google这些都不是问题)成熟的框架。web: django,zope。高性能网络框架:twisted,gevent 丰富python测试工具。此系列文章主要关注于python在测试中的应用。这里有很全面的测试工具介绍 自动化测试框架PyUnit Python游戏开发 Pygame 使写游戏变简单的python库 pyQt专有的GUI库进行图形界面开发 但PyQt虽然可以开发界面,但不是专门用来写游戏的,需要对它加以封装。

Web自动化测试中的接口测试

Web自动化测试中的接口测试 1背景 1.1Web程序中的接口 1.1.1典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端。web客户端的应用有html,JavaScript,ajax,flash等;服务器端的应用非常丰富,比如java的servlet,jsp,ssh框架,.net的aspx,还包括其他脚本如php,python。 web服务器端的设计架构近年来一直比较流行的是三层架构(3-tier application),通常意义上的三层架构就将业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。分层的目的在于降低代码见耦合,提高代码架构的可维护性。 总的来说,这三层架构的意义如下: 1.表现层(UI):用户界面,即用户可见的操作界面或者入口。 2.业务逻辑层(BLL):封装具有业务含义的操作函数。 3.数据访问层(DAL):封装对数据库或者其他存储介质的原子性操作。 1.1.2Web接口的概念 web接口是服务器与客户端交互的方式,即浏览器或者其他客户端工具与web服务UI 层交互的协议.常见的有两大类,一是浏览器与服务器交互的HTTP协议的接口,另一类web service接口如soap,rmi,rpc等协议。 HTTP接口请求方法常用的有GET、POST两种请求类型。具有无连接无状态的特征。HTTP 请求例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件。 1.2WEB接口自动化 1.2.1Web接口测试 web接口测试即站在web服务程序UI层之上自动化测试的一种手段,是站在用户的角度上测试web服务程序业务逻辑的正确性。测试的重点是围绕web服务暴露的接口检查接口

Python接口测试框架实例

Python的接口测试框架实例 分析接口是基于HTTP协议的,那么说白了,就是发起HTTP请求就行了,对于Python 来说简直就是小菜一碟。直接使用requests就可以很轻松的完成任务。架构整个框架是比较小的,涉及的东西也比较少,只要分清楚几个模块的功能就行了。 上面是一个接口测试的完整流程。只要一步一步的走下来就行了,并不是很难。数据源数据源我使用的是JSON来保存,当然,比较广泛的是使用Excel来保存,用JSON来保存是因为JSON用起来比较方便,懒得去读取Excel了,Python对JSON的支持是非常友好的。当然这个就看个人喜好了。{"TestId": "testcase004","Method": "post","Title": "单独推送消息","Desc": "单独推送消息","Url": "http://xxx.xxx.xxx.xx","InputArg": {"action": "44803","account": "1865998xxxx","uniqueid": "00D7C889-06A0-426E-BAB1-5741A1192038","title": "测试测试","summary": "豆豆豆","message": "12345","msgtype": "25","menuid": "203"},"Result": {"errorno": "0"}} 示例如上面代码所示,可以根据个人的业务需要进行调整。发送请求发送请求就很简单了,用requests模块,然后从JSON中读取发送的参数,post、get或者其他。由于要生成测试报告,那么发送的数据需要做一下记录,我选择用txt文本来作为记录的容器。f = file("case.json")testData = json.load(f)f.close()def sendData(testData,num):payload = {}# 从json中获取发送参数for x in testData[num]['InputArg'].items():payload[x[0]] = x[1]with open('leftside.txt','a+') as f:f.write(testData[num]['TestId'])f.write('-')f.write(testData[num]['Title'])f.write('n')# 发送请求data = requests.get(testData[num]['Url'],params=payload)r = data.json() 接受

相关文档
最新文档