在 python 中部署 cpu 版本的 py torch 与 gpu 版本 py torch 的 方法 cpu 版本的 py torch 非常简单,我们首先打开 py torch 官网,在装印栏往下翻,在 install py torch 这个位置,点击 cpu 就 会出现 run this command。 我 们复制 p p three install torch torch vision 这个命令,然后在系统搜索栏搜索,输入 enter, 点击进入,直接复制命令运行, 等几分钟, cpu 版本的 pad 二就安装完了。 gpu 版本的 pad 二只安装有两种方法,一种是手动安装,另一种是自动安装。在这里我都给大家演示一遍手动安装的方法,稍微复杂一点,大家要仔细听。 第一步,还是在搜索栏搜索,启动安利康达。第二步,输入康达 info nvs 这条命令用于查看当前安利康达中所有已创建的虚拟环境。第三步,输入 concreate and torch three hundred ten python equals three point one o。 在 这里明确自己安装的 python 版本,确保后续的 py torch 安装与 python 版本兼容。这时候会弹出 pro c t s o 二,我们直接 yes 即可。第四步,输入 canada activate torch 三幺零,激活当前环境。第五步,我们在搜索栏输入 cmd, 在 命令窗口输入 nvidia 杠四 me, 这是为了查询我们的 gpu 下载链接,我的版本是一二点零。 接着我们打开 petech 官网,我们复制一一点八版本的链接,然后在安得康的环境中粘贴运行,一个小时左右就安装好了。另一种方式非常简单,只要用到这个第三方库的一键安装工具,它会自动帮你适配版本。全自动安装,如果你也很讨厌环境搭建中出现各种问题,评论区留言安装助手。
粉丝117获赞551

大家好,这期视频教大家在 windows 系统下从零开始安装,配套是 gpu 版本,不需要自己装哭,打五分钟搞定,适合新手,一次成功。首先我们检查电脑有没有英伟达显卡, 咱们只需要按住扭键盘上的文件和 r 键,然后在这个运行框里面输入 cmd, 点击确定,在这个 cmd 框里面大家可以输入英伟达, 英伟达杠 s m。 二,看这里是不是出现了英伟达显卡的型号, 我的电脑是三零六零显卡,这里还有酷达的版本,如果出现了这个显卡型号和酷达这个酷达的版本,说明咱们的 gpu 环境是正常的,如果没有出现这样的字样的话,说明你的电脑环境里面没有显卡,那么只能安装 cpu 版本的 pay touch。 接下来咱们就需要安装安纳康达,这里一定要知道什么是安纳康达,安纳康达是一个开源的数据科学平台,它集成了多个数据科学机器学习、数据处理和可量化的工具和库, 它是管理和安装 pay touch 极其依赖性的强大工具,就像你安装游戏一样,它这个安纳康达就像这个游戏的下载器一样。 咱们看一下,咱们只需要点击这个链接进入清华大学开源软件镜像站来下载安纳康达,他现在已经进入这个网站了,看一下咱们去下载哪个版本,一般话咱们下载比较旧的版本就可以,因为他会比较稳定一些的, 就比如说我这里选一个,这二零二四年十月一号,这里一定要注意,咱们安装是 windows windows 版本,咱们就选择这个,这里是六四,就表代表是六四位的,点击一下 看这里他就开始开始下载,咱们稍微等待一下,现在已经下载完成了,咱们只需要去双击安装一下,咱们选择下一步,我同意 选择第一个,这里他默认是安装到 c 盘里面,我不建议大家安装到 c 盘,可以将这个安纳康达安装到其他盘里面,比如说我给他 安装到 d 盘里面,找一下这个其他的盘,找一下 d 盘,随便找个这 shopware 这个文件夹里面,点击确定,选择下一步,他这里是必须得 是一个空的文件夹,看一下 d 盘里面,再找一下这个稍为新建文件夹,给它起一个名字叫安呢,确定这样就可以 选择 next, 咱们只需要点这个一三四就可以再点击这个安装,现在安装完成继续点着 next, 然后 next 这两个取消分内时,这样安装完成以后,咱们接下来就要配置它的环境变量,咱们配置它的环境变量,咱们可以看下这个文档,找到这几个路径就可以先找到这个此电脑右键 属性,找到属性,然后选择高级系统,设置环境变量。接下来咱们还需要找到这个环境变量里面的这个 pass, 找一下这个 pass 在 哪里,在这里咱们就需要找到咱们安装的 anaconda 的 位置。 那康达我是安装到了 d 盘里面,找一下 d 盘,在 software 文件夹里面,你们安装软件可以找一个固定的文件夹,你看这里是不是就比较好找?这是第一个路径, 继续看下文档,看他是怎么写怎么写的。第一个是这个安娜康达,这个路径是只要选在这个安娜康达就可以, ctrl c, 这是我之前配置的,咱们直接给他这么覆盖掉就可以,这是第一个路径。还有第二个 是找到这个安娜康达里面的 script 这个文件夹,咱们在安娜康达里面再找一下 script, 在 ctrl c 这个 script 给它复制进来。接下来就是 library bin 这个文件夹,这几个环境变量咱们都已经给它配置好了, 接下来咱们就需要去检验一下这个 anaconda 是 否安装完成,咱们只需要在这个搜索框里面输入这个 anaconda implement, 看这里,如果找到这个 anaconda implement, 咱们只需要在这里输入 conda 空格两个杠不是,如果出现版本号的话,说明咱们这个 anaconda 就 安装成功了。 接下来就是安装配套尺,咱们只需要点击这个链接,然后进入这个配套尺, 看这里就是他这个配套尺的下载命令。这里要注意一下,如果是你用的是别人的开源代码,不同的项目使用的使用的配套尺是版本是不一样的,看他开源项目的版本是有哪些。我在这里我随便下一个, 比如说我就下载这个,一般是它里面自带这个库达,它这里就采用是库达,十一点八 我就下载这个,咱们直接将这个命令给它复制粘贴一下就可以继续打开咱们那 konda proman 的 这框。为了不污染这个系统环境,咱们首先要创建一个虚拟环境,这里写一个 konda action, konda konda konda 杠 n, 这里给它起个名字,比如说我改了这个环境叫这个 play touch python 使用的是三点三点一零的版本,这样这个环境就是虚拟环境创建好了,让它稍微等待一下, 这里选择 y 虚拟环境创建好以后,咱们再继续输入这个 cuda activity, 在 paytouch 去激活一下这个虚拟环境,在这个激活的虚拟环境里面输入这条咱们刚刚复制的这条指令, 让它去下载 paytouch, 如果这个下载速度过慢,大家可以用您手机的热点去下载。现在这个 paytouch 已经下载完成了,那么咱们去检验一下这个 paytouch 是 否安装成功, 咱们只需要输入这个 import touch, 输入是 pass, 咱们先输入 pass, 再输入 import touch, 继续输入这个 touch, 它是点儿库哒点儿或者点儿库哒点儿 is available available b l e 就是 这样的吧,等等,我还忘记,然后看一下这里,看它是咱们直接看文档就可以输入,看一下这几个拼没拼对 available, 这里微了,如果输出的处说明咱这配套是这个 gpu 版本的配套,就安装成功了,到时候训练的话就可以用到这个显卡。 然后接下来的话,我就会教大家如何利用下载好的 paytouch 和这个啊 paycharm, 然后也就是编辑器, 然后和编辑器这些联动,咱们使用这个 paycharm, 然后去训练模型。接下来咱们安装 paycharm, 咱们先找到由我提供的这个 paycharm 安装包,咱们只需要双击一下,然后点击试,然后下一步, 他默认是安装到 c 盘里面,咱们将它改装,改到 d 盘,然后将前面的去掉, 然后将这个 c 改成 d, 改到 d 盘,然后下一步, 然后将这些都勾选上,然后再点击下一步,点击安装这里稍微等待一下,现在安装完成以后,咱们点击这个完成。接下来咱们需要去启动一下这个配唱嘛,因为这是专业版,咱们还需要激活, 然后现在是退出,然后现在点击这个激活软件,然后只要双击一下, 如果出现了这样的这个 size 这个字样,说明就激活成功了,然后再继续点开这个陪唱,这样话就没有三十天的限制的字样了。然后咱们继续,然后咱们先创建一个项目看一下,咱们选择这个第三个, 然后选择已经重载了,然后选择 konda, 这里的话,咱们选择 anaconda, 选择因为 anaconda 我 安装到了 d 盘里面, 找一下这个 software, 然后 anaconda, 然后咱们找到 library, 然后找到 bin, 然后找一下 konda, 点 bet, 好 找一下这个在 它是 c 开头儿,康达点儿,就这里咱们选择 ok, 然后选择咱们创建的环境这个 pact 虚拟环境, 然后选择 correct, 这样就可以了。接下来咱们去测试一下咱们这个配唱吗是否和咱们的 pact 联动了起来。咱们现在找一个创建一个 python 文件, 随便给它起个名字叫 test, 这样的话呢,当 python 文件就创建好了,然后在这个 python 文件里面输入 import, 然后 import, 然后 touch, 然后 print print, 然后继续输入 touch, 点儿 code, 点儿 is available, 然后右键去运行一下这个文件,你看这里又出现了处, 说明咱们的配唱和配 touch 联动起来了,如果大家如果出现问题话,一定要检查这个最右端,你是否将你的虚拟环境加载进来了?今天的教程就到这里,感谢大家观看。


