假设我们想对对列向量x进行求导。
上面的代码中,requires_grad=True表明x这个东西需要用到梯度; y.backward()执行反向传播,x.grad是x的梯度。
再看一个y=x.sum()的例子:
在计算这个新的函数的梯度之前,需要将x的梯度清零,使用x.grad.zero_()方法。默认情况下,Pytorch会累计梯度,所以计算新的函数的梯度之前需要将原来的x的梯度清零。
注意:一个标量函数关于向量x的函数是一个向量,并且这个梯度向量与x有着相同的形状。
当y
不是标量时,向量y
关于向量x
的导数的最自然解释是一个矩阵。 对于高阶和高维的y
和x
,求导的结果可以是一个高阶张量。
然而,虽然这些更奇特的对象确实出现在高级机器学习中(包括深度学习中), 但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。 这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。
当y是x的函数(y=x*x),z又是x,y的函数(z=y*x)时,我们可以通过下面的例子计算z对x的梯度:
有时,我们希望将某些计算移动到记录的计算图之外。 例如,我们想计算z
关于x
的梯度,但由于某种原因,希望将y
视为一个常数, 并且只考虑到x
在y
被计算后发挥的作用。
这里可以分离y
来返回一个新变量u
,该变量与y
具有相同的值, 但丢弃计算图中如何计算y
的任何信息。 换句话说,梯度不会向后流经u
到x
。 因此,下面的反向传播函数计算z=u*x
关于x
的偏导数,同时将u
作为常数处理。
y.detach()函数返回一个新的张量,这个张量是从当前计算图上分离下来的,但仍指向原变量的内存位置,且这个tensor的requires_grad为False。得到的这个tensor永远也不需要计算其梯度。注意:返回的tensor和原始的tensor共享同一内存。
由于记录了y = x * x,我们仍然可以对y进行反向传播,计算y = x * x对x的梯度,即2 * x:
使用自动微分的一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while
循环的迭代次数和if
语句的结果都取决于输入a
的值。
def f(a): b = a * 2 while b.norm() < 1000: b = b * 2 if b.sum() > 0: c = b else: c = 100 * b return c
让我们计算梯度。
a = torch.randn(size=(), requires_grad=True) d = f(a) d.backward()
我们现在可以分析上面定义的f
函数。 请注意,它在其输入a
中是分段线性的。 换言之,对于任何a
,存在某个常量标量k
,使得f(a)=k*a
,其中k
的值取决于输入a
,因此可以用d/a
验证梯度是否正确。
a.grad == d / a
输出结果:
空洞的概念linux上普通文件的大小与占用空间是两个概念,前者表示文件中数据的长度,后者表示数据占用的磁盘空间,通常后者大于前者,因为需要一些额外的空间用来记录文件的某些统计信息或附加信息、以及切分为块的数据信息(通常不会占用太多)。文件占用空间也可以小于文件尺寸,此时文件内部就存在空洞了。所谓空洞其实就是没有分配存储空间的数据块,当访问这些数据块时,系统返回0,就如同读到空文件一般,当写这些块时,系统再实地分配对应的存储空间。其实这个和内存中的虚址地址与物理地址的概念非常相似——操作系统可以预分配一大块内存地址,这个地址只是一段连续的数字,用来保证虚拟地址不会被其它人占用,而对应的物理地址只在用到时才分配,这样就避免了一下分配一大块内存带来的浪费问题。同理,如果抽象出一个文件地址和存储地址来的话,完全可以套用上面的结论:连续的文件地址保证用户可以访问任意偏移的文件数据;文件中的空洞又避免了一下子分配太多的物理存储带来的浪费。所以空洞不光针对文件,也可以针对内存,可以将虚址中的缺页中断理解为填补内存空洞的过程,文件中也有类似的机制。不过也有一些差异,例如内存因进程间共享而引入的copy
环境准备linux操作系统:物理机,云服务器,虚拟机c++开发调试环境准备安装gcc,g++,gdb 在ubuntu平台: aptinstallgccg++makegdb 在centos平台: yuminstallgccgcc-c++makegdb复制linux下的调试工具gdbhttps://www.sourceware.org/gdb/复制代码https://github.com/CoderDuanGe/gdbdebug/tree/master/section1 makefile参数: CFLAGS:-gundefined在这里插入图片描述有了-g参数调试比较方便,如果没有-g参数,就没有调试信息,调试比较的困难gdb的使用1.对文件进行gdb调试:gdb+文件名**makefile带-g参数的**  **makefile不带-g参数** 来个目标检测(objectdetection),比较火的检测有faster-rcnn,r-fcn,sdd,yolo。后面有时间一一介绍 下面看看halcon如何实现目标检测的 halcon读取8w多张图像,60w多个目标,毫无压力。halcon还是可以的,就是灵活性差不少。* *Thisexampleispartofaseriesofexamples,whichsummarizes *theworkflowforDLobjectdetection.ItusestheMVTecpillbagdataset. * *Thefourpartsare: *1.Creationofthemodelanddatasetpreprocessing. *2.Trainingofthemodel. *3.Evaluationofthetrainedmodel. *4.Inferenceonnewimages. * *Thisexamplecoverspart1:'Creationofmodelanddatasetpreprocess
这是一个官方指南,关于如何对CC1350工程修改,从而利用BLE来无线升级。 GettingStarted BuildyourownapplicationimageanduseBLEOADtouploadthemtotheCC1350Launchpad. PleasevisitCC1350Project0forinstructionsonhowtobuildyourownimageanduseBLEOADtodownloadtoyourdevice. http://dev.ti.com/tirex/content/tirtos_cc13xx_cc26xx_2_20_00_06/resources/cc1350LaunchPad/project0/project0_index.html 如果打不开这个TI的链接,我上传了整个网页,http://download.csdn.net/detail/iotisan/9750301。本文作者twowinter,转载请注明作者:http://blog.csdn.net/iotisan/ CC1350Project0ProjectZeroforthe
最近使用NodeJS的mssql模块连接SQLServer数据库出现了"Incorrectsyntaxnearthekeyword‘user’."的错误,Google了一下发现原来我在SQLServer中使用了user作为表明,但是SQLServer中user是保留的关键字,不能被用于做表名或者变量名。所以解决方案很简单,直接重命名表名user为t_user或者其他的名称就OK了。在SQLServer中定义表结构user并为其添加数据我用的是Windows10系统,在本地系统中安装了SQLServer2012数据库,可以使用SQLServerManagementStudio或者NavicatPremium12等工具连接SQLServer数据库。我习惯使用NavicatPremium12这个数据库客户端工具,连接到SQLServer数据库后,在NavicatPremium12中创建UserDB数据库,再为其创建一个user表 ,其表结构定义如下图所示: 再为user表添加几条记录,如下图所示: 对应的user表的SQL脚本如下:/* NavicatPremiumD
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/shiliang97/article/details/102092224Givenabinarytree,finditsmaximumdepth.Themaximumdepthisthenumberofnodesalongthelongestpathfromtherootnodedowntothefarthestleafnode.Note:Aleafisanodewithnochildren.Example:Givenbinarytree[3,9,20,null,null,15,7],3 /\ 920 /\ 157 returnitsdepth=3.在真实的面试中遇到过来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。递归算=子树的层数+1;/** *Defin
by:授客QQ:1033553122简介Emmagee是网易杭州研究院QA团队开发的一个简单易上手的Android性能监测小工具,主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等性能状态的变化,且用户可自定义配置监控的频率以及性能的实时显示,并最终生成一份性能统计文件。实现原理1、监控应用CPU原理Android系统是基于Linux内核的,所以系统文件的结构和Linux下一样,系统总体CPU使用信息放在/proc/stat文件下,/proc/cpuinfo文件存放CPU的其它信息,包括CPU名称,直接读取即可。Emmagee是将选中应用的PID传入,读取/proc/PID/stat文件信息及可获取该PID对应程序的CPU信息。2、监控应用消耗流量系统中有存放整体流量和针对当程序的流量统计,/proc/net/dev和/proc/uid_stat/UID下存放tcp_rcv和tcp_send文件,分别存放下行流量和上行流量,操作前后相减就得出结果。3、监控内存实现原理获取到当被测应用的PID,然后按照PID调用android的API获取当前被测应用占用的内存。/proc
有点标题党的嫌疑,不过确实网站的主体是在两天内的完成的,后面只是抓取了素材和完善细节。以下内容绝对是赤裸裸的干货。**网站前期的准备:** 1、买域名 2、租服务器 3、编写网站代码总体就这三步,但是每一点都有好多必须要要了解的地方。使用到的工具1、新网域名服务 2、DNSpod 3、locvps 4、Bootstrap 5、nginx+mysql+ubuntu+rails 6、百度网盘,七牛云存储疑问?1、如何购买域名?购买什么域名比较好?域名多少钱? 2、如何租用服务器?国内的服务器和国外的服务器又什么区别? 3、如何绑定域名和IP地址呢? 4、我不会CSS,如何写出漂亮的界面?为啥要购买域名呢?举个例子,每个人出生的时候,都会有一串数字,这串数字会更随着你一生。它就是身份证,14xxxxxxxxxxxxxxxxxx。这串数字是你在地球上生活的的唯一标识符。但是考虑到它的实用性,父母叫你的时候不可能叫你的身份证号吧,所以就给你起了个名字。狗蛋儿。 狗蛋儿对应的就是14xxxxxxxxxxxxxxxxxx。上学同学叫你狗蛋儿,老师叫你狗蛋儿,女朋友叫你狗蛋儿。别人只需要知道你的名字就
中间件:connect-flash 地址:https://github.com/jaredhanson/connect-flash flash消息用于重定向跳转时传递消息,在Express中集成方法如下:在项目中集成安装connect-flash中间件npminstall--saveconnect-flash复制在mainjs中引入(通常是app.js或者项目名.js文件)中间件并加载varflash=require('connect-flash'); app.use(flash());复制到这里,我们的集成工作已经完成,就可以在router中使用类似 req.flash('flash_success_message','文章添加成功!'); 传递flash消息了! 下面教大家如何完整定义一套flashmessage前后端解决方案。在项目中使用一套完整的flash解决方案我的理解是: 后端发送flashmessage,前端动态响应flashmessage一次。 为什么说是“一次”呢?举个栗子: 当我们开发删除数据功能时,通常会
安装pipinstallsnowballstemmer复制这是一款非常瘦小的语言转换库,支持15种语言。'danish':丹麦语, 'dutch':荷兰语, 'english':英语, 'finnish':芬兰语, 'french':法语, 'german':德语, 'hungarian':匈牙利语, 'italian':意大利语, 'norwegian':挪威语, 'porter':波特语, 'portuguese':葡萄牙语, 'romanian':罗马尼亚语, 'russian':俄语, 'spanish':西班牙语, 'swedish':瑞典语, 'turkish':土耳其语,复制snowballstemmer模块有两个功能snowballstemmer.algo
本期题目 (单选题)1、对于如下代码段可以放入到横线位置,使程序正确编译运行,而且不产生错误的选项是() classA{publicAfoo(){returnthis;}}classBextendsA{publicAfoo(){returnthis;}}classCextendsB{_______}Apublicvoidfoo(){}Bpublicintfoo(){return1;}CpublicAfoo(Bb){returnb;}DpublicAfoo(){returnA;}(单选题)2、要表示10个学生的成绩,下列声明并初始化数组正确的是() Aint[]score=newint[]Bintscore[10]Cintscore[]=newint[9]Dintscore[]=newint[10](单选题)3、关于下面代码int[]x=newint[25];描述正确的是() Ax[25]存放了数据“\0”。Bx[24]存放了数据“\0”。C若访问x[25],程序将抛出异常。Dx[1]访问此数组的第一个元素。(单选题)4、已知声明并初始化二维数组inta[][]={{1,2},{3,4}
相爱相杀的爬虫与反爬虫 前言 爬虫与反爬虫,是一个很不阳光的行业。 这里说的不阳光,有两个含义。 第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚至隐瞒自己有反爬虫团队的事实。这可能是出于公司战略角度来看的,与技术无关。 第二是,这个行业并不是一个很积极向上的行业。很多人在这个行业摸爬滚打了多年,积攒了大量的经验,但是悲哀的发现,这些经验很难兑换成闪光的简历。 面试的时候,因为双方爬虫理念或者反爬虫理念不同,也很可能互不认可,影响自己的求职之路。本来程序员就有“文人相轻”的倾向,何况理念真的大不同。 然而这就是程序员的宿命。不管这个行业有多么的不阳光,依然无法阻挡大量的人进入这个行业,因为有公司的需求。 那么,公司到底有什么样的需求,导致了我们真的需要爬虫/反爬虫呢? 反爬虫很好理解,有了爬虫我们自然要反爬虫。对于程序员来说,哪怕仅仅是出于“我就是要证明我技术比你好”的目的,也会去做。 对于公司来说,意义更加重大,最少,也能降低服务器负载,光凭这一点,反爬虫就有充足的生存价值。 那么爬虫呢? 最早的爬虫起源于搜索引擎
公司的程序需要使用一套外部系统,是必须要用,没得商量的那种,这套外部系统Since2001年,有将近18年的历史,跟它对接用什么方式?说出来你可能不信,竟然是用生成Microsoft Access(简称MSAccess)文件的方式,没错,就是生成mdb文件,往mdb里写数据,然后丢给这套外部系统。 一个mdb,就是一个数据库,文件型数据库,这也是很多我这个年代来的程序员接触的第一个数据库系统,我记得最早的时候我是用VB(不是VB.NET,那时没有.NET)来访问它的。后来我发觉在比较简单的应用场景里,根本就不需要把数据保存到mdb中,直接读写带一定格式的文件比mdb访问快得多;再后来我发现可以用一些压缩算法来生成更小巧的数据存储文件;再后来我发现xml是一种可读性更好的数据存储方式;再后来我发觉sqlite功能蛮强,不比MSAccess差,由于开源跨平台,应用场景更丰富……总而言之,我没有理由再使用mdb来存储数据了。 若干年后(如果今天看的话就是许多许多年前了),我去了一家公司,我所在的部门有一套非常重要的程序,用VC++写的,保存数据的文件的格
Redis主从复制原理是什么? 1.设置了一个从服务器,在连接时它发送了一个SYNC命令,不管它是第一次连接还是再次连接都没有关系 2.然后主服务器开始后台存储,并且开始缓存新连接进来的修改数据的命令。当后台存储完成后,主服务器把数据文件发送到从服务器,从服务器将其保存在磁盘上,然后加载到内存中。然后主服务器把刚才缓存的命令发送到从服务器。这是作为命令流来完成的,并且和Redis协议本身格式相同 3.在Redis服务器工作时连接到Redis端口,发送SYNC命令,会看到一个批量的传输,并且主服务器接收的每一个命令都会通过telnet会话重新发送一遍 4.当主从服务器之间的连接由于某些原因断开时,从服务器可以自动进行重连接。当有多个从服务器同时请求同步时,主服务器只进行一个后台存储 5.当连接断开又重新连上之后,一般都会进行一个完整的重新同步,但是从Redis2.8开始,只重新同步一部分也可以 主从复制的作用 1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式 2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实
前言 随着行业的发展,编程能力逐渐成为软件测试从业人员的一项基本能力。因此在笔试和面试中常常会有一定量的编码题,主要考察以下几点。 基本编码能力及思维逻辑 基本数据结构(顺序表、链表、队列、栈、二叉树) 基本算法(排序、查找、递归)及时间复杂度 除基本算法之外,笔试面试中经常会考察以下三种思想: 哈希 递归 分治 哈希 哈希即Python中的映射类型,字典和集合,键值唯一,查找效率高,序列(列表、元祖、字符串)的元素查找时间复杂度是O(n),而字典和集合的查找只需要O(1)。因此哈希在列表问题中主要有两种作用: 去重 优化查找效率 列表去重 列表去重在不考虑顺序的情况下可以直接使用set()转换(转换后会自动排序),需要保持顺序可以使用字典构建的fromkeys()方法,利用字典键值的唯一性去重。不考虑顺序: l=[2,1,2,3,4,5,6,6,5,4,3,2,1]result=list(set(l))print(result)复制 运行结果: [1,2,3,4,5,6]复制 考
一错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 python中的异常种类 在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误 AttributeError试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError输入/输出异常;基本上是无法打开文件 ImportError无法引入模块或包;基本上是路径问题或名称错误 IndentationError语法错误(的子类);代码没有正确对齐 IndexError下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError试图访问字典里不存在的键 KeyboardInterruptCtrl+C被按下 NameError使用一个还未被赋予对象的变量 SyntaxErrorPython代
PCIE背景知识学习(13) CommonRefclk(SharedRefclk)Architecture CommonRefclk(SharedRefclk)Architecture的示意图如下图所示, 这种参考时钟架构是Spec推荐使用的,链路两端的器件均使用同一个参考时钟源。即使系统使用了带有扩频的参考时钟源,时钟抖动也只有-300~+2800ppm,这对于物理层中的RxCDR和TxPLL就比较友好了,可以降低RxCDR和TxPLL的复杂程度,达到节约成本的目的。 DataClockedRxArchitecture DataClockedRxArchitecture的示意图如下图所示: 从示意图来看,这种参考时钟架构最为简洁,Rx端器件的CDR并不需要参考时钟,而是直接从数据流中恢复出时钟。不过这种结构的RxCDR几乎很少在FPGA的SerDes中使用,因为在没有外部参考时钟的协助下,CDR实现锁定都是一个很大的挑战,还要保证在5600ppm的抖动范围内不失锁(对于带有扩频时钟的PCIe链路来说)。 注:绝大部分
2021-10-19 运动会还有十天,这几天每天以十几公里的强度在训练,早上醒来发现小腿有点抽筋的征兆。唉,我是真的想拿名次,大学最后一年了,总想留下点啥。虽说理当感觉会很累,毕竟六月份有段时间也是每天10k,但是这两天好像身体并不疲惫。大概是进入了心流状态了吧,每天比前一天提高十几秒,做梦都能笑醒。 姜建成也是贪,项目接了这么多,都是又臭又烂的那种,每次正做着这个项目突然另一个项目就跑过来说有bug,美其名曰要让我们锻炼在一个项目接手时同时处理另一个项目的能力,其实就是在给他擦屁股。我寻思处理个屁啊,皮包公司就皮包公司呗,反正干完六个月我就跑路,别的什么代码问题爷爷都不管了。
锁的概念 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程并发的访问共享资源,如读写锁)。 在JDK1.5之前,Java是通过synchronized关键字实现锁功能的:隐式地获取锁和释放锁,但不够灵活。 在JDK1.5,java.util.concurrent包中新增了Lock接口以及相关实现类,用来实现锁功能。它提供了与synchronized关键字类似的同步功能,但功能更强大和灵活:获取锁和释放锁的可操作性、可中断地获取锁、超时获取锁等,见下表: 特性描述 尝试非阻塞地获取锁 当前线程尝试获取锁,如果这个时刻锁没有被其他线程获取到,则成功获取并持有锁 能被中断地获取锁 获取到锁的线程能够响应中断(而synchronized则不会响应中断操作) 超时获取锁 在指定的截止时间之前获取锁,如果在截止时间到了仍无法获取锁,则返回。 Lock接口具体的方法及释义: publicinterfaceLock{ /** *获取锁 * *如果当前线程无法获取到锁(可能其他线程正在持有锁),则当前线程就会休眠
很多时候,我们拿到已有的东西理所当然的用了,其实,你真的对你所使用的东西了解吗? 再次犯下这样的错误,是因为在把代码从Altera 的CycloneV移植到Xilinx的Spartan6上,我遇到了非常奇怪的问题: 在modelsim下,对Xilinx平台下的代码进行功能仿真,发现工程中Xilinx的IP核全部都有异常, 乱七八糟的错。 为此,还向FAE求助?但是最终的问题是出现在timescale上,这里,对timescale进行一次详细的梳理,为了避免以后 还会出现类似的错误 timescale是VerilogHDL中的一种时间尺度预编译指令,它用来定义模块的仿真 时的时间单位和时间精度。格式如下: `timescale仿真时间单位/时间精度 注意:用于说明仿真时间单位和时间精度的 数字只能是1、10、100,不能为其它的数字。而且,时间精度不能比时间单位还要大。最多两则一样大。比如:下面定义都是对的: `timescale1ns/1ps `timescale100ns/100ns 下面的定义是错的: `timescale1ps/1ns仿真的单位时间是不能小于时间精度的! 时间精