斯坦福大学你好，现在是12:00之后，所以我想开始
今天的讲座八，我们将讨论深度学习软件，这是一个
超级激动人心的话题，因为它每年变化很多，这也意味着它是一个
进行本次讲座需要做很多工作，因为它每年都会发生很大变化，但与往常一样
在我们深入学习材料之前，请提供一些行政说明，以提醒您
我们将在周二为您的课程项目提供项目建议书
所以希望你们都把它交出来，希望你们都有一些好
您想在课堂上从事什么样的项目的想法，所以我们在
根据项目区域是什么，将TAS分配给项目的过程以及
TAS的专业知识，因此我们将在
接下来的几天，我认为我们也在对作业进行评分
请继续关注，我们会尽快将这些成绩归还给您
另一个提醒是，作业二已经有一段时间了，
将于下周的今天（下周四）开始，并在进行
作业2请记住，当您不在时，请停止您的Google云实例
努力保持您的信誉，并再次努力
我只想再次强调的是，对于作业2，您实际上只是
需要为所有人使用最后一个笔记本的GPU实例
首先是前几本笔记本
只需使用Python和numpy，因此您不需要任何GPU即可解决这些问题
因此，再次保存您的信用仅在需要它们时才使用GPU，最后
提醒是期中考试即将来临，很难相信我们
那里已经有，但是期中考试将在5月2日星期二上课，因此
期中将更加理论化，这将是笔和纸
不同种类的应用更多的理论问题来检查您的
了解我们到目前为止所涵盖的材料，我想我们会
可能会发布至少一小类问题类型的样本
期待问题哦是的问题是它是否开放
书，所以我们要说的是封闭音符，就是封闭的书，所以，是的，那是
我们过去所做的只是封闭式笔记
就像想检查您是否了解其中的直觉
我们介绍了大多数内容，因此快速回顾一下我们的想法
上一次谈论上一次，我们谈论了鸽友的优化
深度学习模型的算法，包括SGD动量Nesterov rmsprop
和原子，我们发现存在这些相对较小的调整
在原始SGD上相对容易实现，但可以使您的
认为让您的网络融合更快一点，我们也谈到了
正则化，特别是辍学，所以请记住辍学是一种
在前向传递过程中将网络的一部分随机设置为零，然后您
在测试时被那种边缘的噪声边缘化了，我们
看到这是许多不同类型的
正则化和深度学习，您可能会在
训练，然后将噪音降到最低
测试时间，所以在测试时间不是随机的，我们也谈到了转移
了解在哪里可以下载经过预先​​培训的大型网络
一些数据集，然后针对您自己的问题对其进行微调，这是一种方法
即使您有能力在深度学习中攻击很多不同的问题
没有自己的庞大数据集，所以今天我们要换档
一点点谈论一些关于写作的细节
软件以及硬件的工作原理，并深入探讨了许多
有关您实际使用的软件外观的详细信息
这些东西在实践中，所以我们将讨论CPU和GPU，然后
我们将讨论一些主要的深度学习框架
在那里使用这些天，所以首先我们谈到了我们提到的这一点
一堆不同的时间，就像计算机有CPU
拥有GPU的计算机深度学习使用GPU，但是我们并不太明确
至此，这些东西到底是什么以及为什么可能是
在不同的任务上要比另一个更好，所以谁在
举手示意，所以也许你们三分之一的人
在球场附近的某处，所以这是我在家中电脑的镜头
我建立的，你会发现里面有很多东西
可能希望您知道其中的大部分内容
零件是CPU，中央处理器就是这个小芯片
隐藏在冷却风扇下方，就在附近顶部附近
情况，这是CPU实际上相对较小，就像
机箱内相对较小的东西，不会占用很多空间，
GPU是这两个巨大的东西，它们占据了巨大的空间
他们有自己的冷却空间的空间
耗电很多他们很大，所以就多少而言
就GPU的大小而言，他们正在使用的功能在物理上
在案件中强加并占用大量空间，所以问题就像
这些东西是什么，为什么它们如此，为什么它们对深层那么重要
很好地学习GPU是所谓的图形
卡或图形处理单元，这些都是最初开发的
用于渲染计算机图形，尤其是围绕游戏的图形渲染
事情如此举手，谁是谁，谁在玩电子游戏
有时不时在家用电脑回家，所以又像
大约一半的好分数，对于那些之前和之前玩过视频游戏的人
建立了自己的计算机，您可能对此有自己的见解
辩论，所以这就像是计算机科学领域的大辩论之一
知道在显卡方面有英特尔与AMD以及视频与AMD
vim与Emacs或文本编辑器以及几乎所有游戏玩家都可能在一起
对于自己偏爱的这两个方面，有自己的看法
卡片和深度学习中，我们通常会选择其中的一个方面
这场战斗的重点是Nvidia，所以如果你们有AMD卡，您可能会
如果您想将其用于深度学习，则会麻烦一些
过去几年中，NVIDIA一直在大力推动深度学习
这一直是他们某些策略的重点，他们投入了很多
努力设计出好的解决方案，以使其硬件更好
适合深度学习，所以当我们
谈论GPU，我们几乎只谈论NVIDIA GPU
也许将来这会有所改变，并且可能会有新的
玩家的加入，但至少在目前，视频是相当主导的
您的想法就像我拥有的​​CPU和GPU有什么区别
在顶部制作了一个小电子表格，我们有两种
高端英特尔消费类CPU，最下面是两个
当前的高端消费者GPU，并且有几个总体趋势需要关注
注意，GPU和CPU都是一种通用计算
他们可以执行程序并执行任意指令的机器
但它们在质上有很大的不同
因此，CPU往往只有少数几个内核供消费者使用，而消费者台式机CPU
这些天，他们可能有大约4或6或多达10个内核
使用超线程技术的高度宽度，这意味着他们可以运行
硬件实际上可以同时运行八个或多达20个线程
因此CPU可能一次可以并行执行20项操作，这并不是一个巨大的任务
数字，但是那些CPU线程实际上非常强大
很多方面，它们非常快，每个CPU指令实际上都可以完成
很多东西，它们都可以完全独立地为GPU工作
这有点不同，因此对于GPU，我们看到这些常见的高端
消费类GPU具有数千个内核，因此最新的NVIDIA Titan XP
最大的消费类GPU拥有384个内核
所以那是一个疯狂的数字，远不止十个核心
您将获得价格相近的CPU，GPU的缺点是每个
那些核心以较低的时钟速度运行，而另外两个核心却真的做不到
相当多，但您无法真正比​​较CPU内核和GPU内核
对苹果来说，GPU内核不能真正非常独立地运行
需要一起工作，并使许多任务陷入瘫痪
而不是每个核心都完全做自己的事，所以您无法真正比​​较
这些数字，但是由于
大量的GPU可以很好地用于并行事物
您需要同时做很多事情，但是这些事情是
cpus之间几乎都具有相同的味道
而gpus是正确的内存概念，因此CPU在
CPU，但是相对较小，CPU的大部分内存为
从系统内存中提取RAM可能会像八点十二
如今，普通消费者台式机上的内存为163.2 GB
而GPU实际上在芯片中内置了自己的Ram
系统中的RAM与
GPU，因此GPU通常具有自己的相对较大的内存块
卡本身，以及Titan XP，这再次可能
这个东西目前拥有的顶级消费卡大约有12 GB
GPU本地内存GPU也有自己的缓存系统，
在12 GB的GPU内存之间进行多种缓存层次结构
和实际的GPU核心，这有点类似于缓存
您可能会在CPU中看到的层次结构，因此CPU非常适合
通用处理，它们可以做很多不同的事情，而GPU是
也许对于这些高度可并行化的算法更加专业，所以
确实非常有效的事物的原型算法就像
矩阵乘法非常适合GPU，因此请记住矩阵
左边的乘法，我们就像一个矩阵，由一堆
我们将右边的行乘以另一个由a组成的矩阵
一堆列，然后生成另一个最终矩阵，其中每个元素
在输出矩阵中是行之一与行之一之间的点积
两个输入矩阵的列和这些点积都是独立的
就像您可以想象的那样，可以将其分解为输出矩阵
完全并具有输出矩阵的所有这些不同元素
所有都是并行计算的，它们都运行相同的
计算采用这两个向量的点积，但恰好
他们从两个输入中的不同位置读取数据的地方
矩阵，因此您可以想象，对于GPU，您可以像爆炸一样
将输出矩阵的所有这些元素全部并行计算，
可以使这个东西实际上在GPU上超级快速地计算出来，因此
这是一种典型的问题
就像我们是GP一样，非常适合可能需要CPU进入的地方
依次进行计算并逐一计算这些元素，
图片有点像人物漫画，因为CPU
这些天有多个核心，他们也可以执行矢量化指令，但是
对于这些类似大规模并行问题，GPU往往具有更好的性能
吞吐量，尤其是当这些矩阵变得非常大时
顺便说一句，卷积与您在
卷积我们有这个输入张量我们有这个权重张量然后每个
卷积后输出张量中的点又是一些内积
在权重的一部分和输入的一部分之间，您可以
想象一下，GPU确实可以使该计算瘫痪，将其全部拆分
并迅速地进行计算，这就是那种
GPU给您带来巨大速度的各种类型的问题的一般风味
相对于CPU的优势，因此您实际上可以编写运行的程序
直接在GPU上运行，因此NVIDIA具有此CUDA抽象，可让您编写代码
看起来像see，但是直接在GPU上执行，但是编写CUDA
代码真的很棘手，编写CUDA代码真的很困难
那是表演者，实际上从这些之中榨取了所有汁液
GPU必须非常小心地管理内存层次结构并
确保您没有强制转换缓存未命中和分支错误预测
和所有类似的东西，所以实际上真的很难写
自己的性能CUDA代码，因此NVIDIA发布了很多
实现常见计算基元的库
针对GPU进行了非常非常非常高度的优化，例如NVIDIA带来了KU爆炸
库，实现不同种类的矩阵乘法和不同的
经过超级优化的矩阵运算可以在GPU上很好地运行
类似地，它们非常接近理论峰值硬件利用率
KU DNN库，实现向前和向后卷积之类的功能
通过学士学位马来西亚的经常性网络
我们在深度学习和Vidya中需要的计算原语
在那里并发布了自己的二进制文件，这些二进制文件可以非常精确地计算这些原语
实际上可以在NVIDIA硬件上高效地运行，但是实际上在实践中，您往往不会
最终编写自己的CUDA代码进行深度学习时，您通常只是一点点
主要是调用别人编写的大部分现有代码
这是已经由Nvidia进行过大幅优化的东西
还有另一种叫做OpenCL的语言
不仅可以在AMD硬件上运行，而且可以在NVIDIA GPU上运行的更通用
在CPU上运行，但是OpenCL并不是没有人真的花费了很多
为获得最佳的深度学习原语而付出的努力和精力
OpenCL，因此性能往往比超级优化的要差很多
CUDA中的版本，所以也许将来我们可能会看到一些更开放的版本
标准，我们可能会在许多其他类型的平台上看到这一点
但至少就目前而言，这段视频是城里最主要的游戏
学习，因此您可以检查有很多不同的学习资源
关于如何自己进行GPU编程
这很有趣，这是一种不同的代码编写范例
因为这是一个大规模的并行架构，但这超出了
本课程的范围一遍又一遍，您实际上不需要编写自己的CUDA代码
在深度学习方面有很多实践经验，实际上我从未写过自己的CUDA
可以为任何研究项目编写代码，但是了解它的方式是很有用的
的原理，即使您自己不自己写，基本概念是什么，如果
您想看一下CPU GPU的性能并练习一下
去年夏天的基准测试比较了相对不错的Intel CPU
针对一堆工作在接近顶部的不同GPU
那时，这些是我自己的基准，您可以找到更多
有关github的详细信息，但我的发现与vgg 16和19类似
ResNet您通常会看到类似65的各种res网络
运行完全相同的计算时，将加速到75倍
在Pascal Titan X的情况下，使用顶级GPU的吉普车与
顶级的不太好的顶级CPU
在这种情况下是一个Intel e5处理器，尽管我想制造一个
这里的警告是，无论何时，您都需要非常小心
阅读有关深度学习的任何基准，因为它非常容易
在不同事物之间是不公平的，您需要了解很多
有关确切基准的详细信息，以便了解是否
不公平，所以在这种情况下我会正确的
告诉你，这个比较可能对CPU有点不公平
因为但是我可能没有花很多力气去挤压
我可能已经调整了爆炸的CPU的最大性能
库更好地提高了CPU性能，我可能可以得到这些
数字好一点，这将使Box之间的性能有所提高
只是将割炬安装在CPU上运行只是将割炬安装在CPU上运行
GPU，这是开箱即用的性能，但并不是真的
CPU上可能达到的理论最高吞吐量
但是话虽如此，我认为仍然有相当大的提速
从这里得到了另一种有趣的结果
基准测试比较了英伟达的这些优化的KU DNN库
用于卷积和诸如此类的东西，而不是那种已经过时的幼稚的cuda
写在开源社区中，如果比较一下
相同的网络，相同的硬件，相同的深度学习框架以及
唯一的区别是替换了这些KU DNN与较少的手写内容
优化的cuda，您可以看到整个速度提高了近3倍
从这个相对简单的CUDA切换到类似
超级优化的qdn实现，因此通常在任何时候使用它
您正在GPU上编写代码，几乎应该总是像make
确保使用两个T和n，因为可能会留下3倍的性能
如果您不致电ku T＆N索取材料，则可以提高工作效率
在训练这些东西时在实践中出现的问题是
您不是您的模型，也许是坐在GPU上，模型的权重在
GPU上有12 GB的本地存储，但您的大数据集正在
在硬盘驱动器或SSD或类似设备上，如果您不
小心，实际上只是尝试读取数据就可能使培训成为瓶颈
因为GP超级快，所以它可以进行正向计算
来回快，但是如果您愿意，可以按顺序阅读
旋转磁盘实际上可以使您的训练成为瓶颈，
可能真的很糟糕，让您慢下来，所以这里的一些解决方案就像您一样
知道您的数据是否真的很小，有时您可能只是阅读了整个数据
数据集进入RAM或即使您的数据集不是那么小，但您拥有巨大的数据集
一吨RAM的服务器，您仍然可以这样做
您还可以确保使用SSD这类硬盘可以帮助您
可以极大地提高读取吞吐量，另一种常见策略是使用
CPU上正在从Ram预取数据的多个线程不在磁盘上
将其缓冲在RAM中的内存中，以便您可以继续提供
以良好的性能将数据缓存到GPU，这有点
设置起来有点痛苦，但再次像这些GPU一样快，如果您
尝试尽可能快地向他们提供数据并不十分小心
读取数据有时可能会成为整个培训过程的瓶颈，因此
要注意的事情，这是对
就像深度学习中的GPU GPU硬件一样
然后我想换一点齿轮并谈论软件
人们正在使用的各种深度学习框架
练习，但是我想在继续之前，关于CPU会有任何问题
GPU是的问题
您
是的，所以问题是你可以机械地做什么
当您编写代码来避免这些问题时，可能是最大的事情
可以在软件中完成的工作就像您无法在cpu上设置某种预取
像是天真的事情是，您将有一个顺序的过程
首先从磁盘读取数据，等待数据等待迷你批处理
读取，然后将迷你批处理送入GPU，然后在GPU周围继续前进，然后
读取另一个小批量并按顺序依次执行所有操作，
如果您实际上有多个like，则可能有CPU线程
在后台运行，正在从磁盘获取数据，从而
而您可以将所有这些东西交错的墙
GPU正在计算CPU后台线程正在从磁盘馈送数据
您的主线程有点等待这些事情-只是做一些
这些事物之间的同步，因此它们都是并行发生的，
幸运的是，如果您正在使用其中一些深度学习框架，
我们将要谈论的是，其中一些工作已经为您完成
因为这有点痛苦，所以深度学习框架的前景是
快速移动，所以去年我讲课时，我主要谈论的是
cafe torciano和tensorflow，以及我上一次讲这个话题时
一年多以前，tensorflow还是相对较新的，它从未像
当时还没有被广泛采用，但现在我认为是去年
tensorflow变得越来越流行，它可能是
是很多人的选择，这是一个很大的变化，我们也看到了很多
去年，新框架如雨后春笋般冒出
所以特别是咖啡馆-pi从我写的一本脸书中介绍了我们的新框架
认为很有趣，还有很多其他框架
像桨一样的百度已经在微软的C NT K上桨了亚马逊主要使用MX MX
网络，还有很多其他框架，但是我少了
熟悉并且真的没有时间参与，但是一件有趣的事情
从这张图中指出的是第一代深度学习
在学术界建立了真正被广泛采用的框架，因此Cafe来自
伯克利火炬最初是在纽约大学开发的，并且还与
Facebook和Fianna大多是在蒙特利尔大学建立的，但是这类
下一个和深度学习框架
起源于行业，所以cafe 2来自Facebook pi火炬来自Facebook
tensorflow来自Google，我们在
过去几年的情况是这些想法
确实从学术界转移到工业中，现在工业是一种
给我们这些强大的强大框架供您使用
我主要想谈谈PI火炬和张量流，因为II个人
认为那些可能是您应该重点关注的那些
这些天研究类型的问题我也要谈一谈咖啡馆和咖啡馆2
但在我们搬动任何东西之前，可能会少强调一点
更进一步，我认为我应该使自己的偏见更加明确
因此，在过去的几年中，我主要从事火炬工作，
我已经非常喜欢它了，然后在去年
我主要将PI火炬作为主要研究框架，所以我有一个
缺少一些其他经验，尤其是张量流，但是
我仍然会尽力为您提供一张清晰的图片和一个不错的概览
这些事情，所以请记住，在我们最近的几次演讲中
这种计算图的想法总是
我们正在做深度学习，您想考虑构建一些计算
图形，用于计算要计算的任何函数
线性分类器将您的数据X和权重W与
矩阵相乘，您将进行某种铰链损失，以进行计算
您的损失有一些正则化项，您可以并且可以想象
将所有这些不同的操作拼接在一起形成某种图形结构
请记住，在大的情况下，这些图结构可能会变得非常复杂
神经网络现在有很多不同的层很多不同的激活很多
不同的权重散布在一个非常复杂的图形中，当您移动到
像神经图灵机之类的东西，那么您就可以使它们变得非常疯狂
计算图，但您甚至无法真正绘制出来，因为它们太大且
凌乱，所以深度学习框架的重点是
您可能想使用其中一种深度学习的三个主要原因
框架，而不仅仅是编写自己的代码，所以第一个是
这些框架使您能够轻松构建和使用这些庞大的功能
计算图而不必担心很多
簿记详细说明了您的另一个主要想法是
每当进行深度学习时，我们总是需要计算梯度
总是计算一些损失，我们总是在计算权重的梯度
考虑到损失，我们想让它自动计算
您不必担心的渐变，您不必编写该代码
您自己想要框架来处理所有这些反向传播
为您提供详细信息，这样您就可以考虑写下前进的方向
您的网络并免费提供反向路径，无需任何费用
额外的工作，最后您希望所有这些东西都能在GPU上高效运行，因此
您不必太担心这些有关以下底层硬件的细节
爆炸，kudiye和cuda以及在CPU和GPU之间移动数据的人
记忆，您希望所有这些凌乱的细节都得到照顾
这些是主要原因，您可能会选择
使用框架，而不是从头开始编写自己的东西，例如
计算图外观的具体示例，我们可以写下
超简单的东西，我们有三个输入输入XY和Z
结合x和y产生a然后我们将结合a和z产生b
最后我们要做的是总结对B的操作
给定标量最终结果C，所以您可能已经写了足够的numpy
此时的代码，以实现编写起来非常容易
这个计算图，或者更确切地说，要实现这一点
在numpy中进行计算，就像最后，您可以写下一个
想要产生一些随机数据的裁判
您想要添加两件事的事情您想要总结两件事的事情是
愚蠢的PI做到这一点真的很容易，但是问题是假设
我们要计算C相对于XY和Z的梯度，因此如果
在numpy中工作，您需要自己写出此反向传递
并且您已经在家庭作业中对此进行了很多练习，但是这可能很友善
一旦变得很大，就会感到痛苦和一点烦恼和凌乱
复杂的事情numpy的另一个问题是它无法运行
在GPU上，因此numpy绝对仅是CPU，而您将永远无法
如果您只是想体验或利用这些GPU加快的速度，
卡在numpy中工作，再次不得不计算自己的痛苦
在所有这些情况下的渐变
如今，大多数深度学习框架的目标是让您
在向前传递中编写代码，看起来与numpy非常相似，但可以让您
在GPU上运行它，并让您自动计算梯度和
这是大多数这些框架的总体目标，所以如果您
试想一下，如果我们看一个张量流完全相同的例子
计算图，我们现在看到在此前向传递中，您编写了此代码
最终看起来与numpy前传非常相似
做这些乘法和这些加法运算，但现在是张量
流程具有这条魔术线，可以为您计算所有梯度，因此
现在您不必去写自己的后退通行证，那就足够了
关于张量流的另一个好处是，您真的可以
就像只吃一行就可以在CPU和GPU之间切换所有这些计算
所以在这里，如果您只是在执行此操作之前添加with语句
前向传递，您只能明确告诉框架我要运行
这段代码在CPU上，但是现在，如果我们仅使用语句更改一点
就像在这种情况下将1个字符更改为将C更改为G一样，
代码在GPU上运行，现在我们已经解决了这个小代码段
这两个问题是我们在GPU上运行代码，并且
框架为我们计算所有梯度，因此非常好，并且PI存储
看起来几乎完全一样，所以再次在PI火炬中写下
所以你定义一些变量，你有一些前向传递和前向传递
在这种情况下，再次看起来非常类似于numpy代码，并且
然后，您可以再次使用PI火炬来计算所有梯度
只需一根线，现在又在pi火炬中切换非常容易
到GPU，您只需要在将所有内容转换为CUDA数据类型之前，
运行您的计算，现在一切都可以在GPU上透明地运行，因此
如果您只是看这三个示例，例如以下三个片段
并排显示numpy tensorflow和您看到的PI火炬
您会看到，就像四遍中的管拱代码中的张量流一样
看起来几乎完全像numpy，这很棒，因为numpy它有一个漂亮的
API确实很容易使用，但是我们可以自动计算梯度并
我们可以自动在GPU上运行，因此在进行了这种介绍之后
潜入并更多地谈论某种东西
在这个tensorflow示例中继续进行，作为整个示例
在剩下的课程中，我将使用两层完全连接的培训
瑞利网络的随机数据作为一个正在运行的示例
在这里的其余示例中，我们将要去
用随机数据上的l2欧几里得损失训练这个东西，所以这是
有点愚蠢的网络，它实际上并没有做任何有用的事情，但确实可以
您设置的是相对较小的自包含代码，可以翻转以适合
幻灯片不要太小，它可以让您展示很多
这些框架中的有用想法，所以在这里右边，然后是另一个
注意我有点假设已经导入了numpy和张量流
在所有这些代码段中，因此通常在张量流中划分
计算分为两个主要阶段，首先我们将编写一些代码
定义我们的计算图，那就是红色，红色代码
在上半部分，然后在定义图形之后，您将
一遍又一遍地运行图，然后将数据实际馈入图
执行您想要执行的任何计算，所以这确实是
张量流中的一种大通用模式，您首先需要一堆代码
建立图表，然后您将运行该图表并重复使用许多
因此，如果您深入研究在这种情况下构建图形的代码
在顶部，您会看到我们正在定义XY w1和w2，
创建这些TFS占位符对象，所以这些这些是
将成为图的输入节点，这些将是条目
指向该图，当我们运行该图时，我们将输入数据
并将它们放入我们内部计算图中的这些输入槽中，所以这是
实际上不像现在分配任何内存，我们只是在设置
这些输入槽连接到图形，然后我们将使用那些
输入槽现在有点像这些符号变量，我们要
对这些符号变量执行不同的张量流操作
为了设置我们想要在这些变量上运行的计算，因此
在这种情况下，我们在X和w1之间进行矩阵乘法
做一些最大的TF来做一个非线性的栏杆，我们正在做另一个
矩阵乘法以计算我们的输出预测
然后我们再次使用一种基本的张量运算来计算
我们的预测与目标谎言之间的欧式距离或l2损失
这里要指出的另一件事是这些代码行实际上并不是
计算任何东西，现在系统中都没有数据
告诉张量流的这个计算图数据结构
放入实际数据后，我们最终希望运行哪些操作，所以这是
只是建立图表，这实际上并没有做任何事情，那么我们有
这条神奇的线，在我们用这些计算出我们的损失之后
然后我们可以要求张量流来计算所有这些
相对于W 1和W 2的损耗梯度
优美的线条，这避免了您编写所有自己的反向传播代码，
您必须在作业中做，但同样没有实际计算
发生在这里，这只是在增加额外的操作
计算图，我们现在起来了。计算图具有这些附加功能
操作将最终为您计算这些梯度，所以现在在此
点，我们已经计算了计算图，我们有了这个
内存中此图数据结构中的大图
我们想要执行以计算梯度损失的操作，现在我们输入
张量流会话以实际运行该图并向其提供数据，因此一次
我们已经进入了会议，那么我们实际上需要构建一些具体的
值将被馈送到图形，因此tensorflow只希望接收数据
在大多数情况下是从numpy数组中获取的，所以在这里我们只是基于创建具体
使用numpy将XYW 1和W 2的XY实际值存储在
一些字典，现在这里是我们实际运行图形的地方，因此您
可以看到我们正在调用一个会话运行来实际执行
图第一个参数los告诉我们实际上是图的哪一部分
想要作为输出，因此我们实际上需要在这种情况下的图形，我们需要
告诉我们我们实际上要计算los和grad 1以及grad W 2，我们需要
与此Feed dict参数一起传递的实际具体值将是
喂到图上，然后在这一行中的这一行做一个小树枝
它正在运行图，然后
为丢失的grad 1 grad w-2计算这些值，然后返回
再次为numpy数组中的对象提供实际的具体值，所以现在之后
在第二行中解压缩此输出，得到numpy数组，或者得到一个
裁判增加损失的贪婪和梯度的损失
您可以使用这些值去做任何您想做的事，那么您就只是一个
很漂亮，这只是一次向前和向后通过
我们的图，如果我们真的想训练，它只需要几条额外的线
网络，所以现在我们现在在循环中多次运行图形
所以我们正在做一个for循环臂，在循环的每次迭代中我们都在调用
会话点运行，要求它计算损耗和梯度，现在我们
使用这些计算出的梯度进行手动梯度设置分步，以
现在更新我们的权重当前值，因此，如果您实际运行此代码
并绘制损失，您会看到损失下降，网络
训练，这运作得很好，所以有点像超级
在tensorflow中训练完全连接的网络的准系统示例
但是这里有一个问题，所以在这里要记住，
每次执行此图时，我们实际上是在输入我们拥有的权重
权重为numpy数组，我们明确将其输入到图中
现在，当我们完成图执行时，它将为我们提供这些
记住梯度是权重的相同大小
因此，这意味着每次我们在此处运行图形时，我们都会复制
从numpy数组到张量流的权重而不是获得梯度
然后将梯度从张量流复制回numpy数组，这样
如果您仅在CPU上运行，这可能不算什么，但是请记住我们
讨论了CPU和GPU的瓶颈，以及复制的实际成本如何
CPU内存和GPU内存之间的数据，因此如果您的网络很大并且
你的体重成分很大，那么做这样的事情将是
超级昂贵和超级慢，因为我们会复制各种数据
每一步在CPU和GPU之间来回移动，这很糟糕，我们不
要做到这一点，我们需要修复，以便显然tensorflow有一些
解决这个问题的想法是，现在我们需要权重W 1和W 2
而不是在我们将要到达的地方作为占位符
他们进入网络和每一次前进
相反，我们将它们定义为变量，因此变量是一个值
驻留在计算图中，并且将持续存在于计算图中
当我们运行相同的图时，跨不同时间的计算图
而不是将这些W 1和W 2声明为占位符，而是
将它们构造为变量，但由于它们存在于图形中，因此我们也
需要告诉tensorflow应该如何正确初始化它们
因为在前一种情况下，我们是从
图我们以numpy初始化它们，但是现在因为它们合适，因为这些
图tensorflow内部存在的事物负责对其进行初始化，因此
我们需要传递一个TF随机正常操作
实际初始化它们，当我们运行此行时，这只是在告诉
tensorflow我们希望如何初始化它们，所以有点
有点混乱了这个方向，现在，现在记住
在上一个例子中，我们实际上是在更新权重
在计算图之外，我们在上一个示例中使用了we
正在计算梯度，然后使用它们来更新权重
numpy数组，然后输入下一步的更新权重
但是现在因为我们希望这些权重存在于图表中
权重更新操作也必须是
计算图，所以现在我们在此分配函数上使用此变量
计算图中的这些变量，现在变异值将
持续跨同一图的多次运行，所以现在当我们运行时
这个图，我们在训练网络时需要特殊的
用一点特殊的咒语运行一次图以告诉tensorflow设置
这些变量将存在于图表中，然后一旦
完成初始化之后，我们可以在这里一遍又一遍地运行图形
我们现在只输入数据，数据和标签x和y以及
权重存在于图中，在这里，我们已经要求网络
要求tensorflow为我们计算损失，然后您可能会认为
这会训练网络，但实际上这里有一个错误，因此，如果您实际上
运行此代码，然后绘制出无法训练的损失，这很糟糕
就像发生了什么一样令人困惑，我们编写了此分配代码，然后运行了
我们可以对损失和梯度进行处理，而损失却是平坦的
有任何想法吗
是的，所以一个假设是，也许我们不小心重新初始化了
WS每次我们称该图为一个很好的假设时，实际上
不是这种情况下的问题
哦，答案是我们实际上需要明确地告诉
我们想运行这些新的w1和新的w2操作的tensorflow，所以我们建立了
在内存中建立了这个庞大的计算图数据结构，现在当我们调用
运行时，我们只告诉张量流我们要计算损失，如果您愿意
看图内这些不同操作之间的依赖关系
您会看到为了计算损失，我们实际上不需要执行此操作
更新操作，使tensorflow很智能，并且仅计算
计算您要求其计算的输出所必需的图形
这是一件好事，因为这意味着您只会做很多事情
根据需要工作，但在这种情况下可能会有点
令人困惑并导致您意想不到的行为
所以这种情况下的解决方案是我们实际上需要明确地告诉
tensorflow来执行这些更新操作，所以我们可以做一件事
建议的是，我们可以添加新的w1和新的w2作为输出，
只是Excel tensorflow，我们想将这些值生成为输出，但是
这也是一个问题，因为这些新的w1新的w2值又是
这些大型GPU或大型张量，所以现在如果我们告诉tensorflow我们想要那些
作为输出，我们将再次获得CPU和GPU之间的这种复制行为
每一次迭代都是不好的，我们不想那样，所以有
您可以改用一个小技巧，就是在其中添加一个虚拟节点
这些带有假数据依赖关系的图，我们只是说
此虚拟节点更新具有新w1和新w2的这些数据相关性，并且
现在，当我们实际运行图时，我们告诉它计算损耗和
这个虚拟节点，这个虚拟节点实际上并没有返回任何值
只是不返回任何内容，而是因为我们将放入
节点，它确保当我们运行更新值时，我们实际上还运行了这些
更新操作，所以问题
有没有我们没有放X和
进入图表，该状态结束了其数据numpy，因此在此示例中，
重用X＆Y，每次迭代中我们都重用相同的x和y
您是对的，我们也可以将其保留在图中，但是
更现实的场景x和y将有许多批次的数据，因此这些将
实际上在每次迭代中都会发生变化，我们将希望提供不同的值
对于每次迭代的用户，在这种情况下，它们本可以留在图中
但在大多数情况下，它们会发生变化，因此我们不希望它们出现在图表中，因此
现在这是另一个问题
所以我们告诉它我们进入张量流，我们想要损失的输出和
更新更新就像是一个更新，实际上不是一个真正的价值，因此当
更新评估它只返回不返回任何值，但是由于这种依赖性，我们已经
告诉它更新取决于这些分配操作，但是这些分配
操作位于计算图中，而所有都位于GPU内存中，因此
然后我们完全在GPU上执行这些更新操作，
不再将更新的值复制回图表之外
尽管问题是TF组是否不返回任何内容，所以这进入了
张量流的棘手性，因此TF组返回了一些疯狂的张量流值
它实际上并没有像内部tensorflow节点那样返回
我们需要继续构建图形但需要执行的操作
该图，当您告诉会话点内部运行什么内容时
想要从更新中计算具体值，然后不返回任何值，因此
每当使用张量流时，您都会得到这个有趣的间接
在类似构建图形之间，然后在构建期间的实际输出值之间
该图是一个有趣的怪异对象，然后您实际上得到了一个具体值
当您运行图形时，在这里运行更新后，则输出为none
清理一点
您
因为为什么价值损失，为什么没有更新，这仅仅是
更新有效，因此当我们告诉我们所需的张量流时，损失是一个值
运行张量然后我们得到具体的值更新是这种特殊的
其他不返回值的数据类型，而是不返回任何值，因此
那里正在发生的一些张量流魔术，也许我们可以离线交流
如果您仍然感到困惑，是的，这种行为来自
组方法，所以现在我们有点想使用这种奇怪的模式
这些不同的分配操作，我们必须在小组中使用这种有趣的茶
事情有点痛苦，所以谢天谢地，tensorflow可以给你一些
方便操作可以为您完成这类工作，
称为优化程序，所以在这里我们使用TF列梯度下降优化程序
我们在讲学习等待，我们要使用什么学习率，
您可以想象，那里有一个Don，那里有rmsprop，那里有各种各样的
现在我们将不同的优化算法称为优化器优化器
减少损失，现在这是一个非常神奇的事情，这是一个非常神奇的事情
事情，因为现在这个调用知道这些变量W 1和W 2
默认情况下被标记为可训练，因此在此优化器内部
最小化它的参与并将节点添加到图形中以计算梯度
关于W 1和W 2的损耗，然后它也在执行该更新
为您进行的操作，正在为您进行分组的操作
做标志就像在里面做很多神奇的事情，但是然后
最终给您这个神奇的更新价值，如果您深入了解
他们实际使用的是TF组的代码，因此看起来非常相似
从内部来看，我们之前和现在所看到的，当我们在内部运行图形时
循环中，我们执行相同的模式来告诉它计算损失和更新
每次我们告诉图形计算更新时调用的时间
实际去更新图的问题
什么是TF全局变量变量初始值设定项
所以-初始化w1和w2是因为这些是存在的变量
在图表中，因此我们需要创建TF时看到的内容
变量，我们有这个TF点随机法线，这是初始化
TF全局变量变量初始值设定项导致TF
随机法线以实际运行并生成具体值进行初始化
这些变量
因此，它知道占位符将被馈送到图的外部，并且
变量是存在于图中的东西，所以我不知道所有
有关如何决定该呼叫实际运行的详细信息
我认为您必须仔细研究一下代码才能弄清楚，也许是
记录在某个地方，所以现在我们又有了这个
完整地训练网络张量流的这个示例示例，我们有点
添加钟声和口哨声使其更加方便，这样我们就可以
同样在前面的示例中，我们使用
我们自己的张量操作tensorflow就像您总是可以做的那样，您可以使用
10种基本张量运算可计算几乎所有您想要的东西
tensorflow还为您提供了一堆便利功能，
为您计算这些常见的神经网络事物，因此在这种情况下，我们可以
使用TF损失均方误差，它对我们来说只是l2损失，所以我们不
必须自己根据基本张量运算来计算
这里的另一种怪异是令人讨厌，所以我们有
明确定义我们的输入并定义权重，然后像链
他们一起使用矩阵乘法在向前通过中
例如我们实际上没有在层中放置偏见，因为那会是
是额外的yep然后我们必须初始化偏差我们必须得到它们
在正确的形状中，我们必须传播对输出的偏见
矩阵的乘积，您可能会看到很多代码
写起来会很烦人，一旦你喜欢卷积
以及bash规范化和其他类型的图层这种这种基本方式
就像这些变量具有这些输入和输出，并且
将它们与基本的计算图操作结合在一起可以
有点笨拙，喜欢确保您可以真的很烦
用正确的形状和所有类似的东西初始化权重，以便
结果是有一堆环绕的高级库
tensorflow并为您处理其中一些细节
所以带有张量流的一个例子就是里面的TF点层
在此代码示例中，您可以看到我们的代码只是显式声明
X和y分别是数据和标签的占位符
现在我们说H等于TF，即层密集，我们给它输入X和
我们告诉它单位等于H，现在它将撕裂，这又是一种
神奇的线，因为在这行之内
设置w1 + + + b1为那些具有
正确的形状有点像在图表中，但对我们却隐藏了一点
并使用此Xavier初始化程序对象设置初始化
这些策略，以便您在我们明确地与我们合作之前
这个TF点随机的正常业务，但现在这里有点处理那些
其中一些细节对我们来说只是吐出一个H
与上一层中看到的H相同，它只是在做一些
这些细节给我们，您可以在这里看到我们也在通过激活
等于TN n Trail ooh，所以它甚至在激活REA Lu激活
在我们这一层内部起作用，所以它要照顾很多
我们的建筑细节问题
Xavier深度初始化程序到特定的发行版，我确定
有一些默认值，我不确定这是什么，我想你也在看
文档，但实际上我认为这似乎是一个合理的策略
如果您运行此代码，则其收敛速度将比上一个更快，因为
初始化更好，您可以看到我们使用了两个调用TF点
层，这使我们无需做所有这些明确的书就可以建立模型
簿记详细说明了自己，因此这也许更方便一些，但
TF变种镇上唯一的游戏有很多不同
人们在tensorflow之上构建更高级别的库
这是由于这样的原因，例如基本阻抗不匹配
计算图是一个相对较低级别的东西，但是当我们使用
神经网络中我们具有层和权重的概念，有些层具有
与它们相关的权重，我们通常认为稍高一些
比这个原始的计算图更抽象的水平，这就是这些
这些不同的软件包正试图帮助您，并让您在此工作
较高的抽象层，因此您可能拥有另一个非常受欢迎的软件包
混乱是一个非常漂亮的API，它位于
tensorflow并处理为您建立这些计算图的过程
在后台，Karis还支持钢琴作为后端，所以
这也很好，在此示例中，您可以看到我们建立了模型
作为一系列序列，我们构建一些优化器对象，然后将模型称为
进行编译，这在后端建立图表时发挥了很多魔力
我们可以称其为点拟合模型，它可以为我们完成整个训练过程
如此神奇，所以我不知道它如何工作的所有细节，但我知道
卡里斯（Karis）非常受欢迎，因此如果您在聊天，可以考虑使用它
关于张量流问题
您
是的，问题就好像没有明确的
pgp在这里继续，所以我省略了它以保持代码干净，但是您
在一开始的示例中就可以很容易地交换所有内容
这些在CPU和GPU之间的东西，或者有一些全局标志或一些
不同的数据类型，还是像某些带有语句的数据那样
通常相对简单，在每种情况下只需交换大约一条线，但是
那条线看起来到底是什么样子
视情况而定，实际上有一大堆
您可能在野外看到的更高级别的tensorflow包装器
看来，即使是Google内部的人也无法真正达成共识
是正确的使用方式，但哪一个是正确的使用方式，所以我是karis和TF
了解其他人可以在互联网上找到的第三方库
人，但是这三个不同的TF层TF slim和TF
所有都使用tensorflow运送的国家烧伤
这个高级包装器的版本略有不同
另一个也来自谷歌的框架但没有与tensorflow一起发布
漂亮的张量，可以做同样的事情，我想这些都不是
因为他们几个星期前就继续写了
并发布了他们自己的称为SONET的高级张量流说唱歌手，所以我
如果您对所有这些都感到困惑，我不会对您不满
事情很多，他们选择并不总是很好
彼此，但嗯，您有很多不错的选择
tensorflow有预先训练好的模型，在TF满贯和
kara，因为记住训练前的训练模型在您训练时非常重要
您自己的东西还有张量板的想法，您可以在其中加载
你我不想细节，但是张量板你可以添加一些
对代码进行检测，然后在进行操作时绘制损失和内容
训练过程张量流还使您可以在可能的地方运行分布式
分解在不同机器上运行的计算图，这很酷，但是
我想可能不是Google以外的人真的在使用该功能
这几天取得了巨大的成功，但是如果您想运行分布式的东西
张量流可能是城里的主要游戏，因为旁注是很多
张量流的很多设计都是从此获得精神灵感
来自蒙特利尔的早期框架称为钢琴，我不想经历
仅在您自己浏览这些幻灯片时，即可看到详细信息
代码钢琴最终看起来非常类似于
tensorflow我们定义一些变量我们做一些前向传递
达到一些梯度，我们编译一些函数，然后运行该函数
一遍又一遍地训练网络，所以它看起来很像张量流，所以
我们还有很多工作要做，所以我将继续进行PI火炬
也许最后要提问，所以来自Facebook的PI火炬有所不同
从张量流来看，我们有三种显式的不同层
PI火炬内部的抽象，因此PI火炬具有此张量对象的
就像裁判射线一样，它势在必行。
命令式数组它对深度学习一无所知，但它可以
运行GPU，我们有这个变量对象，它是计算图中的一个节点
可以建立计算图，让您计算出
东西，我们有一个模块对象，它是一个神经网络层，您可以
将这些模块组合在一起以构建大型的大型网络，因此如果您愿意
考虑一下PI焊炬和张量流之间的大致等价关系
PI火炬张量的作用与numpy数组相同，并且
张量流PI火炬变量类似于张量流张量或
变量或占位符，它们都是计算图中的各种节点
现在PI火炬模块就相当于这些
来自TF点L'Amour TF点层或SONET或其他的更高层次的东西
更高层次的框架，因此关于PI火炬的一件事要注意的是
那是因为它带有这种高级抽象，并且真的像
更好的高级抽象本身称为模块
选择只需要坚持使用NN模块，您就会变得很好
去，你不必担心哪个更高的水平
使用包装程序，所以像我所说的那样，PI火炬张量就像numpy一样
数组，所以一件事，所以在这里，我们完成了整个两层网络
使用整个pi火炬张量要注意的一件事是，我们不是
不再在这里导入numpy，我们只是在做所有这些操作
使用PI火炬张量，此代码看起来就像排序
您在第一个作业中用numpy编写的两层网络代码中的一个
到您的设备时，您会设置一些随机数据，并使用一些运算来计算
向前通过，然后我们明确查看向后通过
我们自己只是通过网络突然弹出
就像您做作业一样，现在我们正在做一个
使用学习率手动更新权重
使用我们计算出的梯度，实际上，但是
PI火炬张量和numpy数组是它们在GPU上运行，因此您拥有的一切
使此代码在GPU上运行的方法是使用其他数据类型，而不是
使用火炬点浮点张量进行火炬转移
您可以使用这种新的数据类型来转换所有张量
一切都在GPU上神奇地运行，所以键入时您应该想到PI Torch
张量仅是num pi加上GPU，那完全是什么
深度学习没有什么特别的，所以pi火炬的下一个抽象层是
变量，所以这是一旦我们从张量移到变量，现在
建立计算图，我们就可以自动采用渐变
像这样的一切，所以如果X是变量，则X点
data是张量，X dot grad是另一个包含
相对于该传感器的损耗梯度，因此X点梯度数据是
包含这些梯度的实际张量以及PI火炬张量和变量具有
完全相同的API，因此任何可以在PI火炬张量上运行的代码都可以
强制将它们转换为变量，然后运行相同的代码，除了现在
建立计算图，而不是仅仅执行这些命令
操作，因此在创建这些代码时，我们在此处进行了完全相同的X操作
变量每次调用每次对变量构造函数的调用都将PI火炬包起来
张量，然后还给出标志是否我们要计算
关于此变量的渐变，现在在前向传递中
与张量情况下的变量完全一样
因为它们具有相同的API，所以现在我们正在计算我们的预测
以这种必要的方式计算我们的损失，然后我们需要
到，然后我们将损失称为“顶部倒退”，现在所有这些梯度都针对
我们然后可以使用
现在在W 1 grad数据中存在渐变，因此最终看起来像这样
最终看起来很像numpy的情况，除了所有渐变
释放一件事要注意，PI割炬和张量之间有些不同
流是在张量流的情况下，我们建立了这个显式图
然后在PI火炬中在此处多次运行该图形，而不是在构建一个
每次进行前向传递时都会生成一个新图，这会使代码看起来有点
清洁剂，它还有其他一些含义，我们稍后会介绍
因此，在PI排序中，您可以通过定义
在张量方面向前和向后，这最终看起来像
您为作业2编写的模块层代码，可以在其中实现
使用张量操作向前和向后移动，然后粘贴这些东西
在计算图内部，所以在这里我们定义自己的Ray Liu，然后
我们实际上可以进入并使用我们自己的视图是我们自己的ray Loewy操作
然后将其粘贴到我们的计算图中并定义我们自己的
这样操作，但大多数时候您可能不需要定义
您自己的自动毕业操作在大多数情况下需要
大多数已经为您实现，所以在张量流中，我们看到
可以移动到诸如Kerris或TF点学习之类的东西，这给了我们更高的
级别的API而不是与之等效的原始计算图
pi火炬是NN软件包，它提供了这些高层次的高
用于处理这些事情的水平包装器，但是与张量流不同的是
仅其中之一，并且效果很好，因此如果您使用的是PI，请使用它
火炬，所以这最终看起来就像是在乎我们定义我们的位置
建模为线性和轨道操作的某些层序列，我们使用
NN包中定义的一些损失函数是我们的均方误差
丢失，现在在循环的每次迭代中，我们都可以运行数据
通过模型获得我们的预测，我们可以对损失进行预测
函数获取标量损失，然后我们可以向后调用损失获取所有
免费进行渐变，然后遍历模型的参数并执行
显式梯度下降步骤来更新模型，我们再次看到
每次我们做一个建立这种新的计算图
正向传递，就像我们在张量流饼图中看到的那样，提供了这些
优化器操作会抽象出来，它正在更新逻辑和
实施更先进的更新规则，例如atom和诸如此类，因此我们在这里构建
一个优化器对象，告诉它我们希望它对参数进行优化
该模型的使用可以为其他超参数提供一定的学习率，现在
计算完梯度后，我们可以调用优化器这一步
来了，它在这里为我们更新了模型的所有参数
所以实际上，您将在紧身火炬中做的另一件事是定义
您自己的终端模块，因此通常您将编写自己的类，
将您的整个模型定义为一个新的模块类，并且一个模块是
只是可以包含其他任何模块的神经网络层
或可训练的重量或其他状态，在这种情况下，我们可以
通过定义我们自己的和最终模块类，重做两层网络示例
现在在类的初始化程序中，我们将其分配为线性1并
线性2，我们正在构造这些新的模块对象，然后将其存储
在我们自己的班级内部，现在在前进通道中，我们可以同时使用
自己的内部模块以及对
变量来计算网络的输出，因此在这里我们接收内部
在此正向方法中，将输入X作为变量，然后传递
对于第一层的自点线性变量，我们使用自动渐变操作
钳位以计算Ray Lu，我们将其输出传递给第二个线性和
然后，我们得到了输出，现在剩下的代码用于训练
在构建优化器和循环的地方看起来几乎一样
每次迭代都向模型提供数据
计算有损失的梯度，而不是向后优化程序，因此
这就像您在许多Pi中可能看到的相对特征
火炬式训练场景，您可以定义自己的课程，定义自己的
包含其他模块的模型，那么您会有一些明确的
这样的训练循环可以运行并更新它
您在Pi火炬中拥有的生活质量是数据加载器，因此数据
装载机可以为您处理微型批次，它可以处理一些
我们为您讨论的可以实际使用的多线程
后台有多个线程为您构建迷你批处理并进行流式处理
磁盘之外，所以在这里数据加载器包装数据集并提供
其中一些抽象为您服务，在实践中，当您要运行自己的
自己的数据，您通常会编写自己的数据集类，该类知道如何
从您想要的任何来源读取您的特定类型的数据，然后包装
它在数据加载器中进行训练，因此在这里我们可以看到现在
遍历数据加载器对象，在每次迭代中
产生小批量的数据，它在内部处理
改组数据和多线程数据加载以及所有此类内容
对您来说，这是一个完整的pi火炬示例，很多Pi
训练代码最终看起来像这样的pi火炬提供了预先训练的
模型，这可能是我所经历过的最流畅的预训练模型体验
看到你只是说一个火炬视觉模型Alec的净预训练等于真实
它将在后台下载，预火车在等您
你还没有他们，然后就在那儿，你很好，所以
这是超级好用的pi火炬，也有一个叫做vis的软件包
圆顶，可让您直观地观察其中一些类似于
张量板，但这很好，我实际上没有机会
自己玩一玩，所以我不能真正说出它有多有用
张量板和vis Dome之间的主要区别在于张量板
实际上让您可视化计算图的结构
这真的很酷，真的是非常有用的调试策略和愿景
还没有该功能，但我自己从未真正使用过，所以我
不能真正说出它的效用，因为一点点的PI火炬有点像
一种较旧框架的更新版本的改进，称为
在过去的几年中，我工作过很多的火炬，但我不想
在这里详细介绍，但PI火炬在许多方面要好得多
比旧的Lua火炬要好，但实际上它们共享许多相同的后端C代码
使用传感器和张量上的GPU操作进行计算，如果不是
你看过这个火炬的例子，最终某人看起来像
与PI火炬类似，有些不同，也许您可​​以逐步完成
离线，但有点像火炬和
PI火炬是火炬实际上在Lua中而不是Python，与这些其他东西不同
所以学习Lua对于某些人来说是一个关闭的火炬
Auto Grad火炬也更旧，因此更稳定，不易受错误影响
可能还有更多用于火炬的示例代码，它们的速度差不多
这不是真正的问题，但是在PI Torch中，它在Python中很棒
您拥有Auto研究生，这使得编写复杂的模型变得非常简单，并且
Lua火炬您最终会编写很多自己的反向传播代码，有时这是
有点烦人，但是PI火炬是新的，它的现有代码更少了
仍然会有所变化，所以这是更多的冒险
至少对我来说，我更喜欢馅饼，但我并没有太多理由
现在不再使用火炬取代饼式火炬，所以我几乎使用PI
这些天来，我们只为我所有的工作而割炬。
关于静态图和动态图的想法，这是主要
区分PI割炬和张量流的特征，因此我们可以看到张量流
您有两个操作阶段，首先要建立这个阶段
计算图，然后一遍又一遍地运行计算图
很多次重用同一张图，称为静态计算图
图，因为只有一个，我们看到PI火炬完全不同
我们实际上是在建立这个新的计算图这个新的
在每个前向传递上被称为动态计算图的事物
带有前馈神经网络的简单案例
确实产生了很大的不同，代码最终看起来类似，
它们的工作原理相似，但我想谈一谈一些
静态与动态的涵义，以及在这些方面的权衡
二是静态图的一个好主意是，因为我们有点
一次建立一个计算图，然后多次重用
框架可能有机会进入并对该图进行优化
以及某种保险丝某些操作会重新排序某些操作会找出最多
操作该图的有效方法，因此它可以真正高效，并且
我们将多次重复使用该图，也许您可​​以
优化过程的前期成本很高，但是我们可以用
我们多次运行图表时获得的速度提升，因此
可能是一个具体的例子，如果您编写一些具有卷积的图
和瑞利的运算接连出现
一些花哨的图形优化器可能会进入并实际输出，例如发出自定义
融合了操作的代码融合了轨道上的卷积
它正在计算与编写的代码相同的内容，但是
现在也许可以更有效率地执行，所以我
不太清楚张量流图中的实际状态
优化是现在，但至少在原则上，这是一个，这是一个
真正可以做静态图的地方，您可以有潜力
在静态图中进行此优化
在哪里或可能不是这样
对于动态图来说是易处理的关于静态与静态的另一种微妙之处
动态是序列化的想法，因此使用静态图，您可以想象
您可以编写此代码来构建图形，然后在构建完
图，您在内存中具有此数据结构，它代表整个
网络的结构，现在您可以采用该数据结构
将其序列化到磁盘，现在您已经拥有了网络的整个结构
保存在某个文件中，然后您可以稍后重新加载该文件，然后运行run
该计算图无需访问构建它的原始代码，因此
在您可能想到的部署方案中，这会很好
您可能想用Python训练您的网络，因为
更容易使用，但是在序列化该网络之后，
现在可以将其部署在可能不需要使用的C ++环境中
原始代码构建的图形具有静态的一个不错的优势
图，而使用动态图，因为我们将它们交织在一起
图构建和图执行的过程，您需要原始的
如果您想将来再次使用该模型，请随时进行编码
动态图的一些优点是它使
在许多情况下，您的代码更简洁，更轻松，例如
假设我们想执行一些条件操作，具体取决于
我们想要做不同的运算来计算Y的某个变量Z的值
如果Z为正，我们要使用一个配偶率矩阵，如果Z为负，我们
想要使用不同的权重矩阵，而我们只想在
pi火炬中的这两种选择，因为我们使用的是动态图
非常简单，您的代码看起来完全像您期望的那样
就像您在numpy中所做的一样，可以只使用一种管道
正常的Python控制流程来处理此问题，现在，因为
每次执行此操作时，都要建立图表
采取两条路径中的一条，在每个前进方向上建立不同的图形
通过，但是对于我们最终建立的任何图形，我们可以向后传播
通过它就好了，代码很干净，现在很容易使用
张量流的情况有点复杂，因为我们想
因为一旦这种控制流程操作员需要
在张量流图中成为显式运算符，现在您可以看到
我们有这个TF com2调用，有点像张量流版本的
if语句，但是现在将其放入计算图中，而不是使用
某种Python控制流程，问题在于，因为我们仅构建
该图一旦成为我们程序的所有潜在控制流路径
可能会流过，因此我们在构建它时需要将其烘焙到图中
在我们运行它之前，这意味着任何类型的控制流运算符
您需要成为不是Python控件的完整运算符
您需要使用某种魔术特殊的tensorflow操作来执行
在这种情况下，控制流是TS cond的另一种类似
如果想要循环，就会发生这种情况，假设我们要计算
某种递归关系，其中YT等于YT减去1
再加上XT乘以一些权重矩阵W，然后根据每次执行此操作
我们每次计算时都会有不同的大小序列
数据，无论我们只想计算数据序列的长度
无论输入序列的大小如何，都具有相同的递归关系
零件，这非常容易，我们可以使用普通法线进行循环
Python仅循环显示我们要展开的次数，现在
根据输入数据的大小，我们的计算图最终将变为
不同的大小，但没关系，我们可以向后传播
现在在张量流中，这变得有点丑陋
因为因为我们需要在此控件的前面一次构造所有图形
流循环构造再次需要成为张量流中的显式节点
图形，所以我希望您能记住函数式编程，因为
必须使用这类运算符来实现循环构造和张量
流量，因此在这种情况下，对于这种特殊的重复关系，您可以使用
完整的del操作并传递这些并通过某种方式实现
就完整del而言，这是一个特定的循环，但这基本上意味着
你有这样的感觉，张量流几乎可以建立自己的整个
最终使用计算图语言和
任何种类的控制流运算符任何种类的数据结构都需要
卷入计算图，因此您无法真正利用所有的
在Python中使用命令式lis的最喜欢的范例
需要重新学习一套完整的控制流运算符
如果您想在计算内部进行任何类型的控制流程
图使用张量流，所以至少对我来说
所以至少对我来说，我有点难以理解
有时会四处走动，我有点喜欢使用PI Torch动态包裹
可以只使用您最喜欢的命令式编程结构，并且一切正常
顺便说一句，实际上有一些不错的图书馆
称为张量流折叠的库，可让您隐含一层
张量流之上的这些层中的另一层，使您可以实现
动态图，您可以使用张量流折叠来编写自己的代码
看起来有点像动态图操作，然后tensorflow full做
为您提供一些魔术，并以静态方式实现
张量流图这是一篇超新论文，我清除了
这个星期在法国，所以我没有DI Evan来潜水的机会
玩这个，但是我的最初印象是它确实增加了一些
到张量流的动态图数量，但它仍然有点尴尬
与PI Torch中具有的那种本机动态图一起使用，因此
那么我想我想激励就像我们为什么要关心
关于动态图，所以一种选择是一种循环
网络，因此您可以看到对于图像字幕之类的东西，我们使用
在不同长度的序列上运行的递归网络
在这种情况下，我们要作为标题生成的句子是一个序列，
该顺序可能会有所不同，具体取决于我们的输入数据，因此现在您可以看到
我们在原子中具有这种动力，这取决于物体的大小
我们的计算图可能需要增加或减少的句子
元素，因此这是动态图的一种常见应用
上个季度将CS 2提升至4 n的你们中，您看到了递归网络的想法
有时在自然语言处理中，例如
一个句子的分析树，然后您想要一个神经网络
递归地操作该解析树，因此具有这样的神经网络
不仅适用于不仅是顺序的图层序列，而且
而是在某种图形或树结构上工作，而不是在哪里
现在每个数据点可能具有不同的图或树结构，因此
然后计算图的结构
反映输入数据的结构，它可能因数据点而异
数据点，所以这种事情似乎有点复杂且毛茸茸
使用张量流实现，但在饼图中，您可以像
正常的Python控制流程，效果会很好
另一个更多的研究应用是我喜欢的这个非常酷的想法
称为神经模块网络，用于视觉问题解答
所以这里的想法是我们想问一些关于图像的问题
也许输入这张猫和狗的图像，有一个问题是
猫，然后在内部系统可以读取问题，并且
有这些不同的专用神经网络模块可以执行
要求颜色和寻找猫咪等操作，然后根据
问题的文本，它可以编译此自定义架构来回答
问题，现在是否有两个不同的问题
现在有更多的猫和狗，我们可能具有相同的基本模块集
诸如寻找猫和狗，数数之类的东西，但它们排列在一个
不同的顺序，因此我们再次获得了这种动态性，其中可能存在不同的数据点
产生不同的计算图，但这更多的是
研究性的东西，也许现在还不是主流，但这有点像
更重要的是，我认为有很多很棒的创意应用程序
人们可以使用动态计算图，也许在那里
现在没有那么多，只是因为和他们一起工作是如此痛苦
所以我认为做酷创意的机会很多
与动态计算图复杂的事情，也许
想出一些好主意，我们明年将在演讲中介绍它，所以我想谈一谈
非常简短地介绍了咖啡馆，这是伯克利的框架，
与您在许多其他深度学习框架中有所不同
情况下，您实际上可以训练网络而无需自己编写任何代码
只需调用这些预先存在的二进制文件即可
一些配置文件，并且在许多情况下，您可以在不进行任何操作的情况下训练数据
编写任何自己的代码，以便您可能首先使用
转换为类似hdf5或LM DB的格式，并且在cafe中存在一些脚本
他们可以像将图像和文本文件的文件夹一样转换为这些格式
为您，您需要立即定义而不是编写代码来定义结构
计算图，然后编辑一些称为proto的文本文件
txt在这里设置计算图的结构
是我们从某些输入的hdf5文件中读取的内容，我们执行了一些内部乘积
我们有些失落，图的整个结构在此建立
文本文件的缺点之一是这些文件可以真正
对于非常大的网络来说很难看，所以对于152层ResNet这样的东西
最初是在咖啡厅接受培训的模型，然后是此原型txt文件
结束了将近7,000行的记录，所以人们不会用手写这些
需要人们有时会喜欢编写Python脚本来生成这些脚本
制作P文件原型，然后您就可以自己滚动了
计算图抽象可能不是一个好主意，但是我
在那之前看到过，而不是拥有一些优化器
对象，而是有一些求解器，您在另一个内部定义了一些求解器
proto cxt定义您的学习率，优化算法和
没什么，然后一旦您做所有这些事情，您就可以经营咖啡馆
用Train命令生成二进制文件，这一切都神奇地发生了Cafe拥有一个模型动物园
有很多预先训练好的模型，这非常有用
Python介面，但您所需要阅读的文档不足
Python界面的源代码以查看其功能
烦人，但确实可以正常工作，我的一般输出
Cafe可能对前馈模型有好处，对
生产场景，因为您不依赖于Python，但是可能
这些天来进行研究，我发现咖啡馆的使用量可能会减少一些
尽管我认为它仍然在工业上再次非常普遍地用于
生产我保证在咖啡厅的一两张幻灯片上放一张幻灯片-所以咖啡厅-这是一张
来自Facebook的Cafe的继任者，它是超新的，只发布了
一周前，所以我真的没有时间形成受过良好教育的见解
关于cafe 2，但它使用类似于tensorflow的静态图
我们有点像咖啡馆之一，其核心是用C ++编写的，并且有一些Python
界面的区别在于，现在您不再需要喜欢自己编写
可以生成原始txt文件的Python脚本，您可以定义自己的
计算图结构全部以Python的形式呈现，
看起来有点像您的流程，但随后您可以吐出
您可以将此计算图结构序列化为原始txt文件，然后
然后，一旦对您的模型进行了训练，那么我们将获得这种好处
谈到静态图，您可以在其中不需要原始培训
现在编写代码以部署火车模型，所以一件有趣的事是
您已经看到Google可能有一个主要的深度运行框架，
tensorflow其中facebook具有这两个Python
饼图和咖啡馆2，所以这是Google的不同哲学
试图建立一个框架来统治所有可能适用于每个人的框架
深度学习的可能场景，这很好，因为它就像
将所有努力整合到一个框架中，这意味着您只需要
学习一件事，它可以在许多不同的场景下工作，包括
分布式系统生产部署移动研究一切
只需要学习一个框架即可完成所有这些工作，而Facebook是
采取一些不同的方法，其中PI火炬的确更多
更专注于研究的专业，因此在编写研究代码方面
并快速获得对您的想法的评级，这非常容易，而且火炬手也很容易
例如在移动设备上运行的生产中运行pi火炬
没有太多的支持，所以2号咖啡厅适合
那些更面向生产的用例，所以我的一般研究是我的一般
有关针对哪个问题使用哪种框架的总体建议
两者兼而有之，我都认为tensorflow是一个不错的选择
关于您要启动新项目的任何项目，因为它是一个
统治它们的框架几乎可以在任何情况下使用
但是，您可能需要将其与更高级别的包装器配对，如果
想要动态图，可能有些运气不好
在我看来，看起来有点丑陋，但也许有点像
装饰细节，并没有多大关系
我个人认为pi火炬真的很适合研究，如果您专注于
只是编写研究代码，我认为PI火炬是一个很好的选择，但是
它有点新，它的社区支持更少，代码更少，所以它可以
如果您想要更多通俗易懂的路径tensorflow，请尝试一下
如果您对生产部署感兴趣，可能是一个更好的选择
应该看一下cafe cafe 2或tensorflow，如果您真的很专注
在移动部署上，我认为tensorflow和cafe 2都内置了一些
支持这一点，所以不幸的是，不仅仅是
全球最佳框架，这取决于您实际上要做什么
您期望什么应用程序，但是这些是我对以下方面的一般建议
这些事情，所以下次我们将讨论一些有关的案例研究
各种DNN架构