训练大模型 o m 了,第一反应是找导师加预算买卡,大错特错!今天教你招 gradient checkpointing, 不 用加钱也能跑大模型,而且 accuracy 不 损失半分。传统解决显存不足,要么压缩模型丢效果,要么减小 backsize 拖慢收敛太 low 了。 真正的高手是用 time space trade off, 虽然多花了百分之三十的 computer time, 但能换来几倍的显存空间? cost performance ratio 直接拉满。 我是于哥,做了八年科研辅导,具体怎么做,逻辑非常简单。第一步, segment forward, 把模型的前向传播切成几段,每段开头只存一个 checkpoint, 就 像搭积木,我只留几个,关键之处,中间的积木先拆了腾地方。第二步, forward pass, 跑前向式,除了 checkpoint, 其他的中间寄货只用完就扔你的显存背包里,只留必需品。 第三步, recombe backward, 等到反向传播需要数据时,再从最近的 checkpoint 重新跑一遍。那一段虽然多算了一次,但显存真的省下来了。 我实验室是实际训练 white 大 姐,原来 bethesda 只能开到二显存红到爆。用了 petech checkpoint api 之后, bethesda 直接提到八,显存利率提升了四倍。虽然训练时间增加了百分之三十,但模型最后的效果和原来 exactly the same。 把这个对比实验写进 paper, 神老人直接给了 positive。 想知道怎么用银行代码实现这个 trick 吗?我整理了一份重计算实操指南,里面包含 python、 python 的 代码模板,还有大模型切分的避坑清单,扣一一两个字我来安排。顺便把那份科研进阶指南也送你,帮你快速发顶会!

好,那么各位同学啊,我们接下来的话呢,就开始下载 coden 这个插件,那么首先呢,我们先输入 coden 的 地址,那么这个地址呢,我也提供在了笔记当中 啊,进去之后呢,我们会发现啊, coden 呢它有很多个版本,目前的话呢,呃,我推荐大家使用的是,而且我这里自己电脑下的也是这个 八点叉到一点叉啊。嗯,因为我觉得就是虽然说它整体来说都是向下兼容的,但是我觉得这个版本相对来说会稳定一点啊 啊,所以说我们点击这个八点叉到一点叉啊,好,那我们稍微等待一下,因为这个官网也是外网嘛,所以相对来说比较慢一点啊,我们进入这个界面之后呢,发现这个八点最这个八点叉系列的最新的版本就是八点九点七, 这里头呢它也是支持十二点,就是酷的版本,十二点几的,十一点几的都有啊,所以这个的话,呃,相对来说支持版本多一些。好,我们就点击这个我自己的这个十二点零的这个啊,第一个就可以了啊,进入到这个下载界面之后呢,我们就选择自己的这个 windows 版本 啊,这个括号 zipp 的, 这就可以了啊,这里头它有一个特点啊,就是说下载 cudn 呢,需要你去注册一个英伟达的账号 啊,如果说你之前没有注册过的话,那么这里头呢就按照他的提示一步一步注册就可以了。首先呢先输入这个电子邮箱,跳转到注册账户这个界面,那么我们在注册账户这个界面呢,正常输入密码就是密码,然后知悉什么的就可以了啊, 这里面他还有一个呃验证机器人的一个按钮啊,我们正常点击就行了。 好,点击创建用户啊,这里面的话呢,它就给你的电子邮箱里发送了一份验证邮件,我们呢现在就登录我们自己的这个邮箱 啊,点开邮件里面呢就有这个验证的链接,我们点击验证电子邮箱继续前往就可以了。然后在这个验证之后的话呢,它会给你呃接下来提供一些需要你去完成的一些辅助信息啊, 我们在这个英语达网站点击提交 啊,比如说你的一些呃这个姓氏啊,名称啊,然后呢你的这个地址啊,还有你的这个职业行业啊啊,这个的话,大家呢选择自己就是随便的填一下就可以了 哎,有一些必选的大家填一下,然后呢没有必选的大家就不用填了。 好,全部填完了之后呢,我们就点击提交按钮就可以了。 好,这回呢我们再次下载呃 c u d n 的 时候呢,它就会自动的在左下角开始下载了, 等到下载完成之后,它呢实际上是一个在 windows 下面啊,实际上是一个 zip 包,我们把这个 zip 呢解压一下,就得到了一个文件夹 啊,我们可以看到啊,像这些 bin 啊啊, include, lib 这些文件夹呢,就是我们一会儿要考到我们 could 这个安装路径下的一些文件啊。我们首先呢先把这个呃文件夹的最总的这个文件夹名称简化一下啊,变成 c u d n n 就 可以了, 然后我们把它直接拖拽到我们 could 的 安装路径下啊 啊,那么这时候有同学会问啊,老师,我忘了我酷的安装的时候呃是什么样一个路径了,对吧?哎,那么我们可以依然是点开右键开始菜单啊,或者是此电脑里的属性啊,看一下系统信息,系统信息里面有一个, 哎,高级系统设置,大家还记得吧,点开这个高级系统设置里面的呃,环境变量啊, 我们可以看到,因为我们之前安装酷的时候,它会自动给我们生成两个系统变量的路径啊,那么这个路径呢,其实就是酷的安装的位置, 那我们只要把这个路径复制到什么呢?你比如说我这个这复制到 v 杠十二点零啊,这个就是我目前十二点零的一个路径了,你只需要把 c u d n 拷贝到我们 v 十二点零这个文件夹下就可以了 啊,如果说你的版本不是十二点零,你的版本 v 十一点八, v 十 v 十一点五的,对吧?哎,同样的道理啊, 好,那么接下来呢,我们已经把刚才的文件夹拷贝到了目标路径,那我们来测试一下 c u d n 以及酷狗是否有安装成功啊。 好,那么在酷狗的这个原声文件夹里头呢,自动的带了一些测试的运行程序啊,比如说呢,在 x 处里头就有两个运行程序啊,现在的话呢,点开 v 十二点零 x 处,然后呢再点开这个 demo, 好,进入这个里头之后呢,我们把它的文件夹的这个整体路径拷贝一下,然后我们点开终端, 点开终端之后,我们 cd 一个双引号啊,这这个双引号里面呢,写的就是我们运行测试程序的路径 啊,我们进入到这个路径之后呢啊,有两个 e x e 啊,第一个的话呢是半的 test, 这个 e x e 啊,我们直接输入半的 test 啊,然后回车点击运行,我们可以看到啊,在出来的一堆信息之后呢, 写了一个 pass 啊,说明呢我们的程序安装的没有问题啊,就是测试通过了,然后呢我们再点第二个运行程序, ok, 依然是运行通过。好,那么到这的话呢,就说明我们 c, u, d, n 以及库的呢,已经安装成功了。

一天学一个变态的人工智能知识第一百三十期,这节课要讲的是 python, 这个框架怎么学呢? 最近很多小伙伴都问我一个问题,就是现在深度学习啊,你看都用 python 去做啊,这个框架挺好用,那我该怎么学呢?代码我之前也没练过,也是可能跨着方向转专业过来的。那怎么办?很多学员跟我说要不要买本书去系统学一学, 其实说心里话,我不太建议大家买书,因为代码这个东西,还是你要自己去跑,自己去练的。光看这个东西啊,其实没啥用,尤其是对一个框架来说,我们需要学的是啥?我给大家先说一说啊,你第一步啊,不要说你上手就能自己去写很多东西,不可能, 你不是干这个领域的,你没干个半年,一年半载的,你去写东西绝对不可能先能看得懂就行了,你可能说就是能把所有东西都看懂,不太容易,先看懂一个大概,后续呢,咱边看边查都行。这是第一件事,我建议大家呢,就是先去理解拍套当中一些基本语法, 你先能看得懂,先能知道是做啥的,暂时又够了。但是这些东西啊,绝对不是说你一口气全背下来的,先有个概念,后续呢,咱查东西查的也快。 第二件事,有了一些基本概念完之后,我建议大家多找一些,嗯,比如说简单点的开源项目,咱们干啥呢?我们去看看人源码,主要就是不是说走马观花,从上大家去看有一个模式啊,叫做抵 bug 模式, 常看我视频小伙伴我估计会发现,我经常给大家去抵 bug 些源码。为什么要抵 bug 源码呢?因为你在抵 bug 过程当中你就能看到,哎呀,我这一块第一行代码做什么,第二行代码做什么?整体项目的逻辑又非常清晰。所以说首先你要拍套学是啥? 学的是能看得懂,能理解他执行任务的一个流程。你可别说上来我就自己写啊。上来你别自己写,能看懂就不错了,你花个一个月半个月时间先能理解这圆满能达到什么水平呢?你看的时候 能边看边查去理解,这就可以了。能写那都是很往后以后的事了,那都得结合你自己的任务,自己的项目边练边玩了。然后最后呢?干什么?最后我建议大家就是多刷论文,多看算法,结合论文和算法,你去抵霸这些原码, 周日复始啊,你搞个十几个二十个啊,这些算法卷码论文,你再去想一想,看看现在你拍套能力就会有一定提升了。所以说是先能看得懂,再能去理解流程,最后慢慢结合你的任务去慢慢练这个东西拍套是不是说上来你就用系统掌握的, 我们先能达到能用、能理解,边看边查,后续慢慢提升的一个过程。为帮助同学快速学习 photoshop 框架,收集整理好了 photoshop 教程书籍、论文、项目实战,感兴趣的同学留个学习抱回家。

那咱们上节课已经安装好了安纳 canada, 咱们先打开编辑工具,点击 windows, 然后呢,你选择最近添加这个带 provent 的, 点击以后就会打开一个命令行的窗口,命令行的窗口上节课也给大家演示了,你可以搜 canada 杠杠 word 来看到你安装的版本。然后呢,咱们现在需要在这里安装一个独立的环境,就是独立的拍帧环境,咱们可以这么搜 canada rate 杠 n 一个,你的环境名叫 python, 然后还有个什么命令来着啊,你指定好,指定好你的拍身环境啊,咱们就叫拍身杠三点幺零,这是最低的一个版本,稍后呢会给大家讲,为什么这是最低的版本?好吧, 回车就可以了,它就会再进行初识化,然后制定这个环境, 你就需要一步一步跟着它的提示安装就可以了。然后呢,它安装什么你不要管,只要不报错,就是完全没有问题。 行,这就显示咱们安装完成了。然后你看它也给我们进行提示了,你可以操作这行命令激活这个拍帧环境,你点击回车,它就会激活到这个环境里面。你看这里啊,最开始的时候呢,它是 用这个 bios 环境,然后呢,你激活到 p s two 以后,它就进到了 p s two 环境。好吧,这里呢,咱们就可以打印银行命令了啊,你就输入 python, 你 看看它安装的 python 环境是多少, 他演示的时候是告诉我们这已经是三点幺零的版本了。那就好了,这样的话,咱们按着 ctrl z 敲回车,他就已经退出出来了。然后呢,我给大家看一看我之前都演安装了一哪些 三二一开始好了,那接下来呢,给大家演示一下如何通过命令来查看一下我们都安装了哪些虚拟的环境。你搜 canada env list, 它就会罗列出来我们之前都安装了哪些工具。 你看他之前告诉我们之前安装一个 p 拍真三,刚才我们演示安装的是 p s two, 好 吧,然后现在我们已经在这个 p s two 的 环境里面了, 那在这里的话,咱们就需要接着往下安装了,像安装一个 p t o s, 那 p t o s。 就 需要一个其他的命令了啊,咱们看这些命令都在这个文档给大家准备好了。好吧,咱们就往下看,这里呢,你输入这个拍真环境,只要它不报错, 这里只要他不报错啊,他能演示出来这些环境,就说明咱们安装的环境是成功了,就虚拟环境已经独立的创建成功了。然后呢,在特定的环境下,你可以在这里哎,查看你已经安装了哪些独立的环境啊, 就是你执行这个命令的时候,一定要在这个拜师的啊模式下面,你别在这个排真山里面啊,排真山里面,他已经进入到一个虚拟的环境了。 然后呢,你还可以通过一些命令删除一些独立的环境,都是可以做得到的啊。那接下来呢,咱们就需要安装 padios 了, 那 padios 它是有一个官网的,这个图呢,也是给我们选的啊,就是我们根据不同的操作系统啊,嗯,这 linux max windows, 然后呢,以及说它的一些版本, 然后呢,他的安装命令 pad 呀,或者是萨克斯还立板,建议大家用这个 pad 啊,像有一些其他的命令,他安装起来可能会比较复杂,也比较慢,甚至会更容易出错一点。然后他语言咱们一般就选择 pi 森,因为我们刚才也是创建了一个 pi 森的虚拟环境,所以呢,咱们 他的安装的语言尽量也选择拍帧的,如果你是那种 java 的 或 c 叉 c 加加的,你就可以选择这个啊,这个呢,对环境来说,嗯,不是特别友好,是吧?建议啊,跟着咱们视频的步骤来,就选择拍帧的。 然后呢,你如果是,嗯,一些云计算呢,有算力的服务器的话,你就可以选择这个酷达的版本。然后呢,咱们在这里演示啊,使用的是 windows 的 电脑,所以就应该选择 cpu 的 版本,那 cpu 版本呢?它,它就是这一行命令。然后呢,就可以给我们安装一个 type 环境。 那咱来到这个网站啊,你看一看他都是让我们怎么选择的,就是不同的环境下你选择的方式是不一样的好吧,最小化以后,你打开浏览器 输入就这个命令,它就会来到一个人家 python 的 官方页面,它这里有选择了,你就这是最新的版本啊,你可以选择 windows 的, 选择 linux, 选择 mac, 你 看你每次选择以后,这一行执行的命令它是会改变的啊,咱们是 windows 系统,我就选择这个,然后 type 安装拍帧环境这里呢,我我们要选择 cpu 啊,因为我们现在这 windows 环境肯定是没有算力的啊,这种酷达的版本就是无法使用了,你一般都是需要去到云端有算力的服务器上,像 嗯,显卡呀这相相关的配置的时候才选择这个酷达的版本啊,咱们 cpu 就 选择 cpu 的 版本,这行命令你复制过来还是回到咱们命令行里面,来到拍帧兔的环境里面执行这行命令, 他就会给我们安装 cpu 版本的 pad 了,等待他一步一步进行下载,这是下载他的一些安装工具啊,下载他的一些依赖啊,以及他使用到的一些插件,都会给我们进行一个下载。你也可以理解为啊,这是在给我们安装一个安装包, 好到这里呢,咱们就已经安装完成了啊,那安装完成了的话,咱们就需要来验证是否已经安装成功了,然后呢你就输入 python, 然后呢你在这里显示 import torch, 然后呢你再输入一行这个命令啊,你等它执行完,我带着你去拿到这个命令,你验证一下它的版本就可以了。 这个是安装的啊,你看咱们这里呃各地给大家提一嘴吧,你看这个就是咱们 win windows 安装 cpu 的 一个版本啊,咱们在初识学习阶段啊,使用 cpu 的 版本就已经完全够用了,因为咱们如果呃安装这种 库达版本了,他需要我们对这个库达的版本有一个很强的强依依赖,就是你这个在拍套着二点零以后啊,对这个库达版本的依赖性很强,如果你选择错了,他可能会有很多很多的问题。好吧,在这里我们就先选择啊, cpu 的 版本在初学阶段啊, 等你将来的时候一定是会使用这种算力的形式的,但是咱们在学习阶段一定要先选择这种形式啊,这种形式相对会简单一点,等你现在都学的差不多了以后,再切换上这个形态也是相对比较容易的。好吧, 那这个就是咱们一句话带过了,在这里呢,你就需要验证一下 pad 是 否安装成功了,你执行这段命令,这段命令是来验证这个 pad 环境是否有这个库达的运行版本,肯定是没有的啊, 就是这里会给咱们一个 false, 你 别管他给这个 false 还是 true, 只要是不报错,就说明我们 pad 环境安装成功了,这为什么会给咱们一个 false 呢?就是因为啊,咱们是 cpu 的 版本,肯定没有库达的版本,所以他给了我们一个 false, 那 到这里他整体的安装就完成了。同时呢,咱们下节课啊,会给大家演示一下呃,矩阵的 相关的操作呀,就是如何继续拍套子创建一个矩阵,然后呢?创建矩阵都有哪些方式?矩阵的形态都有哪样的好,但在指之前需要再给大家演示一个东西,就是你当时安装这个安娜看他的时候,他会有一个这种的图形化工具啊,你给他运行起来, 给它运行起来以后呢,它就会生成一个图形化的工具,它这个工具里面能告诉我们大概有哪些工具是需要安装的, 咱稍微等一下,它这个启动起来是比较慢的,你看它在加载了,在编辑它安装完成以后,你可以看到一些 idea 啊,或者是嗯, notebook 啊,主 pad, 呃,主 pad, notebook, 你等这个软件启动起来以后,你就可以看到一些开发工具,你像正常使用的咱们 idea, 就 这个拍叉幕在这里也可以看得到,甚至是说有主拍特 notbook 也可以看到,还有这 vs code 也都是可以看到的啊,等会会带着大家演示一下, 咱们现在需要等待它启动这个终端,你看这些拍摄,咱们它会打开我们的拍叉幕,甚至是说一些其他的软件, 你看这个就是我们将来要使用的主拍特啊。嗯,建议大家跟我使用一样的工具啊,这个主拍特还是比较好用的。然后呢这个也是一个拍真的开发工具,它是一个 idea 就 拍叉。还有一个呢,就是相当于是呃 vs code, 就是 写一些 gs 代码,甚至写一些 pad 代码都可以用这个啊,你都可以点击 lock, 你 点击这个 lock, 它就会加载出来一个新的页面,它会给我们弹出来一个窗口,就是你本地的八八八八端口, 你看它会访问到一个这样的页面,如果你点击这个能来到这样的页面,就说明咱们这个主 pad 也安装成功了。稍后呢咱们就可以基于这个播主 pad 开发一些嗯矩阵的 代码了。好吧,那下节课咱们演示一下矩阵的具体的 int 呀,或者是操作呀,加法减法呀等等的一些操作,都会带着大家来演示。

警告,本视频耗时四百五十个小时,制作时长共一百六十二万秒,我将一口气将你从零开始学完,深度学习 peter 教学知识,全程无废话,快速学完所有重难点。由于时长太长,本视频先带你过完。 peter, 大家好,今天呢,我们继续给大家介绍零基础入门派套式。那在本节课呢,我们将给大家介绍在卷积神经网络中非常重要的一个模块,也就是干网络。并且呢,我们通过搭建干网络呢,来完成图像风格迁移的这样的一个任务。 在介绍具体的编程任务之前呢,我们同样呢,先给大家呢,简单的介绍一下关于干网络的一些相关理论技术基础。那什么是干呢?干网络呢?它实际上是属于生成式的对抗网络。 讲到生成式的对抗网络,我相信大家呢,可能会有一点点晕,那他到底是一个生成式的网络呢,还是一个对抗式的网络呢?实际上呢,在干网络中呢,它包含了两个模块,一个呢就是生成式的网络。 在生成式的网络中呢,我们通过一个网络结构来生成相应的数据,或者是说相应的样本。 而在对抗网络中呢,则是去判别这个样本到底是不是一个真实的样本,还是说它是一个假的样本。所以呢,在一个干的网络中呢,我们通常会包含两个模块,一个呢叫生成器,一个呢叫判别器。 其中生成器呢,主要完成的任务呢,就是生成尽可能的逼真的样本。 而判别器呢,它的作用呢,则是去判别生成器生成的这个样本到底是一个真实的样本还是一个假的样本,二者之间呢,进行相互的博弈,直到达到一个平衡,平衡状态就是各占百分之五十, 生成器生成的样本能够达到一个以假乱真的地步,那这个时候呢,我们去掉判别器,就可以利用生成器来生成我们想要生成的样本。 而干网络最终的目的呢,也是我们通过生成和对抗这样的两种相互博弈来完成对数据的生成,尽可能的生成真实的数据,达到以假乱真的这样的一个目的。 所以说呢,干网络呢,他的核心思想呢,其实是有一个二元博弈的这样一个概念,大家如果对博弈论有些了解的话,可能对干网络呢会有一个更深刻的认识。 那对于干网络的这样的一个生成式的对抗网络,那他的目标函数应该是什么样子呢? 其实呢,在干网络中呢,由于它包含了这样的两个模块,一个是判别器的模块, 而生成器的模块,他的目的呢,就是为了达到以假乱真的这样的一个目的。而判别器的一个模块,他的一个关键性的一点呢,就是在于区分到底是正样本还是一个假的样本。 所以呢,在干网络中呢,他的目标函数呢,包含两个,一个呢是针对于判别器而言的, 判别器呢,希望能够尽可能的去区分出这些假的样本, 那在判别器中呢,他会通过打分的这样的机制,我们可以把它理解成是一个打分的这样的机制,因为是一个二分类吗?如果打的分数越高,这个时候呢,我们认为他是一个真实样本的可能性呢就越高。 所以呢,在判别器中呢,他为了去区分这些假的样本,他就希望去对这些假的样本的打低分。 那在我们的这个优化函数中呢,我们对这些生成的样本呢,我们希望的是去打一分。 在优化函数中呢,我们取了一个反,也是加了一个符号,这个时候呢,我们就将这个最小化的这样的一个目标呢,改为了最大化。这也是为什么我们的优化函数中啊,对于判别器,这里是一个最大化 d 的 这样的一个方程。 那对于生成器而言呢,他希望我们生成的样本呢,尽可能的和真实的样本相似,尽可能的去接近生成的样本,它的分布尽可能的和真实的样本的分布是一致的。 所以呢,对于生成器呢,我们的目标函数呢,是最小化,两者之间的这个数据分布,希望生成的样本和真实的样本彼此之间呢,能够尽可能的相似。那提到两个样本之间的分布的相似性, 我们如何去评价两个样本的分布是相似的呢?实际上呢,在机器学习中,或者说在数学这个概念里啊,我们通过散度这个概念来描述分布的一致性。 我们期待生成样本和真实样本,他们之间的分布越相似,其实呢,就是去最小化这两个样本,它的分布,尽可能的去将它优化到尽可能的小。 那在干网络中呢,它的分布的这个描述呢,我们通常呢会采用 g s 散度来进行描述, 那 g s 散度呢,它实际上是 k l 散度的变种,在 k l 散度中呢,它存在一个非常大的缺陷,就是 k l 散度它本身是不对称的,不满足三角不等式。而 g s 散度呢,它解决了 k l 散度非对称的问题, 他的取值范围呢,在零到一之间。但是呢,对于 g l 散度而言呢,如果两个分布他们之间是没有重叠的,或者重叠非常少的时候,这个时候呢,两个分布之间的相似性通常呢是一个常数, 那为了进一步地去描述,即使两个分布彼此之间没有重叠,依然存在相似性的这样的一个性质。那这个时候呢,我们就采用了 vaseline 距离。 而 versus 距离呢,它描述了两个分布之间的距离,描述了从分布 a 转移到或者是说转换到分布 b 这个时候最优的一个策略, 这个 z u 的 策略所产生的这个代价就是这两个分布之间的 vaseline 距离。那 vaseline 距离呢,也是 w 干设计出来的一个基础,大家呢,感兴趣的话可以去了解一下关于 w 干的设计。 对于干网络而言呢,它包含了两个模块,一个呢叫生成器,一个叫判别器。那对于生成器而言呢,实际上呢,在机器学习领域呢,一直以来呢,都有关于生成式模型相关的研究。 所谓的生成式的模型呢,它主要是解决的问题呢,就是给定训练数据,然后呢,我们从这些相同的数据分布中生成一些新的样本呢,是满足这些数据分布的。 比较常见的一些方法呢,就是 pixel r, n, c, n n 这种方法呢,属于自回归的网络,这种网络呢,它是通过足像素,或者是说从图像的一些角点的角度呢,去生成相应的图片。 那除此之外呢,还有就是自动编码器,也就是所谓的这种编辑码的结构,先做下裁样,再做上裁样。这样的结构呢,其实都是自动编码器,通过编辑码呢,来对输入的数据呢进行重构, 而变分。自动编码器呢,就是 ve, 而 ve 呢,它是向自编码器中呢,加入随机的因子, 也就是我们先加入随机的噪风,然后呢,基于这样的一个模型呢,去对输入的数据呢进行重构。那目前呢,其实 ve 也是一个非常火的一个研究方向, 对于无监督学习而言,如何去从自己本身学到有用的信息,是一个非常值得研究的方向。也是呢,目前呢,在无监督领域呢,非常热门的一个方向。 那除此之外呢,就是我们今天给大家介绍的干网络,干网络呢,它属于生成,是对抗网络, 它包含了一个非常重要的生成器。那如何去指导生成器生成的数据变得更好呢?是通过判别器来进行调控, 生成器和判别器之间呢,达到彼此间的一个平衡之后,这个时候呢,我们能够利用生成器生成以假乱真的数据。那总结而言呢,对于生成式的模型呢,我们主要做的事情呢,就是希望生成一批数据, 这些生成数据,它们的分布和真实数据分布是一致的, 无论是自动编码器,变分自动编码器,还是干这样的网络,我们最终的目标呢,都是相同的。只是说呢,在达到这个目标的过程中呢,我们采用了不同的手段, 目前呢研究比较多的就是 ve 和干,大家感兴趣的话,可以重点的去了解一下这两个研究方向相关的一些最新的文献, 尤其是在二零二零年今年的这个 cpr 上非常多的关于无监督学习的相关的文章。接下来呢,我们给大家呢介绍一些常见的干网络。那对于干网络呢,从二零一四年到今天,其实已经有非常多的具有代表性的干网络被设计出来, 在课程中呢,由于课程的时间也有限,我们很难呢给大家呢对这些干网络呢进行一个非常全面和细致的这样的一个公式,所以呢,我会从其中挑选一些比较具有代表性的网络呢来给大家进行简单的介绍。 大家可以看到啊,在 ppt 中给大家画了一个关于干网络的眼镜图谱,这个眼镜图谱呢,主要是针对于二零一九年的干网络的一个眼镜图谱。 首先呢是二零一四年干网络被提出以后,然后分别从干网络 loss 的 角度和网络结构不同的角度呢来对模型呢进行了优化。 其中比较著名的一个网络就是 w 干,这个也是我们在刚才给大家介绍 g s 散度它的问题的时候提到的 last 距离, 那 vc 距离呢,属于 w 干网络的非常重要的一个理论基础。那除此之外呢,就是 dc 干, circle 干 to video pg 干, circles 干, style 干,第一个干等等啊这些非常具有代表性的网络结构。 首先呢,我们对这个干网络的原始的干网络呢,加入卷积神经网络结构,形成了 dc 干,然后呢,我们将单向的干网络变成多项的双向的这个干网络,这个时候呢,变成了 circle 干, 然后我们加入风格迁移的元素,变成了 style 干,基于文本嵌入,我们形成了 stack 干 和强化学习进行结合,生成了 sox 杆,还有基于大规模图像训练的方法生成这个 big 杆等等。啊,那这些网络都属于一些在干中啊,比较典型和一些经典的网络结构,那具体呢,我们来看一下。首先是 dc 杆, dc 干呢,它是在原始的这个干网络的基础上,因为原始的这个干网络在二零一四年被提出来的时候呢,干网络它的生成器和判别器呢,主要还是以多层感知器为主。而在 dc 干中呢, 则将卷积神经网络的结构引入到了干网络中,替换掉了其中的多层感知器。那在 dc 干中呢,去掉了在 cn 网络中的池化层, 并且呢将全链结层呢,以全链结层来替换掉,因为全链结层它的参数量是非常大的,它是一个非常稠密的连接,而采用全链就是 average。 这样的操作呢,它会去掉 c 层的这个参数量,而且呢能够加快计算速度。 另外呢,在 dc 干中呢,会加入 null, batch null, 另外呢,引入了 real 激活函数和 luke real 激活函数来对原始的这个 python h 这个激活函数呢,进行了局部的替代。 关于 dc 干网络它的生成器的这个模块呢,我们会看到其实就是一个非常经典的一个卷积神经网络。 那在这里的这个上彩样层呢,采用了 echo 反卷机方式呢,来进行了上彩样,这个是呢 dc 干网络它的一个整体的一个设计思路, dc 干网络呢,也是一个非常经典的干网络,除此之外呢,就是 pixel to pixel 也叫条件干网络, 那条件干网络它设计的一个初衷呢,是考虑到对于干网络在生成数据的时候,通常呢会损失掉,高频的信息 反映在图像上,就是我们采用原始的这种干网络来生成图像,我们拿到的图像大家会发现会有些模糊,也就是说对图像的细节信息,纹理信息,我们会经常损失掉。 这也是因为 g 网络在评估两个图像它的之间的相似性的时候呢,会采用 l one 或 l two 这样的欧式距离来进行 loss 的 计算。而在条件干中呢,它引入了 unite 网络, 将编码器中的特征呢往解码器中呢进行了传递,并且呢通过对比不同的 loss 呢,在 pixel to pixel 这个网络呢,采用了 l one loss, l y loss 呢,相比于 l two loss 而言呢,它能够比较好的去保留这些细节的信息,纹理这些高频的信息。另外呢,为了进一步的强调这些高频的信息呢, 在判别器中呢, to pixel 中呢,引入了马可夫判别的这样的一个机制,通过 pass 干来定义判别器的损失。那这里什么是 pass 干呢?实际上就是在 pixel to pixel 这个网络中呢,作者呢引入了局部的图像的这样一个概念, 所谓的这个局部的图像呢,实际上就是我们可以理解成大家在使用卷积对图像进行卷积计算的时候,每一个卷积盒其实都是对应到图像的一个局部区域。而在 pixel 图 pixel 中呢,这里的 pass 杆其实就是对应到这样一个卷积盒的这样一个大小的窗口, 这样的每一个卷积盒的窗口都对应到了原始图像中的一个局部区域,对这个局部区域我们分别进行判别分析, 那这个时候呢,再对这些小的局部区域呢进行 loss 的 一个平均,最后呢来作为判别器的 loss, 这个呢就是 pixel to pixel 条件干设计的一种思路, 通过 pass 干呢来捕捉弥补高频信息的损失,使得呢我们生成的图像质量呢,纹理信息变得更突出,效果呢变得更好。 那在介绍完 pixel to pixel 这样的一个条件干网络之后呢,我们再来看另一种非常常见的干网络,就是 circle 干, circle 干呢也是一个非常典型的干网络, 那 circle 干网络它的一个最大的改进点呢,相比于原始的干呢,就是将一个单向的干网络呢, 修改为了一个环形的网络结构,通过两个干,两个生成器和两个判别器来完成数据的生成, 构成呢一个环形的网络,那具体啊,这个网络结构,我们在 ppt 中呢给大家展示了这样的一个例子, 那所谓这个环形的结构呢,就是对于 circle 杆呢,它的输入是 x 和 y 这样的样本对,那这些样本对呢,我们在 ppt 中也给大家提供了这样的样本对,我们可以看到哎,这里呢就是所谓的这个样本对, 那 sql 干网络呢,它要做的事情呢,就是通过两个干,这两个干分别完成的事呢,就是我能够去完成从 x 到 y 的 生成,同时呢可以完成呢从 y 到 x 的 生成, 将这两个单向的干网络呢,我们拼接到一起,形成了最终的这个环形的结构,也就是所谓的这个 circle 干,我们将这两个单向的干拆开,哎,就是在 ppt 中给大家列出的这两个拆开之后的结构, 那这两个拆开之后的结构呢,就分别对应到了 circle 干中的两个单向的干,然后我们将这里的这个 x 和 y 串起来之后生成这个 circle 干, 那对于 circle 干呢,它的 loss 呢,其实就是所谓的这个 circle 一 致性的这个 loss, 那 在这里呢,我们通过 x 和 y 构造出的这个 x 撇和原始的这个 x 来计算一组 loss, 然后呢利用同样 x 和 y 生成的这个 y 撇和原始的这个 y 来作为一个一致性的约束的 boss, 通过这两个 boss 呢来对我们的网络呢进行优化, 最终呢实现一个风格迁移的这样的一个目的。所以呢,实际上在 circle 干中呢,我们可以去完成对图像数据的一个风格的迁移, 那除了 circle 干以外呢,再有就是 style 干,那 style 干中呢,相比于原始的干网络呢, 又进行了一个比较大的提升,就是在 style 干中呢,我们在生成数据的时候呢,采用渐近式的生成的这种方式,先生成小的尺寸四乘以四, 然后呢再生成八乘以八这样的大尺寸,然后再逐步的往上做上彩样,生成最终的这个我们想要生成的这个数据,那 style 干呢,它实际上是基于 pro 干哎改进的一种网络结构。 在 pro 干中呢,首先提出了这种渐进式的生成图像的这种思想,然后在 style 干中呢,进一步的进行了一个拓展,首先呢,在 style 干中的哎生成期的部分,移除掉了原始的这个传统,这种输入 也就是我们这里的这个圈一的部分,那取而代之的呢,是加入了一个样式模块, 在样式模块中呢,引入了风格迁移这种网络,它的核心的这种思想,将 style 风格,我们拿到这种风格的这种特征, 再结合 noise 噪声,加入这种随机的噪声呢来为生成器呢,随机的生成这种细节信息。那除此之外呢,在 style 干中呢,加入了一个映设网络,也就是这里的这个圈二, 我们可以看到通过映射网络呢,我们将这个 z 映射到了这个 w, 然后再由 w 呢分发出这四个 a 四种 style 和四个 b 四个 noise 来进行结合, 进而呢产生一些细节性的信息。那 style 干中呢,在面部生成任务中,能够非常生动地生成人脸上的这种细节信息, 哎,比如说一些头发等等啊,这些非常细致的这些造成信息,使得呢 style 呢,在面部生成任务中呢,取得一个非常好的成绩。 那除此之外呢,就是 big 杆, big 杆呢,也是在一九年非常热的一个网络,那 big 杆呢,它的一个最大的特点就是网络很大,非常大, 在 big 干中呢,它验证了几件事,第一个呢,就是加大 size, 对 干网络的训练有非常大的影响,能够非常好地提升模型的性能。另外呢,就是增加网络的宽度,比增加网络的深度更有用。 再有呢,引入了一些截断的技巧和正交正则化的一些方法,那所谓的这个正交正则化就是参数矩阵,达到一个正交的这样的一个目的。另外呢,在 b 干中呢,对网络的不确定性进行了分析,那 b 干他的典型的网络结构呢?我们在 ppt 中也给大家列出来了, 其中 a 属于 big 干,在生成器的模块中非常关键的一个结构,我们可以看到啊,这里呢,其实包含了非常多的 resident 的 这个 block 的 模块, 而在判别器中呢,同样呢,也是以 resident 这种结构为主。那 big 干呢,相比较其他的干网络而言呢,最大的特点就是大, 一般呢,我们采用八块 gpu, 也需要训练非常久的时间,才能达到一个比较好的一个熟练效果。所以呢,我们一般的情况下,我们其实是没有办法训练必须干这个模型的,除非我们在大厂有一些非常大的计算资源。 所以呢,关于逼干呢,大家可能简单的了解一下就可以了。那关于干网络的一些典型的网络结构呢,我们就给大家介绍这么多。最后呢,我们再来总结一下关于干网络的一些优缺点。首先呢,就是优点,对于干网络呢,它属于生成式的模型, 生成式的模型,它的最大的好处呢,就是我们可以用它来解决非常多的从图到图的任务, 也就是因为指图,因为指这样的任务。相比于干网络之前的这些生成式的模型而言呢,干网络呢,它只用到了反向传播,不需要用到四大的马克弗林, 它的结构更加的简洁,效果呢也更加的好。那相比其他的模型而言呢,它可以产生更加清晰,更加真实的样本。而且呢,干网络呢,它属于无监督的学习方式, 尤其是在近几年,无监督和半监督的相关研究呢,现在呢,非常热门,而且相关的研究有着非常大的挑战性,所以呢,大家感兴趣的话,可以去对这两个领域呢进行进一步的深入的研究和探讨。 那相比于 ve, 就是 变分自动编码器而言呢,干网络呢,它是渐近一致的,在很多生成式的任务上呢,相比于变分自动编码器而言呢,它的效果会更好。 当然呢,在今天啊,这个关于变分自动编码器的相关的研究现在也非常多,如何从模型自己学到自己更多的有用的信息,是一个非常值得研究和深入探讨的问题。 那目前呢,干网络呢,在很多应用场景上已经有了一个非常大的应用,比如说在图像风格迁移,超分辨率像补全去造等等啊,这些问题上,我们通过干网络可以去减少损失函数的设计的这样的一个成本, 我们采用干网络相关的这些函数函数,针对于这些从图到图的任务,我们可以直接搬过来用,非常简单。 那干网络呢,有非常多的优点,同样呢,它也存在一些缺点,比如说呢,我们在训练干网络的时候,到底什么时候是一个比较好的状态?实际上是判别器和生成器各占百分之五十的时候, 判别器很难去判断样本的真实性,那这个时候呢,生成器也很难去生成一个样本,使得判别器去误判,这个时候呢,彼此达到一个平衡态, 干网络呢,在这种状态下呢,才能够收敛到一个比较好的状态,但是呢这种状态其实还是比较难达到的状态。 另外呢,干网络呢,他不适合处理一些离散形式的数据,比如说文本数据,我们主要呢还是在图像数据和一些语音数据中呢,来进行干网络的一个搭建。另外呢就是干网络在训练的时候,会出现不稳定,梯度消失, 模式崩塌等等这样的问题。当然呢,在今天啊,干网络有非常多的最新的研究进展,在这些训练稳定性,梯度消失等等这些问题上,其实已经有了非常大的改善。那对于干网络呢,我们通常是如何进行训练的? 那干网络的训练呢,其实一般是包含这样的两个步骤啊,就是我们固定判别器,然后再去训练判别器, 通过这种方式呢,交叠的去训练这个干网络,一般在训练的时候呢,会采用这种策略,那在搭建干网络的时候呢,我们有一些小的技巧也可以介绍给大家一个呢,就是在数据上呢,我们通常会把它规划到负一到一之间去。 另外呢就是我们尽量使用 westin 干,也就是 w 干的损失函数去替换掉这个 gs 函数。 另外呢就是我们在标签数据上呢,如果有标签我们尽量选择呢使用标签或者是说呢对标签进行一些平滑这样的一些处理,在训练干网络的时候呢,可以加入 mini batch, nom 这样的策略。 对于激活函数的选择呢,我们尽量避免使用 reil 和 pooling 层,减少呢 linkey 这样的激活函数 优化器呢,我们尽量选择 adam, 学习率呢,一般以十的四次方,哎,基本上都会从这个学习率开始设置,然后呢在训练的过程中呢,再去对学习率呢进行不断的缩减, 同时呢,我们在判别网络中呢,可以加入高速造成,相当于是对网络呢进行政策,增加这个数据的复杂度,网络的复杂度 使得网络呢增加这个数据的复杂度,使得网络呢能够具有更好的一个鲁棒性,尽可能的去避免过泥河。 那目前呢,关于干网络呢,它的应用场景也非常多啊,其实在之前的 ppt 中,我们也给大家简单的提到过,那目前呢,比较典型的应用就是图像数据的生成,比如说我们去生成非常多的人脸的数据,去用来训练一些其他的模型,这个时候呢,我们 可以采用干网络去生成这些数据,除此之外呢,还有就是超分辨率重构,音乐生成,图像转换,图像翻译, 我们还有就是图像合成,场景合成,人脸合成,文本到图像的合成,风格迁移,图像域的迁移,图像修复 mask, 干去雾,去雨水,年龄仿真等等。 那在 ppt 中呢,我们可以看到这些简单的这些使用的一些例子,比如说风格的迁移,哎,人脸的生成等等。干网络呢,目前在从图到图的任务中使用的是非常广泛的, 而且呢已经取得了非常多的有效的成果。那我们在本章节中呢,主要呢给大家介绍关于 python 如何去解决风格迁移的问题,并且呢通过编程室例呢来教大家呢去搭建干网络来完成图像风格迁移的这样的一个实验,这样的一个实战任务, 那关于干网络的基本理论呢?我们先给大家介绍这么多,接下来呢我们来看一下如何使用 python 解决图像风格迁移的问题。 喂,大家好,那今天呢我们继续给大家介绍呢,使用 python 来搭建干网络解决呢图像风格迁移问题。这里呢我们主要给大家呢搭建 circle 干, 那在搭建具体的 circle 干网络之前呢,我们首先呢对数据来进行下载,在这里呢我们给大家提供了数据下载的脚本, 那脚本呢,我已经给大家提供好了,这里呢大家呢实际上我们在下载这个数据上,从这个 url 里来进行数据的下载,那大家呢可以直接在浏览器中呢输入这个地址,我们可以看到啊,这里有思考干所用到的这些相关的数据集, 我们的点击在新链接中打开,这个时候呢就可以对数据进行下载,或者呢我们直接去单机这个对应的数据集就能够拿到我们训练所需要的数据集,这里呢包含了多个风格迁移之间的数据集。 这里呢我们使用 apple 到 orange, 就是 从苹果到橘子这样的两种风格迁移的数据的,来训练我们的这个风格迁移的模型,那另外几种呢?大家感兴趣的可以去自己去尝试去训练相关的模型。 除此之外呢,大家呢也可以使用我提供的这个脚本来进行数据的下载,那我们在使用这个脚本进行下载的时候呢,只需要在这个命令后面呢加入我们想要下载这个数据局对应的这个名字就可以,那可以看到啊,这里呢我们加入 apple to orange, 这个时候呢也进行了这个数据的下载, 对于这多个数据集呢,大家呢分别去设置对应的名字,就可以去下载相应的数据集,那在下载好数据之后呢,我们可以来看一下,在这里呢有给大家下载好的数据, 这里呢我们以 apple to orange 为例呢来给大家呢搭建这个风格迁移的模型,这里呢包含了训练级和测试级,那训练级呢其中包含了 a 和 b 两个文件夹,在 a 的 文件夹下面呢是苹果,在 b 的 文件夹下面呢是橘子。 那 text 文件夹呢同样也是在 a 文件夹下面呢是橘子。 那接下来呢我们来首先呢搭建数据处理的脚本,那首先呢我们来看如何去定义我们自己的 data set, 这里呢我们首先导入呢 global, 这个呢主要用来去读取文件夹下的文件的列表。然后呢我们导入 random, random 呢主要是对我们的数据呢进行 java。 然后呢就是我们导入 touch 下面的 utilities 点 data, 在 这个下面呢导入 deset, deset 呢是我们自定义数据的时候需要继承的赋类。 然后呢我们导入 pl 下面的 image, 这个呢主要用来对图像呢进行图像处理的操作。 然后就是 torchvision 下面的 transform, 这个呢主要用来对数据呢进行数据增强的处理, 我们定义成 t r f。 那 在接下来呢我们定义自己的这个数据处理的类,定义成 image descent, 这里呢继承 deset。 我 们需要定义三个方法,首先呢是抽象的方法,在抽象方法中呢,我们首先会传入数据的根目录,以及呢 数据增强 transform, 这里呢我们将它定义成 n。 然后呢就是我们的 model, model 呢,主要是用来定义我们当前是训练状态还是测试状态。 接下来呢,我们在编辑函数中呢,来定义我们需要用到的一些变量。首先呢我们定义 transform, 这里呢我们采用 t r 点 transform, 点下面的 compose 对 我们传入的这个 transformer 呢来进行一个合并。接下来呢,我们来定义 is a, 这个呢主要是我们训练级中的 a 的 数据路径的列表,这里我们采用 global 来读取数据,那这里呢我们需要传入数据的 path 路径, 那 pass a 等于什么呢?等于我们用 o s, 这里我们导入 o s, 我 们用 o s 来对数据路径呢进行拼接, 这里我们首先呢拼接 root, root 是 我们数据的存方的根目录。然后就是 modding, modding 呢,主要是用来对应到 tree 和 test 两个文件夹。然后呢就是我们的匹配符星 a 星, a 星呢,对应到 a 文件夹对应的这个文件的列表,这里呢我们同时把 b 定义出来,这里呢就是对应到 b, 那 list a 呢,我们传入 a 的 路径, list b 呢我们传入 b 的 路径。 那有了 a b 以后呢,接下来呢,我们来定义第二个函数 get item, 通过 get item 呢,我们会读取对应的数据,这里我们将这个改成 index。 首先呢我们需要拿到的呢是图片 a 的 路径, a 的 路径呢,我们根据 index 呢 直接从这个 list a 里边拿到,我们用 index 对 list a 的 lars 呢来取于, 那接下来呢,我们来定义 b 的 路径, b 的 路径呢,我们直接从 b 中呢来进行随机获取。所以呢,我们这里直接采用 random 点 choose the choice, 然后选择这个 b 中的一张图片。这里呢我们定义成 image pass b。 接下来呢,我们将 a 和 b 呢采用这个 image 下面的 open 来对数据呢进行读取, 这个呢是 e a, 这里呢是 in b。 有 了 a b 之后呢,我们再来对 a b 呢进行数据域处理, 调用 transform 传入 in a, 同样这里传入硬币。那最后呢,我们再来将这个预处理之后的这两个数据呢返回。 最后呢,我们再来定义 learn 方法,在 learn 方法中呢,我们取 a 和 b 的 列表中的最大值来作为数据级的长度, 那这样的话呢,我们就自定义好了自己的数据集。接下来呢,我们通过一个问方法呢来对我们自定义的这个数据集呢来进行测试。 这里呢我们首先呢导入,在 touch utilities 下面呢有一个 data, 我 们导入呢 data load, data load 呢主要用来对数据来进行加载, 那我们定义数据的根目录呢为这里的这个 data set 对 应的 apple, 我 们将这个路径呢定义好。 接下来呢我们定义 transform, 这里我们定义一个我们定义 resize 方法, 将图片呢 resize 到二五六,这里我们采用百里眼来作为 resize 的 插值的方法。接下来呢,我们定义 data loader, 这个呢就是我们调用的这个 data loader, 应该是 data loader 大 写的。 然后呢这里呢,我们对这个 datload 呢来进行抽象,传入我们的 image data, 在 image data 中呢我们传入对应的这个参数,一个呢就是 root, 再有呢就是 transform 以及呢 model 呢,我们这里选 tree, 接下来呢我们定义 batch size, 这里呢我们定义 batch size 呢为一 shove 呢我们定义成 choose, 最后呢就是 number works, 我 们定义成一, 接下来呢我们对 dataload 中的数据呢进行便利, 这里我们传入 dataload 打印的对应的数据, 我们执行当前的脚本,那这里报了一个错,其实我们可以看到这里主要还是一个 type error, 那 batch must 必须是一个 tensor, 也就是说我们的 batch 必须返回是一个 tensor, 我 们来看一下这个代码啊,那其实呢就是在这个 transform 这里,在这里呢需要再加一句,就是将我们输入的这个数据啊转化成这个 tensor, 那我们再来重新执行当前这个脚本,那大家可以看到这个时候呢,我们就可以通过 delete load 呢来读取到当前的数据,那接下来呢,我们利用这个数据呢来进行模型的训练, 那在定义好对数据的处理的方法之后呢,接下来呢我们来看模型结构, 那在干或者说在 circle 干,我们今天要实现的这个网络结构中呢,我们需要定义生成器和判变器两个结构, 我们的主干网络的部分呢,采用 resident 的 模块呢来进行搭建,所以呢我们首先呢定义 resident 它的一个核心的模块,这个呢我们在之前的课程呢也给大家定义一个结构,我们首先呢导入所需要的这些包啊, 首先呢我们定义 restit 的 这个核心的模块叫 restblock, 那 restblock 呢,其实它也是一个小型的这个网络,所以呢,我们需要继承 n 的 model。 这里呢,我们首先定义 int 函数,也就抽象函数,我们采用 super 呢来完成对抽象函数的抽象化。 接下来呢,我们定义我们的 restart 的 核心的单元 block, 哎呀,我们定义一个 com block, 在 com block 中呢,我们完成 哎对应的这个对应的这个运算。这里呢,我们由于啊干网络呢,我们这里是采用这种生成 式或者是判别式称生成式网络结构,所以呢,我们对数据的大小,对输入的非常大小比较敏感。所以呢这里呢,我们采用 pad 的 方式呢来避免经过卷积之后图像这个尺寸上的一个损失。所以呢,我们首先呢 采用一个 n n 点 pad 的 方法来对图像呢进行一个填充。这里呢我们选择这个 reflect pad 二 d, 我 们第一个卷积呢,采用三乘以三的卷积,所以呢我们 pad 一, 然后哎传入 com 二 d。 在 这里呢,我们需要定义 in channel and out channel 呢,我们这里呢 和 in channel 保持同一个 channel。 然后呢我们传入这个卷积核的大小,卷积核呢,我们这里采用三乘三的卷积核,那我们将这个 in channel 呢来作为输入。 接下来呢,我们使用 bash null, 这里呢,我们调用 instance bash null, 在 干网络中呢,我们使用 instance bash null 的 情况呢,会比直接使用 bash null 效果会好一点。 这里呢,我们同样是哎 in channel 它的大小。然后呢,接下来呢,我们调用一个 relic 层,在 relic 层中呢,我们定义这个 replace 啊,定义成 choose。 接下来呢,我们将这个结构来拷贝一份,去掉最后一个 relo, 这样的话我们就搭建好了这个第一个这个卷积的这个核心的模块。然后呢,我们定义 com block, 这里呢,我们通过 n n 点 space 来将这些算子呢进行一个串联。接下来呢,我们定义一个 for 的 函数,在 for 的 方法中呢, 来完成跳联的这个结构,哎,传入 x, 直接返回 return x, 加上 self 点 com block, 这里呢传入 x, 那 这样的话呢,我们就定义好了一个 resident 的 一个,哎,基本的一个单元。 接下来呢,我们分别定义生成器和判别器,我们先定义生成器, 那生成器呢,是一个编辑码的结构,我们先进行下裁样,再进行上裁样,生成器呢,同样也是一个网络,所以呢我们需要继承 n module。 然后呢,我们定义引机函数来完成抽象,在抽象方法中呢,我们采用 super 来完成抽象。 接下来呢,我们定义这个网络的一个核心的一些结构单元。首先呢,我们定义一个 利用我们的网络在网络的输入的第一个节点,大家一定要注意,通常呢基本上就是使用一个标准的卷积来做,这里呢,我们采用一个大卷积盒的卷积啊,一般在进行,如果大家对计算量 没有什么特殊要求的话,在第一个卷积层一般都会采用七十七的卷积盒,大家可以去看一下关于因为。 net 相关的网络的时候,基本上都会采用一个大卷积盒, 这里呢,我们采用七乘以七的卷积核,所以呢,我们将 pad 呢改成三,输入呢就是我们的原始图片,这里我们定义成三,输出呢,这里呢我们定义成六十四, 哎,然后呢就是卷积核,我们定义成七,由于输出是六十四,所以这里呢我们需要定义成六十四啊,那第一个呢,我们定义是 rolo 啊,这这样的话,我们就定义好了第一个卷积的一个单元, 接下来呢,我们对数据呢来进行下裁样,定义下裁样的模块, 这里呢我们直接写一个循环啊,下裁样呢,我们定义成两个模块,进行四倍下裁样,我们还是定义。 net 加上后面的这几个序列, 这里呢,我们分别调用 come, instance 和 realm。 这里呢我们卷积格呢定义成三,我们定义呢 stride 等于二, pad 等于一。 另外呢,我们每次经过一次加载项之后呢,我们将这个 channel 的 数量呢进行加倍,所以呢,我们哎定义输入和输出的 channel, 哎,这里呢就是我们输入的 channel, 我 们进行一个修改输出的 channel, 所以 这里呢我们改成 alt channel。 每次循环经过一次之后,我们修改这个 in channel 等于 out channel, 而 out channel 呢,我们继续等于 in channel 乘上二。 再接下来呢,我们定义 rest block, 这里我们同样通过一个复循环来定义啊, 哎,这里我们定义九个 rest block, 这些呢,大家都可以作为哎网络的一个可调的参数,作为一个入参,我们定义。 net 加,等于,这里我们调用这个 rest block 传入呢 in channel。 在 定义完下彩样的模块之后呢,我们接下来呢定义上彩样模块,上彩样呢,我们采用反卷机的方式来实现, 我们定义 alt channel 呢,等于 in channel 除以二,刚好和下太阳的这个网络呢,反过来,我们定义一个 for 循环, 同样呢,循环的这个次数呢为二,要用。 net 加等于这个模块。首先呢,我们加入一个反卷级的模块 come 来 transpose 二 d in channel, 然后传入 out channel, 传入三 thread 呢 等于二, pad 呢等于一 out put pad 呢等于一,保证呢,我们图像呢,进行整数倍的一个上太阳。 同时呢,我们,哎,一定要记得这里也需要修改 in channel, in channel 呢等于 out channel, 而 out channel 呢等于 in channel 除以二。 那对于反转基层呢,我们同样这里呢,需要加入 batchnum 层,所以呢,这里呢,我们加入 instance batchnum 来定义输出 channel 以及呢 redo。 同样呢,我们定义 inplace 等于 tos。 那接下来呢,我们定义最后一个输出层,这里我们采用一个七乘以七的卷积盒,所以呢, 我们对特征图呢进行 pad 三的操作, 卷积盒的大小呢为七乘二七。那最后一层的激活函数呢,我们采用 type h, 那最后一层的计算函数呢,我们采用 type h, 那 这里呢输出的 channel 的 数量呢为三。接下来呢,我们定义我们的 model, 将整个网络呢进行串联,这里呢,将这个 model 呢定义出来,我们需要对我们定义好的这些算子呢来进行一个串联。 这样的话呢,我们就拿到了我们的 module, 接下来呢,我们利用这个 module 呢来完成 forward, 也就是前向运算传入 x return self 点 model x。 那 这样的话呢,我们就定义好了生成器,我们一会呢再对我们的这个结构呢进行一个验证啊,看看是不是有 bug, 有 bug 的 话我们再进行一些修改。那接下来呢,我们来定义这个判别器, 同样呢我们定义这个 n n 点 mod。 首先呢定义引机函数,这里呢我们采用 super 来进行抽象, 在判别器中呢,我们主要呢进行呢卷积的计算,所以呢我们这里呢首先来定义我们的网络结构,网络结构比较简单啊,就是一些简单的瞎采样, 我们定义 model n n 点 volution 二 d, 这里呢我们传入输入是三,输出呢我们定义成六十四。卷积核呢,我们第一个卷积核呢,我们同样定义的比较大一点啊,我们定义一个四乘四的卷积核。 然后呢我们定义 strad 等于二, pad 等于一。接下来呢我们再来定义一个激活函数 n n 点 l k r o, 这里呢我们传入零点二,它的参数是零点二,然后 in place 呢定义成 choose。 接下来呢我们定义四个哎相同的结构, 这里呢我们将输入和输出来修改一下,每经过一次下太阳之后呢,我们这里呢就将 channel 呢进行一次翻倍。 那在后面的这三个模块中啊,我们加入这个 batch nom, 我 们这里呢同样也是采用 instance batch nom, 这里呢定义成幺二八,下面呢是二五六,再下面呢是五幺二, 我们将这里呢改成加,将它们放入到一个列表中。 最后呢我们再将这个输出呢定设到一维这一个 tensor 上去,这也是我们最终的一个模型的一个输出的一个结果。 输入呢是五幺二,输出是一一呢就是指 channel 是 一卷积核,我们还采用四乘以四卷积核啊判定,这里是改成 e, 我们定义 mod, 在 mod 中呢,我们同样将这些算子呢进行串联。 最后呢我们再来定义 for 函数,大家要注意啊,这里我们虽然经过了这个四倍的一个下底样,但是我们的特征图的大小它还不是一乘一的大小,所以呢,我们需要通过一个 average point 呢将特征图的部分去掉, 这个呢我们在赋值函数中完成, 我们 return 一个 f 点 average 负零二 d 传入呢 x 和 x 的 size size 呢,我们取二冒号。然后呢将这个结果呢转化成 batchsize 乘上 n, 我 们通过 view 呢来实现。我们取 batchsize 这个维度。 这里呢传入负一。这里呢我们利用哎定义好的这个 model 呢来对 x 呢做卷积的这个计算。那在经过卷积计算之后呢,提取出来特征特征之后呢,我们再通过一个 average pool 呢, 我们拿到这个特征图呢,将它的 w 和 h 维度处理为一乘以上一。最后我们再通过一个 view 呢,直接将我们这个输出的这个数据呢转化成一乘上一,或者说 n 乘上一, byte size 乘上一的这样的一个维度, 那这个一呢,就对应到我们的判别器的预测的结果。那在定义好生成器和判别器之后呢,这里呢我们定一个问方法呢来对我们的模型呢进行测试啊,首先呢我们哎定义这个生成器, 然后呢我们再来定义一个判别器,定义这两个类。然后呢我们定义一个 tensor, 我 们将它定义成 input tensor, 将它呢来进行抽象,抽象的时候呢,我们可能需要再导入这个 touch, 我 们定义一个纯一的一个 tensor, 这里呢,我们定义它的 size 是 一三二五六二五六,然后数据类型呢是 float 型。 接下来呢,我们利用这个生成器呢来对 input tensor 呢进行前向推律,拿到输出结果,我们打印输出结果的 shape, 打印它的 size。 接下来呢,我们再来定义一个 判别器,利用这个判别器呢来对我们输入的这个吞字呢进行前向推力,同样呢我们打印他的 size, 那 我们来执行一下当前这个脚本,我们可以看到啊,对于生成器,我们输出的结果呢,和我们输入的这个吞字大小是相同的,而判别器呢,最终输出则是一, 因为我们的这里的 batch size 是 一啊,所以输出是一乘上一的一的一个参数。那接下来呢,我们利用这个生成器和判别器呢来搭建我们的 circle 杆的网络结构。