diff --git a/1.杭电生存指南/1.2竞赛指北.md b/1.杭电生存指南/1.2竞赛指北.md index 350d881..65ed499 100644 --- a/1.杭电生存指南/1.2竞赛指北.md +++ b/1.杭电生存指南/1.2竞赛指北.md @@ -123,4 +123,4 @@ CTF还有的缺点也是目前热门领域的通病:发展速度过快,后 由于笔者是创意组的,对其他组别不是很了解,就来介绍一下我们组别的情况。我们组别全称是智能车百度创意组,是由百度与鲸鱼机器人赞助的一个比较新的组别(目前是第三年,不过也开始卷起来了),该组别与传统组别的一个比较大的不同是对于硬件方面的要求并不高(但也是需要了解的,像 arduino ,stm32 这些稍微都得玩的起来),侧重会偏向软件算法方向。百度创意组总体分为两个阶段,线上赛和线下赛,线上赛的任务有点像是 kaggle 打榜,不过是百度官方命题,并且在飞浆平台上进行测试的,本质考验的就是你对神经网络的理解和调参(炼丹),如下图所示 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnQe2AYHX93NUz6Sfoq3hUPd.png) +![](https://cdn.xyxsw.site/boxcnQe2AYHX93NUz6Sfoq3hUPd.png) diff --git a/1.杭电生存指南/1.4小心项目陷阱.md b/1.杭电生存指南/1.4小心项目陷阱.md index 3eee61b..c2c449e 100644 --- a/1.杭电生存指南/1.4小心项目陷阱.md +++ b/1.杭电生存指南/1.4小心项目陷阱.md @@ -1,6 +1,6 @@ # 小心项目陷阱 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPmQ725zYTxiyo2LqQkphib.png) +![](https://cdn.xyxsw.site/boxcnPmQ725zYTxiyo2LqQkphib.png) ## 辨别项目质量 @@ -52,7 +52,7 @@ 但是大家参与之前你一定要想你的能力是否等于这个项目的量级,一般情况下,要么你技术特别强,要么可能会存在一定的问题。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPSolGcUy1R0Dk2FUhPaLLc.png) +![](https://cdn.xyxsw.site/boxcnPSolGcUy1R0Dk2FUhPaLLc.png) 所以说,还是那句话,小心甄别。 diff --git a/1.杭电生存指南/1.7杭电出国自救指南.md b/1.杭电生存指南/1.7杭电出国自救指南.md index c4ecbcc..c3cdb6e 100644 --- a/1.杭电生存指南/1.7杭电出国自救指南.md +++ b/1.杭电生存指南/1.7杭电出国自救指南.md @@ -6,13 +6,13 @@ ## 序言:一组数据看出国 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndFjrKQMhZJsH1vN1fEfaQb.png) +![](https://cdn.xyxsw.site/boxcndFjrKQMhZJsH1vN1fEfaQb.png) 点开图片可以看到左边是西交利物浦的出国数据,中间是杭电的数据,右边是成都电子科技大学的数据,可以看出西交利物浦每年去名校的数量大概是杭电一年的 20-40 倍,成电是杭电的一年的 10 倍左右,杭电出国数据实际上只有寥寥几个名校,剩下的则是一些英国院校。 这其中原因除了杭电高性价比的就业环境,双非院校选择出国深造的人数较低,我认为比较还有一点则是信息差。优秀的大学都有他们自己的飞跃手册,其中会介绍每个国家的优劣,以及申请的一些注意事项,详见下图。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnKMzGr9LSrXWmKxa1lSM1zJ.png) +![](https://cdn.xyxsw.site/boxcnKMzGr9LSrXWmKxa1lSM1zJ.png) 优越的校友资源和前人留下的数据和方案,加下信息差的叠加,就像符合幂律分布的无标度网络一样,只会让我们的差距越来越大,在感叹其他学校飞跃手册的优越性的同时也发现了一些不可参考性,因为在其中也存在着很多问题,在这些学校中,可能名校读博就是老师写个推荐信就有了面试的机会,可能去港大 / G5 就是大学四年均分 80 分的难度。有很多资料在不同的角度,我们很难参考,所以我不经会想问?那我们呢,我们考多少多少分能够去什么学校,我们想要直博应该怎么准备,所以我打算完成这份出国留学的手册,能够为学弟学妹们铺路,同样希望后面也能够有学弟学妹做完善和补充。 diff --git a/2.高效学习/2.1.2浮躁的心理状态.md b/2.高效学习/2.1.2浮躁的心理状态.md index d31221e..57d8489 100644 --- a/2.高效学习/2.1.2浮躁的心理状态.md +++ b/2.高效学习/2.1.2浮躁的心理状态.md @@ -32,4 +32,4 @@ 如果实在不行,来找 ZZM 聊聊吧。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPDWiNgkgppK1XWq5cRQ71b.jpg) +![](https://cdn.xyxsw.site/boxcnPDWiNgkgppK1XWq5cRQ71b.jpg) diff --git a/2.高效学习/2.1.3错误的提问姿态.md b/2.高效学习/2.1.3错误的提问姿态.md index c7ea21d..af709df 100644 --- a/2.高效学习/2.1.3错误的提问姿态.md +++ b/2.高效学习/2.1.3错误的提问姿态.md @@ -28,7 +28,7 @@ 问题还是没有解决,现在我该怎么做? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhuhE7qBLHyJKaesHGC033b.png) +![](https://cdn.xyxsw.site/boxcnhuhE7qBLHyJKaesHGC033b.png) 欢迎大家阅读 diff --git a/2.高效学习/2.1.4书籍的盲目崇拜.md b/2.高效学习/2.1.4书籍的盲目崇拜.md index 72137aa..5bc2cb0 100644 --- a/2.高效学习/2.1.4书籍的盲目崇拜.md +++ b/2.高效学习/2.1.4书籍的盲目崇拜.md @@ -6,7 +6,7 @@ "我们要学 C 语言,我买一本大黑书看看!" -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnqsCWmUTDr5UDLYca9YkhHh.png) +![](https://cdn.xyxsw.site/boxcnqsCWmUTDr5UDLYca9YkhHh.png) 诚然,上面的各种书写的非常好,但是我们需要思考的是,阅读这些真的能达到我们想要的目标吗??? diff --git a/2.高效学习/2.1.5错误的学习配比.md b/2.高效学习/2.1.5错误的学习配比.md index 06ea6a0..982c674 100644 --- a/2.高效学习/2.1.5错误的学习配比.md +++ b/2.高效学习/2.1.5错误的学习配比.md @@ -18,4 +18,4 @@ 在你完成这份讲义的时候,希望你可以有选择的阅览一部分,然后带着问题去看某些课,效率也会高很多。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnSq1JzWhVrFs3MePPzp5Txg.jpg) +![](https://cdn.xyxsw.site/boxcnSq1JzWhVrFs3MePPzp5Txg.jpg) diff --git a/2.高效学习/2.1高效的前提:摆脱高中思维.md b/2.高效学习/2.1高效的前提:摆脱高中思维.md index 985b6a4..1f44f83 100644 --- a/2.高效学习/2.1高效的前提:摆脱高中思维.md +++ b/2.高效学习/2.1高效的前提:摆脱高中思维.md @@ -14,7 +14,7 @@ **并且,全部依赖他人给你指明方向的人生已经结束了!** -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcne9EK3xz8LHOXfM8w9ih5Ig.png) +![](https://cdn.xyxsw.site/boxcne9EK3xz8LHOXfM8w9ih5Ig.png) 你无法依赖大学里的老师还是家里的父母来为你指明所谓的方向,你的人生只属于你自己,你的道路也只能由你自己来思考。 diff --git a/2.高效学习/2.2优雅的使用工具.md b/2.高效学习/2.2优雅的使用工具.md index 828385f..00650f5 100644 --- a/2.高效学习/2.2优雅的使用工具.md +++ b/2.高效学习/2.2优雅的使用工具.md @@ -56,7 +56,7 @@ rm coreutils-8.32 coreutils-8.32.tar.xz - [思源笔记](https://b3log.org/siyuan/) 一个国产开源的笔记/知识库软件,优势是 本地化、双链、Markdown 语法,与 Obsidian 定位相似,但 Geek 成分和自定义空间相对更高 - [Zotero](https://www.zotero.org/):协助文献阅读还有写笔记,支持与平板同传(同时他是开源的,所以可以添加一些插件) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnO1PEsVd4KY7reeU64spShf.jpg) +![](https://cdn.xyxsw.site/boxcnO1PEsVd4KY7reeU64spShf.jpg) - [Notion](http://notion.so): 笔记终结者,非常强大,(设计理念被钉钉,飞书,我来非常抄袭)。在线就可以使用。 diff --git a/2.高效学习/2.5以理工科的方式阅读英语.md b/2.高效学习/2.5以理工科的方式阅读英语.md index cd054d6..1580958 100644 --- a/2.高效学习/2.5以理工科的方式阅读英语.md +++ b/2.高效学习/2.5以理工科的方式阅读英语.md @@ -2,7 +2,7 @@ 作为一名理工科学生,也许英语并不是你的强势,但往往学习又难以避开英语。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/G6zAbGrTKoBLsfxhmvHcUBVynpc.png) +![](https://cdn.xyxsw.site/G6zAbGrTKoBLsfxhmvHcUBVynpc.png) 下面提供一些英语阅读的方法: diff --git a/2.高效学习/2.高效学习.md b/2.高效学习/2.高效学习.md index 8b7559e..908d919 100644 --- a/2.高效学习/2.高效学习.md +++ b/2.高效学习/2.高效学习.md @@ -45,7 +45,7 @@ Search the "friendly" website ## 如果真的不知道怎么解决怎么办? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnSmy1oqFO1glYIYGRZ9NhEb.jpg) +![](https://cdn.xyxsw.site/boxcnSmy1oqFO1glYIYGRZ9NhEb.jpg) 来细看看本章节的内容吧! diff --git a/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md b/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md index 5c18af8..c1868e6 100644 --- a/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md +++ b/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md @@ -6,7 +6,7 @@ 进入 [https://www.luogu.com.cn/](https://www.luogu.com.cn/) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing1.png) +![](https://cdn.xyxsw.site/wenjing1.png) ### 社交模块 @@ -16,11 +16,11 @@ 点开题库,我们看见以下界面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing2.png) +![](https://cdn.xyxsw.site/wenjing2.png) 在上方我们可以筛选我们想要的题目,接下来我们点开 P1000 为例 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing3.png) +![](https://cdn.xyxsw.site/wenjing3.png) 右侧三个模块为折叠状态,下面介绍他们的作用 @@ -34,7 +34,7 @@ 点击提交答案 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing4.png) +![](https://cdn.xyxsw.site/wenjing4.png) 左侧可以选择语言类型,C++ 用户建议选择 C++14。 @@ -44,7 +44,7 @@ O2 优化是一种优化(废话)假如您的代码复杂度正确但 TLE, 怎么知道自己代码的问题出在哪里呢?记录模块是帮助你的好工具。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing5.png) +![](https://cdn.xyxsw.site/wenjing5.png) AC:通过该数据点 @@ -64,7 +64,7 @@ OLE:输出超限 放心你见不到的 点开侧栏题单 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing6.png) +![](https://cdn.xyxsw.site/wenjing6.png) 建议新手从官方精选题单开始,由浅入深,由简到难。等到对算法形成概念,针对漏洞补习时可以尝试用户分享题单(到那个阶段已经有很多手段去找题了,刘教练的题单就够你做了) @@ -76,7 +76,7 @@ OLE:输出超限 放心你见不到的 进入 [https://codeforces.com/?locale=en](https://codeforces.com/?locale=en) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing7.png) +![](https://cdn.xyxsw.site/wenjing7.png) 比起 Luogu,这样的 UI 设计离 CN 互联网已经很远了(然而比起更硬核的一些做题网站,CF 的 UI 真是越看越顺眼) @@ -100,7 +100,7 @@ OLE:输出超限 放心你见不到的 进入比赛页面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing8.png) +![](https://cdn.xyxsw.site/wenjing8.png) 上方为将举办比赛,显示开始时间(UTC+8 也就是我们时区的时间)和持续时间大多都开始的比较晚,例如笔者就没有这么晚学习的习惯,所以一般赛后写题。比赛分为以下几种类型(例如写在括号里的 Div.2) @@ -114,14 +114,14 @@ Div.1、Div.2、Div.3、Div.4 数字越小难度越大。 ### VP -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing9.png) +![](https://cdn.xyxsw.site/wenjing9.png) 这是一场笔者之前赛后补过的 Div.2,画面右下角分别为赛后公告和题解,右侧便是开启 VP 的按钮。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing10.png) +![](https://cdn.xyxsw.site/wenjing10.png) VP模拟赛时的好处就是在虚拟参赛中获得真实比赛才能积累的经验,比如这里笔者发现通过前三题后,我应该先去看看 F 题,因为做出来的人更多,我有更大的可能性做出来,ACM 中题目并不是 100% 按难度排序。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing11.png) +![](https://cdn.xyxsw.site/wenjing11.png) 进入 VP 后,我们可以发现比起正常赛后补题有了明显不同。 @@ -135,25 +135,25 @@ Div.1、Div.2、Div.3、Div.4 数字越小难度越大。 让我们点开 A 题,来看看如何提交答案 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing12.png) +![](https://cdn.xyxsw.site/wenjing12.png) 可以看见,右侧有一个 submit,与 luogu 不同的是,你需要上传源代码文件(如 cpp)然后选择 G++17 为语言,提交。 当然,你也可以点开上侧的 submit code -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing13.png) +![](https://cdn.xyxsw.site/wenjing13.png) 选择题目、语言,填写代码后提交,就和 Luogu 的方式一样了。 同样,在上侧 MY SUBMISSIONS 处可以查看已提交的代码和状态 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing14.png) +![](https://cdn.xyxsw.site/wenjing14.png) ### PROBLEMSET 同样,CF 也有题库 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wenjing15.png) +![](https://cdn.xyxsw.site/wenjing15.png) 如果你只想做某道题而不是某场比赛,这里也许更适合你。 diff --git a/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md b/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md index 6ce1658..67aeedb 100644 --- a/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md +++ b/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md @@ -58,7 +58,7 @@ 打完比赛,建议钻研一下自己没做出的前一两题,写个题解。为什么要写题解呢,一个是方便以后来回顾,一个是加深印象,一个是把自己的思维用文字表达出来,这样能发现思维的漏洞(比如证明不严谨之类的)。题解写出来发不发博客就看个人喜好吧。作者以前也是坚持写博客写了很久。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Axiomofchoice_1.png) +![](https://cdn.xyxsw.site/Axiomofchoice_1.png) 为什么要打 Codeforces 比赛呢?主要原因是打比赛有计时,有压力(怕掉分的压力),能让人提升更快。不要因为怕掉分就不参加了,你要相信只要你一直打比赛,你的 rating 曲线一定是波动上升的。 diff --git a/3.编程思维体系构建/3.3如何选择编程语言.md b/3.编程思维体系构建/3.3如何选择编程语言.md index 3e6d9e1..2433422 100644 --- a/3.编程思维体系构建/3.3如何选择编程语言.md +++ b/3.编程思维体系构建/3.3如何选择编程语言.md @@ -10,7 +10,7 @@ 首先附上一张经典老图 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnW0YQY58RXhwdtRj5k6ndlc.jpeg) +![](https://cdn.xyxsw.site/boxcnW0YQY58RXhwdtRj5k6ndlc.jpeg) ## C 语言/C++ @@ -56,6 +56,6 @@ Python 在图里是电锯,适合干比较“狂野”的任务,也是深度 频繁应用于Web 开发,安卓应用等等。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPv2FcyQxGLjYHThSaJNwRf.jpeg) +![](https://cdn.xyxsw.site/boxcnPv2FcyQxGLjYHThSaJNwRf.jpeg) 当然还有各种形形色色的编程语言等着同学们去探索。 diff --git a/3.编程思维体系构建/3.4.1FAQ:常见问题.md b/3.编程思维体系构建/3.4.1FAQ:常见问题.md index 4327261..7bb12e6 100644 --- a/3.编程思维体系构建/3.4.1FAQ:常见问题.md +++ b/3.编程思维体系构建/3.4.1FAQ:常见问题.md @@ -8,7 +8,7 @@ 尝试借鉴他人的代码也未尝不可,但是要保证每一行都看懂哦 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnQ4rvJqVbXJaWMOwceHdrQb.png) +![](https://cdn.xyxsw.site/boxcnQ4rvJqVbXJaWMOwceHdrQb.png) # 我感觉讲义写的不够细 @@ -67,6 +67,6 @@ NJU-ICS-PA 南京大学计算机系统基础 # 坚持了好久还是搞不定, 我想放弃了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnuNXrb5zOppCZAlGQ19wuDk.jpg) +![](https://cdn.xyxsw.site/boxcnuNXrb5zOppCZAlGQ19wuDk.jpg) 也许是你坚持的姿势不对,来和 ZZM 聊聊吧 diff --git a/3.编程思维体系构建/3.4.2用什么写 C 语言.md b/3.编程思维体系构建/3.4.2用什么写 C 语言.md index ca9cac3..c0caed1 100644 --- a/3.编程思维体系构建/3.4.2用什么写 C 语言.md +++ b/3.编程思维体系构建/3.4.2用什么写 C 语言.md @@ -18,7 +18,7 @@ Visual Studio (以下简称 VS )是 Windows 下最完美的 C/C++ 等语言 选择社区版 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhNeAnlrbcdJciMUY9oNTuc.png) +![](https://cdn.xyxsw.site/boxcnhNeAnlrbcdJciMUY9oNTuc.png) 社区版和专业版等的区别:社区版免费,功能上几乎无差别 @@ -26,7 +26,7 @@ Visual Studio (以下简称 VS )是 Windows 下最完美的 C/C++ 等语言 选择 C++ 桌面开发,其他不用选,有需要了再说。另外,Python 开发不好使,不要像我一样选 Python 开发。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnkjmKcCxIgRIzA5kyUZckye.png) +![](https://cdn.xyxsw.site/boxcnkjmKcCxIgRIzA5kyUZckye.png) 安装完成后,一般来说 VS 不会自动创建桌面快捷方式,你需要到开始菜单中启动 VS。 @@ -40,19 +40,19 @@ VS 是项目制,你需要创建一个项目才能开始编写代码并运行 打开 VS,会打开如下界面(我使用深色主题),在此处单击“创建新项目” -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn6MgNnY2qBd1yAudeirx6Sh.png) +![](https://cdn.xyxsw.site/boxcn6MgNnY2qBd1yAudeirx6Sh.png) 在创建新项目页面中选择项目模板为控制台应用(空项目亦可,后续手动添加.c 源文件),并单击下一步 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnFwZpWZ3fQkdd3mCO8Mr9Wj.png) +![](https://cdn.xyxsw.site/boxcnFwZpWZ3fQkdd3mCO8Mr9Wj.png) 为你的项目起一个名字,以及选择项目的位置,一般默认即可,如果你有强迫症,C 盘一定不能放个人数据,请自行修改。完成后单击“创建” -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnkxd472wIT39DbEiBsyPWzf.png) +![](https://cdn.xyxsw.site/boxcnkxd472wIT39DbEiBsyPWzf.png) 自此就创建了一个项目了,你将会到达如下界面: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnvOGdjKLnvXvJM7nlE8yVcb.png) +![](https://cdn.xyxsw.site/boxcnvOGdjKLnvXvJM7nlE8yVcb.png) 其中,左侧(如果在一开始没有选择 C++ 开发环境的话可能在右侧)为资源管理器,列出了本项目所用到的所有文件,包括代码(外部依赖项、源文件、头文件),以及将来开发图形化界面所需的资源文件;最中间占据面积最多的是代码编辑器窗口,你以后将会在这里编写你的 C 语言代码。最下面是输出窗口,源代码进行编译时,会在此处给出编译进度以及可能的代码中的错误。 @@ -68,7 +68,7 @@ C 语言是编译型语言,因此说“运行”代码其实并不是十分合 当你编写完自己的代码后,即可单击“本地 Windows 调试器”(或者使用快捷键 F5)进行“运行”。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhTxhUYMHeYHdrq0zWzLomb.png) +![](https://cdn.xyxsw.site/boxcnhTxhUYMHeYHdrq0zWzLomb.png) 你可能会发现在“本地 Windows 调试器”右侧还有一个绿色三角形,并且单击这个也可以“运行”,这两个的区别在于“本地 Windows 调试器”是调试运行,右侧那个是不调试直接运行。 @@ -76,17 +76,17 @@ C 语言是编译型语言,因此说“运行”代码其实并不是十分合 如果你的代码被 VS 提示“This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.” -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfrxYjk5CCjMfY0mLK1B1Ze.png) +![](https://cdn.xyxsw.site/boxcnfrxYjk5CCjMfY0mLK1B1Ze.png) 需要你在项目-xxx 属性(xxx 是你的项目名)-C/C++-代码生成-安全检查里将安全检查禁用 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniHhCIUQY0oB3ALlxqgciLd.png) +![](https://cdn.xyxsw.site/boxcniHhCIUQY0oB3ALlxqgciLd.png) ### 调试 IDE 相比于代码编辑器,最强大的一点莫过于成熟的调试系统。通过调试,可以快速定位代码中没有被编译器检查出来的逻辑错误。如果需要调试,则可以在这个位置单击,打下断点,并且运行程序,程序运行时,就会在此处暂停下来,暂停时就可以查看各个变量的值了。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnydHyaNPqUEVVWmbdGofX0d.png) +![](https://cdn.xyxsw.site/boxcnydHyaNPqUEVVWmbdGofX0d.png) ### 深色主题 @@ -96,15 +96,15 @@ IDE 相比于代码编辑器,最强大的一点莫过于成熟的调试系统 #### 仔细查看报错 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnC6TAAdtS0P5HzebFgFn2lc.png) +![](https://cdn.xyxsw.site/boxcnC6TAAdtS0P5HzebFgFn2lc.png) 如果程序代码中出现红色波浪线,则表示该处代码有“错误”,并且该处的错误会同步显示在下面的这个位置,单击即可看到错误详情。如果代码中出现绿色波浪线,则表示该处代码中有警告。警告和错误的区别是警告可以通过编译运行,但编译器认为你这里可能写错了;错误是完全不可以通过编译。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn7zL0QFakVTpYBdpOmmWOvc.png) +![](https://cdn.xyxsw.site/boxcn7zL0QFakVTpYBdpOmmWOvc.png) #### 善用提示 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn2ouk043lNQEUkVkIS7bSSd.png) +![](https://cdn.xyxsw.site/boxcn2ouk043lNQEUkVkIS7bSSd.png) 当你打一些函数名或者关键字时,VS 会给出你语法提示,如果这个提示正确,按下 Tab 键即可将这个提示补全到你的代码里;或者你也可以跟着这个提示打一遍,防止打错关键字。 @@ -145,7 +145,7 @@ vscode 的项目和 VS 不同,vscode 的项目比较松散,并没有 VS 那 编写完代码后,保存文件,并点击运行-启动调试 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnim98FJybpkGl8sfqxP9v9b.png) +![](https://cdn.xyxsw.site/boxcnim98FJybpkGl8sfqxP9v9b.png) 此时会弹出如下选择框,我的电脑上同时安装有 VS 和 gcc 编译器,因此有两个,大部分的电脑上应该只有一个“C++ (Windows)”,选择你电脑上的编译器并运行即可。 @@ -177,25 +177,25 @@ CLion 是 jetbrains 家族的 C 语言 IDE XCode 是 mac 官方的 IDE,能编写所有 mac 家族设备的软件。但缺点是没有中文。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn05Ca6Wu5TxFMplZCw2N8Jb.png) +![](https://cdn.xyxsw.site/boxcn05Ca6Wu5TxFMplZCw2N8Jb.png) 打开以后选择 Create a new Xcode project,选择 macOS-Command Line Tool -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbnrVCmNGfriHhU5pL76gsd.png) +![](https://cdn.xyxsw.site/boxcnbnrVCmNGfriHhU5pL76gsd.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnjaObP5JzpICUx1PMO9MQg.png) +![](https://cdn.xyxsw.site/boxcnnjaObP5JzpICUx1PMO9MQg.png) 两个空里第一个填项目名,第二个随便填就行 next 后选择项目保存的位置,之后即可到达以下界面: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnl06p0ZS8SSQsWJNLQLYIjc.png) +![](https://cdn.xyxsw.site/boxcnl06p0ZS8SSQsWJNLQLYIjc.png) 点左上方小三角即可运行 在行号上点击并运行即可调试 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnmRygjmZfwFzODP2N6bVoEh.png) +![](https://cdn.xyxsw.site/boxcnmRygjmZfwFzODP2N6bVoEh.png) ## Linux diff --git a/3.编程思维体系构建/3.4.3解决编程问题的普适性过程.md b/3.编程思维体系构建/3.4.3解决编程问题的普适性过程.md index 080412f..15b99b5 100644 --- a/3.编程思维体系构建/3.4.3解决编程问题的普适性过程.md +++ b/3.编程思维体系构建/3.4.3解决编程问题的普适性过程.md @@ -3,7 +3,7 @@ - 本篇不需要任何前置知识,推荐在学习 C 语言和学完 C 语言后各看一遍。 - 我们鼓励你在解决问题的时候进行思考,锻炼解决问题的能力,而不只是成为一个做代码翻译工作的“码农”。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/YAOvb6gquofiAYxsn3tcxcCYngf.png) +![](https://cdn.xyxsw.site/YAOvb6gquofiAYxsn3tcxcCYngf.png) 解决编程问题的常见误区: @@ -13,7 +13,7 @@ 如果你计划得足够好并且代码编写得正确,你的代码将在第一次工作。即便它第一次不起作用,那么你至少有一个对于代码如何调试的可靠计划。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HMipbO4vSoM3jhxSZ7Kcuddqnxh.png) +![](https://cdn.xyxsw.site/HMipbO4vSoM3jhxSZ7Kcuddqnxh.png) ## Work an Example Yourself diff --git a/3.编程思维体系构建/3.4.4C语言前置概念学习.md b/3.编程思维体系构建/3.4.4C语言前置概念学习.md index 246cd8e..7c5da88 100644 --- a/3.编程思维体系构建/3.4.4C语言前置概念学习.md +++ b/3.编程思维体系构建/3.4.4C语言前置概念学习.md @@ -34,6 +34,6 @@ 计算机思维与计算机科学与编码能力 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Hqzbbs6iYobnxWxz11Ocfa9gnHd.png) +![](https://cdn.xyxsw.site/Hqzbbs6iYobnxWxz11Ocfa9gnHd.png) ### CS education is more than just “learning how to code”! diff --git a/3.编程思维体系构建/3.4.5.1C语言自测标准——链表.md b/3.编程思维体系构建/3.4.5.1C语言自测标准——链表.md index 7c2ce95..d537aab 100644 --- a/3.编程思维体系构建/3.4.5.1C语言自测标准——链表.md +++ b/3.编程思维体系构建/3.4.5.1C语言自测标准——链表.md @@ -6,13 +6,13 @@ 使用链表存储数据,不强制要求数据在内存中集中存储,各个元素可以分散存储在内存中。例如,使用链表存储 {1,2,3},各个元素在内存中的存储状态可能是: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnuwZzqX4dF8xKTYajwrDSxf.png) +![](https://cdn.xyxsw.site/boxcnuwZzqX4dF8xKTYajwrDSxf.png) 可以看到,数据不仅没有集中存放,在内存中的存储次序也是混乱的。那么,链表是如何存储数据间逻辑关系的呢? 链表存储数据间逻辑关系的实现方案是:为每一个元素配置一个指针,每个元素的指针都指向自己的直接后继元素,如下图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnAnkVAJmMT0NSNvo6crXYAd.png) +![](https://cdn.xyxsw.site/boxcnAnkVAJmMT0NSNvo6crXYAd.png) 显然,我们只需要记住元素 1 的存储位置,通过它的指针就可以找到元素 2,通过元素 2 的指针就可以找到元素 3,以此类推,各个元素的先后次序一目了然。像图 2 这样,数据元素随机存储在内存中,通过指针维系数据之间“一对一”的逻辑关系,这样的存储结构就是链表。 @@ -20,13 +20,13 @@ 在链表中,每个数据元素都配有一个指针,这意味着,链表上的每个“元素”都长下图这个样子: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcncRc5OKZROtxC9rpQYxrjvf.png) +![](https://cdn.xyxsw.site/boxcncRc5OKZROtxC9rpQYxrjvf.png) 数据域用来存储元素的值,指针域用来存放指针。数据结构中,通常将这样的整体称为结点。 也就是说,链表中实际存放的是一个一个的结点,数据元素存放在各个结点的数据域中。举个简单的例子,图 3 中 {1,2,3} 的存储状态用链表表示,如下图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn0VMYQlez7tQTNkTPDkCsvg.png) +![](https://cdn.xyxsw.site/boxcn0VMYQlez7tQTNkTPDkCsvg.png) 在 C 语言中,可以用结构体表示链表中的结点,例如: @@ -66,7 +66,7 @@ typedef struct Node* Link; 例如,创建一个包含头结点的链表存储 {1,2,3},如下图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnjAoO54txAhnu7Ry8ExjGvc.png) +![](https://cdn.xyxsw.site/boxcnjAoO54txAhnu7Ry8ExjGvc.png) ## 链表的创建 @@ -104,7 +104,7 @@ while (Judgement) } ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn8ZxT5oMkScArZjZhgM6TYb.png) +![](https://cdn.xyxsw.site/boxcn8ZxT5oMkScArZjZhgM6TYb.png) ### 创建结点——尾插法 @@ -121,7 +121,7 @@ while (Judgement) //for同理 } ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnMjc9pwgZgk1GBmBRlBS6d.png) +![](https://cdn.xyxsw.site/boxcnnMjc9pwgZgk1GBmBRlBS6d.png) ## 链表的基本操作 @@ -176,7 +176,7 @@ int GetElem(Link *L, int i; int *e) 例如,在链表 `{1,2,3,4}` 的基础上分别实现在头部、中间、尾部插入新元素 5,其实现过程如图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxjex5Q3Lt9AAx6roN3ClUg.png) +![](https://cdn.xyxsw.site/boxcnxjex5Q3Lt9AAx6roN3ClUg.png) 从图中可以看出,虽然新元素的插入位置不同,但实现插入操作的方法是一致的,都是先执行步骤 1 ,再执行步骤 2。实现代码如下: @@ -207,7 +207,7 @@ int ListInsert(Link *L, int i, int e) 对于没有头结点的链表,在头部插入结点比较特殊,需要单独实现。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn1hlL1Fk4kDK4CPT2hJxwnV.png) +![](https://cdn.xyxsw.site/boxcn1hlL1Fk4kDK4CPT2hJxwnV.png) 和 2)、3) 种情况相比,由于链表没有头结点,在头部插入新结点,此结点之前没有任何结点,实现的步骤如下: @@ -253,7 +253,7 @@ temp->next=temp->next->next; 例如,从存有 `{1,2,3,4}` 的链表中删除存储元素 3 的结点,则此代码的执行效果如图 3 所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnn3QHja0tzEwqJl9Mk4KnCg.png) +![](https://cdn.xyxsw.site/boxcnn3QHja0tzEwqJl9Mk4KnCg.png) 实现代码如下: @@ -282,7 +282,7 @@ int ListDelete(Link *L, int i, int* e) 对于不带头结点的链表,需要单独考虑删除首元结点的情况,删除其它结点的方式和图 3 完全相同,如下图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXjwE0yDFvpQxLaPw7FifxV.png) +![](https://cdn.xyxsw.site/boxcnXjwE0yDFvpQxLaPw7FifxV.png) 实现代码如下: @@ -319,7 +319,7 @@ int ListDelete(Link *L, int i, int* e) 如图所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针数数,数到 2 的那个人出列: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngx7ZPA7pONbJo82LbNCO1g.png) +![](https://cdn.xyxsw.site/boxcngx7ZPA7pONbJo82LbNCO1g.png) 出列顺序依次为: @@ -339,10 +339,10 @@ int ListDelete(Link *L, int i, int* e) 为了使空链表和非空链表处理一致,我们通常设一个头结点,当然,并不是说,循环链表一定要头结点,这需要注意。循环链表带有头结点的空链表如图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3l30usevMTgv1ZbZ0mfJdh.png) +![](https://cdn.xyxsw.site/boxcn3l30usevMTgv1ZbZ0mfJdh.png) 对于非空的循环链表如图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngoLTiM9wto9uCGzH7nkjkW.png) +![](https://cdn.xyxsw.site/boxcngoLTiM9wto9uCGzH7nkjkW.png) 循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断 p->next 是否为空,现在则是 p->next 不等于头结点,则循环未结束。 diff --git a/3.编程思维体系构建/3.4.6阶段二:文字冒险(cool).md b/3.编程思维体系构建/3.4.6阶段二:文字冒险(cool).md index e87fd8d..9194fcd 100644 --- a/3.编程思维体系构建/3.4.6阶段二:文字冒险(cool).md +++ b/3.编程思维体系构建/3.4.6阶段二:文字冒险(cool).md @@ -20,7 +20,7 @@ 当然,如果你选择跳过,也不会对 python 开发那里造成非常大的影响但是你会错失一个非常宝贵的学习机会。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnustZBhjMu8FPN0Kxi4Mwvf.jpg) +![](https://cdn.xyxsw.site/boxcnustZBhjMu8FPN0Kxi4Mwvf.jpg) 在 1980 年代, [文字冒险](http://en.wikipedia.org/wiki/Text_adventure) 是一种受人尊敬的电脑游戏类型。但是时代已经变了,在 21 世纪,它们与 带有 3D 引擎的现代 [MMORPG 相比显得苍白无力。](http://en.wikipedia.org/wiki/Mmorpg)书籍在电影的兴起中幸存下来,而基于文本的游戏很快就输掉了与图形游戏的战斗。“互动小说”由一个活跃的社区保持活力,但它的商业价值早已不复存在。 diff --git a/3.编程思维体系构建/3.4.7.1.1调试理论.md b/3.编程思维体系构建/3.4.7.1.1调试理论.md index 2a1e2f0..c0e9daf 100644 --- a/3.编程思维体系构建/3.4.7.1.1调试理论.md +++ b/3.编程思维体系构建/3.4.7.1.1调试理论.md @@ -28,7 +28,7 @@ - 打印变量, 断点, 监视点, 函数调用栈... -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnaqLMfwqNMTcYEPuF3vFjqg.png) +![](https://cdn.xyxsw.site/boxcnaqLMfwqNMTcYEPuF3vFjqg.png) # 调试理论 diff --git a/3.编程思维体系构建/3.4.7.1GDB初探索(编程可阅览).md b/3.编程思维体系构建/3.4.7.1GDB初探索(编程可阅览).md index ed04eaa..1b251cf 100644 --- a/3.编程思维体系构建/3.4.7.1GDB初探索(编程可阅览).md +++ b/3.编程思维体系构建/3.4.7.1GDB初探索(编程可阅览).md @@ -2,7 +2,7 @@ 请在开始进行 C 语言编程之后查阅使用 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHXggg6eLy86vFmb4shOksh.png) +![](https://cdn.xyxsw.site/boxcnHXggg6eLy86vFmb4shOksh.png) # GDB 是什么? diff --git a/3.编程思维体系构建/3.4.7.2C的历史问题:undefined behavior.md b/3.编程思维体系构建/3.4.7.2C的历史问题:undefined behavior.md index 46b7141..f8e4052 100644 --- a/3.编程思维体系构建/3.4.7.2C的历史问题:undefined behavior.md +++ b/3.编程思维体系构建/3.4.7.2C的历史问题:undefined behavior.md @@ -1,6 +1,6 @@ # C 的历史问题:undefined behavior -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnIdOChXQUGMvnxWcB7uTWLh.png) +![](https://cdn.xyxsw.site/boxcnIdOChXQUGMvnxWcB7uTWLh.png) 简写为 UB diff --git a/3.编程思维体系构建/3.4C语言.md b/3.编程思维体系构建/3.4C语言.md index 79108cb..0e65f08 100644 --- a/3.编程思维体系构建/3.4C语言.md +++ b/3.编程思维体系构建/3.4C语言.md @@ -6,7 +6,7 @@ 值得一提的是,我不会在本教程讲授过于基础的概念,但是会贴出你可能需要学习的内容。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnAnXUHDqsMYVrDlBfFunoVf.png) +![](https://cdn.xyxsw.site/boxcnAnXUHDqsMYVrDlBfFunoVf.png) 同时我要说的是:C 语言为了适配多种多样的硬件以及各式各样的操作,他对非常多的 undefined 操作不做太多限制,也就是说你可能会出现各种各样的问题,甚至把你电脑炸了 diff --git a/3.编程思维体系构建/3.5git与github.md b/3.编程思维体系构建/3.5git与github.md index 8c51999..3c09933 100644 --- a/3.编程思维体系构建/3.5git与github.md +++ b/3.编程思维体系构建/3.5git与github.md @@ -223,7 +223,7 @@ git checkout -B 分支名 页面大概是这样(老图): -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHemi9HkeAG1fgoznHbHLrc.png) +![](https://cdn.xyxsw.site/boxcnHemi9HkeAG1fgoznHbHLrc.png) ### Git 和 Github @@ -263,11 +263,11 @@ ssh-keygen -t rsa -C "youremail@example.com" # youremail为你注册用的电 登陆 `GitHub`,点击右上角自己的头像,打开 `settings` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-07-16_17-12-32.png) +![](https://cdn.xyxsw.site/Snipaste_2023-07-16_17-12-32.png) 然后打开左侧栏 `SSH and GPG`` keys` 页面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn1HbQct335qvZ71tGNu7jne.png) +![](https://cdn.xyxsw.site/boxcn1HbQct335qvZ71tGNu7jne.png) 然后,点 `New SSH Key`,填上任意 Title,在 Key 文本框里粘贴 `id_rsa.pub` 文件的内容即可 @@ -277,11 +277,11 @@ ssh-keygen -t rsa -C "youremail@example.com" # youremail为你注册用的电 首先在 GitHub 主页,找到 `New` 或者 `Create repository` 一个绿色的按钮,创建一个新的仓库 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn5sVnE76FYpVW2RDxtWDiZc.png) +![](https://cdn.xyxsw.site/boxcn5sVnE76FYpVW2RDxtWDiZc.png) 然后填上这个仓库的大名就可以创建了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnsN133WrLrbxsX8JgvsQmif.png) +![](https://cdn.xyxsw.site/boxcnsN133WrLrbxsX8JgvsQmif.png) 根据之前学习的方法在本地创建完 git 仓库之后 @@ -304,7 +304,7 @@ git clone git@github.com:yourname/gitexample.git 或者你可以跟随新创建之后的指引,`…or create a new repository on the command line` 内他描述了如何创建一个文件夹、创建一个README.md的文件,然后和github仓库绑定。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-07-16_17-19-18.png) +![](https://cdn.xyxsw.site/Snipaste_2023-07-16_17-19-18.png) @@ -320,7 +320,7 @@ git clone 首先,代码的 url 在下图所示的位置 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTiaT2EnNfKVkretPsyajVd.png) +![](https://cdn.xyxsw.site/boxcnTiaT2EnNfKVkretPsyajVd.png) 然后复制完代码后切换回我们的命令行 @@ -338,7 +338,7 @@ git clone https://github.com/camera-2018/git-example.git 一阵抽搐过后就下载好了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn8aRDQpe7uuDxFv9v1WvZ4c.png) +![](https://cdn.xyxsw.site/boxcn8aRDQpe7uuDxFv9v1WvZ4c.png) ::: tip 用完之后别忘记给 camera-2018 点个 follow 😋 `呃呃 follow 没用 star 有用` @@ -350,7 +350,7 @@ git clone https://github.com/camera-2018/git-example.git 如图 我在仓库里新建了 `helloworld.c` 并且写了一些代码 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnZpPsp4FP78auolzHvCKP0g.png) +![](https://cdn.xyxsw.site/boxcnZpPsp4FP78auolzHvCKP0g.png) 接下来是提交操作 @@ -358,7 +358,7 @@ git clone https://github.com/camera-2018/git-example.git git status #看一下文件暂存区 ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnm4R1ZN0WeUBuYht6zge7pd.png) +![](https://cdn.xyxsw.site/boxcnm4R1ZN0WeUBuYht6zge7pd.png) 红色表示文件没有提交到暂存区 我们要提交 @@ -368,7 +368,7 @@ git status #看一下文件暂存区 git add . #将没有提交的所有文件加入暂存区 ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnYHd076RAqfDmHjbUkeNSvg.png) +![](https://cdn.xyxsw.site/boxcnYHd076RAqfDmHjbUkeNSvg.png) 绿色表示所有文件已加入暂存 @@ -378,7 +378,7 @@ git commit -m "feat(helloworld): add helloworld file" 将刚才加入暂区的文件发起了一个提交,提交注释(commit message)是 `feat(helloworld): add helloworld file` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcni2dupDzNO8qTWPAxS5c67b.png) +![](https://cdn.xyxsw.site/boxcni2dupDzNO8qTWPAxS5c67b.png) 1. 如果这是你自己的仓库有权限(本人仓库或 Collaborators 有权限的情况下)你就可以直接使用 @@ -389,7 +389,7 @@ git commit -m "feat(helloworld): add helloworld file" 上传本次提交 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnNBu1EJnva4EkyQZAVlwGMe.png) + ![](https://cdn.xyxsw.site/boxcnNBu1EJnva4EkyQZAVlwGMe.png) 2. 如果你没有本仓库的主分支提交权限 可以提交 PR(Pull Requests) @@ -397,7 +397,7 @@ git commit -m "feat(helloworld): add helloworld file" 首先创建一个新分支 命名为 `yourname-dev` - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnaS7aOzdt31vsZZx8R1s33e.png) + ![](https://cdn.xyxsw.site/boxcnaS7aOzdt31vsZZx8R1s33e.png) 然后按照上面的方法 `git clone` 并切换到你刚创建的分支 @@ -407,31 +407,31 @@ git commit -m "feat(helloworld): add helloworld file" 然后提交一个文件,这里直接使用 vscode 自带的 git 工具试试 (很方便、不用敲命令行) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnmwlYWOzwPbNqTAuSZK9dW3.png) + ![](https://cdn.xyxsw.site/boxcnmwlYWOzwPbNqTAuSZK9dW3.png) 点暂存所有更改 写好 comment 之后点提交 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfcCnAdtdX2oyLIC3NibVnf.png) + ![](https://cdn.xyxsw.site/boxcnfcCnAdtdX2oyLIC3NibVnf.png) 最后点同步更改上传 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn9DSPlFgG2WMZhTOE9Zhzgb.png) + ![](https://cdn.xyxsw.site/boxcn9DSPlFgG2WMZhTOE9Zhzgb.png) 如果是你提交 在 github 上会显示这个 快捷创建 pr 的按钮 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHd7Qfi8C0Y7V2Ot5ii4vpf.png) + ![](https://cdn.xyxsw.site/boxcnHd7Qfi8C0Y7V2Ot5ii4vpf.png) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnyt3eeZQyN8b1xM1WjDrTGe.png) + ![](https://cdn.xyxsw.site/boxcnyt3eeZQyN8b1xM1WjDrTGe.png) 点它创建 PR - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJOjh1Zfp9tCd3llL9NsEzb.png) + ![](https://cdn.xyxsw.site/boxcnJOjh1Zfp9tCd3llL9NsEzb.png) 这样管理本仓库的人看到 pr 请求就可以 merge 合并辣 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnBMq0sw6c48jvjdPJwmAGtZ.png) + ![](https://cdn.xyxsw.site/boxcnBMq0sw6c48jvjdPJwmAGtZ.png) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngNZOSnYUtCKH6pm8UaUMNd.png) + ![](https://cdn.xyxsw.site/boxcngNZOSnYUtCKH6pm8UaUMNd.png) 实际合作过程中可能会出现代码冲突无法 merge 的情况 😋 遇到了自己去 STFW 吧 @@ -439,7 +439,7 @@ git commit -m "feat(helloworld): add helloworld file" 可以点击仓库右上角的 fork - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-07-16_17-34-21.png) + ![](https://cdn.xyxsw.site/Snipaste_2023-07-16_17-34-21.png) 这样会在你的名下多出来一份这个同名仓库,而这个仓库你是拥有所有权限的,你可以 clone 你这个同名仓库,更改代码,提交代码之后 @@ -499,8 +499,8 @@ Copilot 可以根据上下文和输入的提示,为开发人员生成代码建 你可以在 `settings` 里看到你的copilot ,配置如下 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-07-16_17-59-49.png) +![](https://cdn.xyxsw.site/Snipaste_2023-07-16_17-59-49.png) 然后就可以在你喜欢的 IDE 或编辑器上下载 Copilot 插件,来启用他。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-07-16_18-02-19.png) +![](https://cdn.xyxsw.site/Snipaste_2023-07-16_18-02-19.png) diff --git a/3.编程思维体系构建/3.6.2环境配置.md b/3.编程思维体系构建/3.6.2环境配置.md index 6dd9660..3b81c9a 100644 --- a/3.编程思维体系构建/3.6.2环境配置.md +++ b/3.编程思维体系构建/3.6.2环境配置.md @@ -10,21 +10,21 @@ 装下来之后具体操作可以看[安装教程](https://blog.csdn.net/in546/article/details/117400839),如果自动配置环境变量的选项是灰色的话,请按照下面的教程把下面的几个文件路径加入环境变量。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3PLPIvKSSvYiCnwx50FYvf.png) +![](https://cdn.xyxsw.site/boxcn3PLPIvKSSvYiCnwx50FYvf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnvTQPcmPpUonmDZFZXNnGWd.png) +![](https://cdn.xyxsw.site/boxcnvTQPcmPpUonmDZFZXNnGWd.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn6ZnAzhaj2Tj7xk9K6FxBJh.png) +![](https://cdn.xyxsw.site/boxcn6ZnAzhaj2Tj7xk9K6FxBJh.png) 在里面添加并写入文件路径加入就好了~ -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnsuoHmhK4dBCLHlKhpRWIe.png) +![](https://cdn.xyxsw.site/boxcnnsuoHmhK4dBCLHlKhpRWIe.png) 然后打开 Pycharm,创建新项目,设置按照以下方式操作,记得挂梯子。 如果不挂梯子,请按照教程配置清华源。[我是教程](https://blog.csdn.net/jasneik/article/details/114227716) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTfvjYweuIZFKlcH78X38Pd.png) +![](https://cdn.xyxsw.site/boxcnTfvjYweuIZFKlcH78X38Pd.png) 然后一个新的环境就创建好辣~ diff --git a/3.编程思维体系构建/3.6.3安装python.md b/3.编程思维体系构建/3.6.3安装python.md index 91d14e0..bb423ea 100644 --- a/3.编程思维体系构建/3.6.3安装python.md +++ b/3.编程思维体系构建/3.6.3安装python.md @@ -36,7 +36,7 @@ 可以输入 `python3 --version` 检验是否成功。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn95LbcwuMC2dIViOxWk8BFb.png) +![](https://cdn.xyxsw.site/boxcn95LbcwuMC2dIViOxWk8BFb.png) # Jupyter Notebook @@ -54,6 +54,6 @@ jupyter notebook 进行使用 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfwk8gnFAHu5JzVUiugJjQe.png) +![](https://cdn.xyxsw.site/boxcnfwk8gnFAHu5JzVUiugJjQe.png) [Pycharm](https://www.jetbrains.com/zh-cn/pycharm/):可能很多同学已经用上了,我在这里不做更多解释 diff --git a/3.编程思维体系构建/3.6.4.2阶段二:递归操作.md b/3.编程思维体系构建/3.6.4.2阶段二:递归操作.md index 8826120..634dd2b 100644 --- a/3.编程思维体系构建/3.6.4.2阶段二:递归操作.md +++ b/3.编程思维体系构建/3.6.4.2阶段二:递归操作.md @@ -2,7 +2,7 @@ 什么是递归呢? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnCNpeAE9Hy61cyvtxfioIHg.png) +![](https://cdn.xyxsw.site/boxcnCNpeAE9Hy61cyvtxfioIHg.png) # diff --git a/3.编程思维体系构建/3.6.4.3阶段三:数据抽象.md b/3.编程思维体系构建/3.6.4.3阶段三:数据抽象.md index 4258b78..badcb5b 100644 --- a/3.编程思维体系构建/3.6.4.3阶段三:数据抽象.md +++ b/3.编程思维体系构建/3.6.4.3阶段三:数据抽象.md @@ -184,7 +184,7 @@ P7:9*9 乘法表 可能现在对你来说,构建像下图这样的 99 乘法表已经是非常容易的一件事了,可是如果我要求你使用 python 的列表推导式(list comprehension),在两行以内完成呢? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnccDSRQj5W3lZWEUkCOHz2b.png) +![](https://cdn.xyxsw.site/boxcnccDSRQj5W3lZWEUkCOHz2b.png) P8:couple 情侣 diff --git a/3.编程思维体系构建/3.6.5.1lab00:让我们开始吧.md b/3.编程思维体系构建/3.6.5.1lab00:让我们开始吧.md index f1f21cc..39ecbd5 100644 --- a/3.编程思维体系构建/3.6.5.1lab00:让我们开始吧.md +++ b/3.编程思维体系构建/3.6.5.1lab00:让我们开始吧.md @@ -158,7 +158,7 @@ VS Code 的另一个不错的功能是它具有“嵌入式终端”。因此, 首先,打开一个终端窗口。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/L5HvblSuYonJn4x03a4cMLKknrh.png) +![](https://cdn.xyxsw.site/L5HvblSuYonJn4x03a4cMLKknrh.png) #### 主目录 @@ -174,11 +174,11 @@ VS Code 的另一个不错的功能是它具有“嵌入式终端”。因此, PATH 就像一个地址:它告诉您和计算机到某个文件夹的完整路径(或路由)。请记住,您可以通过两种不同的方式访问计算机上的文件和目录(文件夹)。您可以使用终端(这是一个命令行界面或 CLI),也可以使用 Finder Finder 是图形用户界面(或 GUI)的一个 例子导航技术不同,但文件相同。例如,这是我的 CS 61A 实验室文件夹在我的 GUI 中的样子: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/CWDhbW6gzogyMFxtd6kcnPBunv2.png) +![](https://cdn.xyxsw.site/CWDhbW6gzogyMFxtd6kcnPBunv2.png) 这是完全相同的文件夹在终端中的外观: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HZNMbzGZOoQGAhxQ29gcM5V4nNd.png) +![](https://cdn.xyxsw.site/HZNMbzGZOoQGAhxQ29gcM5V4nNd.png) 请注意,在这两种情况下,黄色框都显示了 PATH,紫色椭圆显示了“labs”文件夹的内容。 @@ -186,7 +186,7 @@ PATH 就像一个地址:它告诉您和计算机到某个文件夹的完整路 让我们停下来思考一下终端和 Python 解释器之间的区别。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HgTfbMhCGodZbzxBNh9crH3cnCe.png) +![](https://cdn.xyxsw.site/HgTfbMhCGodZbzxBNh9crH3cnCe.png) 1. 哪个是终端? 2. 哪个是 Python 解释器? @@ -197,7 +197,7 @@ A 和 D 都是我的终端。在这里您可以运行 bash 命令,例如 `cd` B 是 Python 解释器。你可以从 >>> 提示中看出这意味着你已经启动了一个 Python 解释器。您还可以判断,因为启动它的命令是可见的:`python3`。该 `python3` 命令启动 Python 解释器。如果您在 Python 解释器中键入 bash 命令,您可能会遇到语法错误!这是一个例子: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GEN5b1HHdoDegPxAp8WcQDGknoc.png) +![](https://cdn.xyxsw.site/GEN5b1HHdoDegPxAp8WcQDGknoc.png) C 是我的代码编辑器。这是我可以编写 Python 代码以通过我的终端执行的地方。 @@ -287,7 +287,7 @@ mkdir lab 现在,如果您列出目录的内容(使用 `ls`),您将看到两个文件夹,`projects` 和 `lab`. -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Cpfzb9oK2oMyGxxgkqVceE8DnId.png) +![](https://cdn.xyxsw.site/Cpfzb9oK2oMyGxxgkqVceE8DnId.png) ### 更多目录更改 @@ -475,7 +475,7 @@ ______ 实验室还将包括函数编写问题。在你的文本编辑器中打开 `lab00.py`。您可以 `open .` 在 MacOS 或 `start .` Windows 上键入以在 Finder/文件资源管理器中打开当前目录。然后双击或右键单击以在文本编辑器中打开文件。你应该看到这样的东西: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FkOybDwtnoQeRyxejlwcjhQ2nch.png) +![](https://cdn.xyxsw.site/FkOybDwtnoQeRyxejlwcjhQ2nch.png) 三引号中的行 `"""` 称为文档字符串(Docstring),它描述了函数应该做什么。在 61A 中编写代码时,您应该始终阅读文档字符串! @@ -483,7 +483,7 @@ ______ 在这里,我们圈出了文档字符串和文档测试,以便于查看: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MF4ZbUZ0qo70gRxeNGocsYvmnwe.png) +![](https://cdn.xyxsw.site/MF4ZbUZ0qo70gRxeNGocsYvmnwe.png) 在 `twenty_twenty_two`, diff --git a/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md b/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md index e78a98d..cc42b14 100644 --- a/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md +++ b/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md @@ -14,13 +14,13 @@ 一路下一步 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcntUYJNAaOwB8L6KSEhJJojh.png) +![](https://cdn.xyxsw.site/boxcntUYJNAaOwB8L6KSEhJJojh.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnQkVQ4uyYCveO6toBujoGOc.png) +![](https://cdn.xyxsw.site/boxcnQkVQ4uyYCveO6toBujoGOc.png) 这俩我推荐勾掉 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndgDKfTuio3nF0QboemIPHe.png) +![](https://cdn.xyxsw.site/boxcndgDKfTuio3nF0QboemIPHe.png) 安装过后点许可证 输上面的 key 激活 @@ -30,15 +30,15 @@ 下好回到 VMware -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnGHnjgZvtcBrm0XXitFl4Jg.png) +![](https://cdn.xyxsw.site/boxcnGHnjgZvtcBrm0XXitFl4Jg.png) 创建新的虚拟机-典型(推荐)-下一步-安装程序 iso 选中你刚下的 iso 下一步 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXilUhHNEyU4r95FxiVgCdg.png) +![](https://cdn.xyxsw.site/boxcnXilUhHNEyU4r95FxiVgCdg.png) 这里填你一会儿要登录 linux 的个人信息 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnp33Oc3Ia2HzASTZJNOhEWb.png) +![](https://cdn.xyxsw.site/boxcnp33Oc3Ia2HzASTZJNOhEWb.png) 这里建议把位置改到其他盘 @@ -46,21 +46,21 @@ 启动后进入 Ubuntu 安装 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn5Uk41JyjjdTzXWQqUkexzc.png) +![](https://cdn.xyxsw.site/boxcn5Uk41JyjjdTzXWQqUkexzc.png) 键盘映射 直接 continue 接下来一路 continue install now -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnLxZnyFN3ohE8zrTwNaCA8e.png) +![](https://cdn.xyxsw.site/boxcnLxZnyFN3ohE8zrTwNaCA8e.png) 最后 restart -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnLguvbHihJ3ngqrtyGLI6zf.png) +![](https://cdn.xyxsw.site/boxcnLguvbHihJ3ngqrtyGLI6zf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnCX92JHjg8PU3quKs4GziZb.png) +![](https://cdn.xyxsw.site/boxcnCX92JHjg8PU3quKs4GziZb.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnL5Jn3g7AdzVzoBb6ZINs1f.png) +![](https://cdn.xyxsw.site/boxcnL5Jn3g7AdzVzoBb6ZINs1f.png) 这个 skip @@ -68,15 +68,15 @@ 点右上角 settings -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn85Yb3JIQ3520KeaSoyPVDd.png) +![](https://cdn.xyxsw.site/boxcn85Yb3JIQ3520KeaSoyPVDd.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnZLHO1JGWoSqhM9zEEhSMAd.png) +![](https://cdn.xyxsw.site/boxcnZLHO1JGWoSqhM9zEEhSMAd.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnvLxCTKYfogPm9GNaKmusEf.png) +![](https://cdn.xyxsw.site/boxcnvLxCTKYfogPm9GNaKmusEf.png) 然后按指引 restart 系统 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn30VJILYpO81pq89mAmzjTf.png) +![](https://cdn.xyxsw.site/boxcn30VJILYpO81pq89mAmzjTf.png) 会提示你要不要重新命名这些用户下的文件夹 @@ -84,27 +84,27 @@ 如果你的语言还没有变过来的话 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnKzJjY8Dvj13A49bnMAztPg.png) +![](https://cdn.xyxsw.site/boxcnKzJjY8Dvj13A49bnMAztPg.png) 点击这个他会安装语言 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndHnAuGC7TXhQgLkpLkHghf.png) +![](https://cdn.xyxsw.site/boxcndHnAuGC7TXhQgLkpLkHghf.png) 把汉语拖到英文之上 点应用到整个系统 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnltCL3atXHtC3BUj5VI1Lqf.png) +![](https://cdn.xyxsw.site/boxcnltCL3atXHtC3BUj5VI1Lqf.png) 右上角 logout 重新登陆 就是中文辣 最后在设置-电源把息屏改成从不 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnLCJzGoFrUbWIMAPGFkxcb.png) +![](https://cdn.xyxsw.site/boxcnnLCJzGoFrUbWIMAPGFkxcb.png) 至此 恭喜安装完成! 之后就可以在桌面上右键 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnG6z1VpAYUGMSkSwDBUxEvf.png) +![](https://cdn.xyxsw.site/boxcnG6z1VpAYUGMSkSwDBUxEvf.png) 打开命令行 diff --git a/3.编程思维体系构建/3.Y.2WSL的安装.md b/3.编程思维体系构建/3.Y.2WSL的安装.md index 3afe3ca..2a8aaed 100644 --- a/3.编程思维体系构建/3.Y.2WSL的安装.md +++ b/3.编程思维体系构建/3.Y.2WSL的安装.md @@ -15,10 +15,10 @@ (现在可能是只开 `适用于Linux的windows子系统`) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnYVkEecWdUs710e8h6G9GTh.png) +![](https://cdn.xyxsw.site/boxcnYVkEecWdUs710e8h6G9GTh.png) 如果你的 windows 版本为家庭版 那么 hyperv 选项是没有的 你需要右键以管理员权限打开以下脚本来强行开启 hyperv -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnoCF5MilDma33yviwRGdDHe.png) +![](https://cdn.xyxsw.site/boxcnoCF5MilDma33yviwRGdDHe.png) diff --git a/3.编程思维体系构建/3.编程思维体系构建.md b/3.编程思维体系构建/3.编程思维体系构建.md index 3fdccb0..58191cb 100644 --- a/3.编程思维体系构建/3.编程思维体系构建.md +++ b/3.编程思维体系构建/3.编程思维体系构建.md @@ -24,7 +24,7 @@ python内容完成后,基本学习到如何使用python当一门工具使用 如果你要开始,推荐你从3.0开始阅读,然后挑选你喜欢的内容 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnOrKXUsIPJAUXyGB3Txewve.png) +![](https://cdn.xyxsw.site/boxcnOrKXUsIPJAUXyGB3Txewve.png) ## 本章参考内容 diff --git a/4.人工智能/4.11从 AI 到 智能系统 —— 从 LLMs 到 Agents.md b/4.人工智能/4.11从 AI 到 智能系统 —— 从 LLMs 到 Agents.md index 437b912..4c538e7 100644 --- a/4.人工智能/4.11从 AI 到 智能系统 —— 从 LLMs 到 Agents.md +++ b/4.人工智能/4.11从 AI 到 智能系统 —— 从 LLMs 到 Agents.md @@ -219,13 +219,13 @@ ICL(In-Context Learning,上下文学习)和 COT(Chain of Thought,思 虽然学界对此没有太大的共识,但其原理无非在于给予 LLMs 更翔实的上下文,让输出与输入有着更紧密的关联与惯性。(从某种意义上来说,也可以将其认为是一种图灵机式的编程) -> ICL:
![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Xjw5bXgRNolw6OxBiEecfOUTn5b.png) +> ICL:
![](https://cdn.xyxsw.site/Xjw5bXgRNolw6OxBiEecfOUTn5b.png) ICL 为输出增加惯性 > 可以简单认为,通过 ICL Prompt,能强化人类输入到机器输出的连贯性,借以提升输出的确定性。
在经过“回答”的 finetune 之前,大模型的原始能力就是基于给定文本进行接龙,而 ICL 的引入则在“回答”这一前提条件下,降低了机器开始接龙这一步骤中的语义跨度,从而使得输出更加可控。
-COT:
![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/NT04baWdNoYzRrxjJFfcXCgbnLh.png) +COT:
![](https://cdn.xyxsw.site/NT04baWdNoYzRrxjJFfcXCgbnLh.png) COT 为输出增加关联 @@ -240,7 +240,7 @@ COT 为输出增加关联 (需要注意的是,TaskMatrix.AI 更大程度上是一个愿景向的调研案例,尚未正式落地生态) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GlM9be7Hvo4EepxQfEOcRvzpnKd.png) +![](https://cdn.xyxsw.site/GlM9be7Hvo4EepxQfEOcRvzpnKd.png) TaskMatrix 的生态愿景 @@ -275,7 +275,7 @@ TaskMatrix 的生态愿景 - Usage Example:API 的调用方法样例 - Composition Instruction:API 的使用贴士,如应该与其它什么 API 组合使用,是否需要手动释放等 -> 样例:打开文件 API
![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/IFWXbgiy8oOj5axvJd8cJu6pnVb.png) +> 样例:打开文件 API
![](https://cdn.xyxsw.site/IFWXbgiy8oOj5axvJd8cJu6pnVb.png) 基于此类文档内容和 ICL 的能力,LLMs 能从输入中习得调用 API 的方法,依此快速拓展了其横向能力 @@ -287,11 +287,11 @@ COT for TaskMatrix 在 TaskMatirx 中,通过该模式,让 MCFM 将任务转化为待办大纲,并最终围绕大纲检索并组合 API,完成整体工作 -> 样例:写论文
构建完成工作大纲
![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GAeJbok1FoTFLixLQAlcxdAPned.png) +> 样例:写论文
构建完成工作大纲
![](https://cdn.xyxsw.site/GAeJbok1FoTFLixLQAlcxdAPned.png) TaskMatrix 自动围绕目标拆解任务 -> 自动调用插件和组件
![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/PUHZbzk7jo5Avuxo1g6cgD9snXg.png) +> 自动调用插件和组件
![](https://cdn.xyxsw.site/PUHZbzk7jo5Avuxo1g6cgD9snXg.png) TaskMatrix 自动为任务创建 API 调用链 @@ -313,7 +313,7 @@ TaskMatrix 自动为任务创建 API 调用链 Decomp 的核心思想为将复杂问题通过 Prompt 技巧,将一个复杂的问题由 LLMs 自主划分为多个子任务。随后,我们通过 LLMs 完成多个任务,并将过程信息最终组合并输出理想的效果 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/X7iLbYOcpoXZy7xuhorc71LSnod.png) +![](https://cdn.xyxsw.site/X7iLbYOcpoXZy7xuhorc71LSnod.png) 几种 Prompt 方法图示 @@ -321,7 +321,7 @@ Decomp 的核心思想为将复杂问题通过 Prompt 技巧,将一个复杂 而对于 Decomp 过程,则又是由一个原始的 Decomp Prompt 驱动 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/A7OubowqYo11O3xn0KbcRoscnEh.png) +![](https://cdn.xyxsw.site/A7OubowqYo11O3xn0KbcRoscnEh.png) Decomp 方法执行样例 @@ -347,7 +347,7 @@ Decomp 的原始功能实际上并不值得太过关注,但我们急需考虑 通过问题的分解和通过“专用函数”的执行,我们可以轻易让 LLMs 实现自身无法做到的调用 API 工作,例如主动从外部检索获取回答问题所需要的知识。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/N1z8bU7dzoD6x1xKtT3cpm9Pnpe.png) +![](https://cdn.xyxsw.site/N1z8bU7dzoD6x1xKtT3cpm9Pnpe.png) Decomp 方法调用外部接口样例 @@ -359,7 +359,7 @@ Decomp 方法调用外部接口样例 [HuggingGPT](https://arxiv.org/abs/2303.17580) 一文也许并未直接参考 Decomp 方法,而是用一些更规范的手法完成该任务,但其充分流水线化的 Prompt 工程无疑是 Decomp 方法在落地实践上的最佳注脚 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Uct8bXhTgocChExgmiWcQTbSnGb.png) +![](https://cdn.xyxsw.site/Uct8bXhTgocChExgmiWcQTbSnGb.png) HuggingGPT @@ -407,7 +407,7 @@ Generative Agents 构建了一套框架,让 NPC 可以感知被模块化的世 - 一方面,其包含场景中既有对象,包括建筑和摆件等的基础层级信息 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/BKZPbpDrIo95amxDZANccwHZnpd.png) +![](https://cdn.xyxsw.site/BKZPbpDrIo95amxDZANccwHZnpd.png) Generative Agents 的场景信息管理 @@ -635,7 +635,7 @@ AutoGPT 主要特性如下: 其提醒我们,就连我们的意识主体性,也只是陈述自我的一个表述器而已。我们是否应当反思对语言能力的过度迷信,从而相信我们能通过训练模型构建 All in One 的智能实体? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ED4qbjSrMoR2sQxJnGEcCtvjn8d.png) +![](https://cdn.xyxsw.site/ED4qbjSrMoR2sQxJnGEcCtvjn8d.png) 全局工作空间理论 @@ -905,7 +905,7 @@ AutoGPT 的核心记忆设计依赖于预包装的 Prompt 本体,这一包装 Generative Agent 通过自动化评估记忆的价值,并构建遗忘系统、关注系统等用于精准从自己繁杂的记忆中检索对于当前情景有用的信息。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/StjCbHn2BoqTrNxF64ScvrPInCe.png) +![](https://cdn.xyxsw.site/StjCbHn2BoqTrNxF64ScvrPInCe.png) Generative Agents :基于 Reflection 构建记忆金字塔 diff --git a/4.人工智能/4.12本章节内容的局限性.md b/4.人工智能/4.12本章节内容的局限性.md index ada5f72..f4f1424 100644 --- a/4.人工智能/4.12本章节内容的局限性.md +++ b/4.人工智能/4.12本章节内容的局限性.md @@ -60,4 +60,4 @@ ZZM 曾经尝试过投入大量时间去钻研数学以及机器学习相关的 联系 ZZM,我努力改 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfYSoVgoERduiWP0jWNWMxf.jpg) +![](https://cdn.xyxsw.site/boxcnfYSoVgoERduiWP0jWNWMxf.jpg) diff --git a/4.人工智能/4.1前言.md b/4.人工智能/4.1前言.md index fc05421..f8a429c 100644 --- a/4.人工智能/4.1前言.md +++ b/4.人工智能/4.1前言.md @@ -13,7 +13,7 @@ 计算机视觉旨在用计算机模拟人类处理图片信息的能力,就比如这里有一张图片——手写数字 9 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnvQiaAx6WgPx64s8fBklVwh.png) +![](https://cdn.xyxsw.site/boxcnvQiaAx6WgPx64s8fBklVwh.png) 对我们人类而言,能够很轻松地知道这张图片中包含的信息(数字 9),而对计算机来说这只是一堆像素。计算机视觉的任务就是让计算机能够从这堆像素中得到‘数字 9’这个信息。 @@ -21,15 +21,15 @@ 图像分割是在图片中对物体分类,并且把它们所对应的位置标示出来。下图就是把人的五官,面部皮肤和头发分割出来,效(小)果(丑)图如下: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxn5GlJZmsrMV5qKNwMlDPc.jpg) +![](https://cdn.xyxsw.site/boxcnxn5GlJZmsrMV5qKNwMlDPc.jpg) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnokdWGegr2XCi1vfg0ZZiWg.png) +![](https://cdn.xyxsw.site/boxcnokdWGegr2XCi1vfg0ZZiWg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn2o9ilOZg6jI6ssTYWhoeme.png) +![](https://cdn.xyxsw.site/boxcn2o9ilOZg6jI6ssTYWhoeme.png) 图像生成相信大家一定不陌生,NovalAI 在 2022 年火的一塌糊涂,我觉得不需要我过多赘述,对它(Diffusion model)的改进工作也是层出不穷,这里就放一张由可控姿势网络(ControlNet)生成的图片吧: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnUjnRociXua1yKj6dmU1A3c.png) +![](https://cdn.xyxsw.site/boxcnUjnRociXua1yKj6dmU1A3c.png) 三维重建也是很多研究者关注的方向,指的是传入对同一物体不同视角的照片,来生成 3D 建模的任务。这方面比图像处理更加前沿并且难度更大。具体见[4.6.5.4神经辐射场(NeRF)](4.6.5.4%E7%A5%9E%E7%BB%8F%E8%BE%90%E5%B0%84%E5%9C%BA(NeRF).md) 章节。 @@ -39,9 +39,9 @@ 这就更好理解了,让计算机能够像人类一样,理解文本中的“真正含义”。在计算机眼中,文本就是单纯的字符串,NLP 的工作就是把字符转换为计算机可理解的数据。举个例子,ChatGPT(或者 New Bing)都是 NLP 的成果。在过去,NLP 领域被细分为了多个小任务,比如文本情感分析、关键段落提取等。而 ChatGPT 的出现可以说是集几乎所有小任务于大成,接下来 NLP 方向的工作会向 ChatGPT 的方向靠近。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnyh6pakAkcxCKq6pLylSdef.png) +![](https://cdn.xyxsw.site/boxcnyh6pakAkcxCKq6pLylSdef.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnwWnoEDulgWdqGkY0WeYogc.png) +![](https://cdn.xyxsw.site/boxcnwWnoEDulgWdqGkY0WeYogc.png) ## 多模态(跨越模态的处理) @@ -53,7 +53,7 @@ 具体的任务比如说图片问答,传入一张图片,问 AI 这张图片里面有几只猫猫,它们是什么颜色,它告诉我有一只猫猫,是橙色的: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnrMvM1THshjXXOuh8WXi2zr.jpg) +![](https://cdn.xyxsw.site/boxcnrMvM1THshjXXOuh8WXi2zr.jpg) ## 对比学习 diff --git a/4.人工智能/4.2机器学习(AI)快速入门(quick start).md b/4.人工智能/4.2机器学习(AI)快速入门(quick start).md index 77eb764..8b488fb 100644 --- a/4.人工智能/4.2机器学习(AI)快速入门(quick start).md +++ b/4.人工智能/4.2机器学习(AI)快速入门(quick start).md @@ -26,7 +26,7 @@ 甚至深度学习,也只是机器学习的一部分,不过使用了更多技巧和方法,增大了计算能力罢了。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbtaUStj8coQiNTmZzfWqNl.png) +![](https://cdn.xyxsw.site/boxcnbtaUStj8coQiNTmZzfWqNl.png) # 两种机器学习算法 @@ -42,11 +42,11 @@ 近三个月来,每当你的城市里有人卖了房子,你都记录了下面的细节——卧室数量、房屋大小、地段等等。但最重要的是,你写下了最终的成交价: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnL1MNHqAyDjcxIzjFTOdYtt.png) +![](https://cdn.xyxsw.site/boxcnL1MNHqAyDjcxIzjFTOdYtt.png) 然后你让新人根据着你的成交价来估计新的数量 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnwcDWIDvLnuvZ1uOb75QKPh.png) +![](https://cdn.xyxsw.site/boxcnwcDWIDvLnuvZ1uOb75QKPh.png) 这就是监督学习,你有一个参照物可以帮你决策。 @@ -66,7 +66,7 @@ 这其实就是一种经典的聚类算法 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnSn17EC3YvEnA6GScKNAF3e.png) +![](https://cdn.xyxsw.site/boxcnSn17EC3YvEnA6GScKNAF3e.png) 可以把特征不一样的数据分开,有非常多的操作,你感兴趣可以选择性的去了解一下。 @@ -139,7 +139,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 第二步把每个数值都带入进行运算。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniDICYiLh7ddcxEVrHxFODe.png) +![](https://cdn.xyxsw.site/boxcniDICYiLh7ddcxEVrHxFODe.png) 比如说,如果第一套房产实际成交价为 25 万美元,你的函数估价为 17.8 万美元,这一套房产你就差了 7.2 万。 @@ -168,13 +168,13 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 为了避免这种情况,数学家们找到了很多种[聪明的办法](https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Gradient_descent)来快速找到优秀的权重值。下面是一种: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXkjzipUjgJpFYXaEhbEN8e.png) +![](https://cdn.xyxsw.site/boxcnXkjzipUjgJpFYXaEhbEN8e.png) 这就是被称为 loss 函数的东西。 这是个专业属于,你可以选择性忽略他,我们将它改写一下 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXbd7bqnqPwF8f1Up8rHq5e.png) +![](https://cdn.xyxsw.site/boxcnXbd7bqnqPwF8f1Up8rHq5e.png) θ 表示当前的权重值。 J(θ) 表示「当前权重的代价」。 @@ -182,7 +182,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 如果我们为这个等式中所有卧室数和面积的可能权重值作图的话,我们会得到类似下图的图表: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniBPPpszGhbOWGpvto38Alf.png) +![](https://cdn.xyxsw.site/boxcniBPPpszGhbOWGpvto38Alf.png) 因此,我们需要做的只是调整我们的权重,使得我们在图上朝着最低点「走下坡路」。如果我们不断微调权重,一直向最低点移动,那么我们最终不用尝试太多权重就可以到达那里。 @@ -194,7 +194,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 当你使用一个机器学习算法库来解决实际问题时,这些都已经为你准备好了。但清楚背后的原理依然是有用的。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn2xlALHL53uUMXSHjloWiOe.jpg) +![](https://cdn.xyxsw.site/boxcn2xlALHL53uUMXSHjloWiOe.jpg) 枚举法 @@ -225,7 +225,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 我们换一个好看的形式给他展示 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhbR6lGSXd6UAEpRvSIYSHg.png) +![](https://cdn.xyxsw.site/boxcnhbR6lGSXd6UAEpRvSIYSHg.png) 箭头头表示了函数中的权重。 @@ -233,17 +233,17 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): 所以为了更加的智能化,我们可以利用不同的权重来多次运行这个算法,收集各种不同情况下的估价。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnpDPWKnB6x4fQmGpyvLQJLf.png) +![](https://cdn.xyxsw.site/boxcnpDPWKnB6x4fQmGpyvLQJLf.png) 然后我们把四种整合到一起,就得到一个超级答案 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnplbH8Ot0U6cuLHStDmXyze.png) +![](https://cdn.xyxsw.site/boxcnplbH8Ot0U6cuLHStDmXyze.png) 这样我们相当于得到了更为准确的答案 # 神经网络是什么 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhLjMMdts91f8gcpgSVE8Ed.png) +![](https://cdn.xyxsw.site/boxcnhLjMMdts91f8gcpgSVE8Ed.png) 我们把四个超级网络的结合图整体画出来,其实这就是个超级简单的神经网络,虽然我们省略了很多的内容,但是他仍然有了一定的拟合能力 @@ -318,17 +318,17 @@ print('y_pred=',y_test.data) 我们试着只识别一个数字 8 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnOvoCMEuaMIpKZkfoFLDitf.png) +![](https://cdn.xyxsw.site/boxcnOvoCMEuaMIpKZkfoFLDitf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnZQnrltieoJ93DT79pyX45e.png) +![](https://cdn.xyxsw.site/boxcnZQnrltieoJ93DT79pyX45e.png) 我们把一幅 18×18 像素的图片当成一串含有 324 个数字的数组,就可以把它输入到我们的神经网络里面了: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnZ6bzfOUDQgPAJrKI7Pp3Yc.png) +![](https://cdn.xyxsw.site/boxcnZ6bzfOUDQgPAJrKI7Pp3Yc.png) 为了更好地操控我们的输入数据,我们把神经网络的输入节点扩大到 324 个: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnha4DXsSfAUIYbCQqAx6QKd.png) +![](https://cdn.xyxsw.site/boxcnha4DXsSfAUIYbCQqAx6QKd.png) 请注意,我们的神经网络现在有了两个输出(而不仅仅是一个房子的价格)。第一个输出会预测图片是「8」的概率,而第二个则输出不是「8」的概率。概括地说,我们就可以依靠多种不同的输出,利用神经网络把要识别的物品进行分组。 @@ -349,7 +349,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 当数字并不是正好在图片中央的时候,我们的识别器就完全不工作了。一点点的位移我们的识别器就掀桌子不干了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnShOBEoOhsJLR6L5xyr7INb.png) +![](https://cdn.xyxsw.site/boxcnShOBEoOhsJLR6L5xyr7INb.png) 这是因为我们的网络只学习到了正中央的「8」。它并不知道那些偏离中心的「8」长什么样子。它仅仅知道中间是「8」的图片规律。 @@ -365,9 +365,9 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 当然,你同时也需要更强的拟合能力和更深的网络。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnLwoxR6OC3ZBxqtMcKg4v6b.png) +![](https://cdn.xyxsw.site/boxcnLwoxR6OC3ZBxqtMcKg4v6b.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnIcHcRF34F6jJgTRvhyAevc.png) +![](https://cdn.xyxsw.site/boxcnIcHcRF34F6jJgTRvhyAevc.png) 一层一层堆叠起来,这种方法很早就出现了。 @@ -377,7 +377,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 作为人类,你能够直观地感知到图片中存在某种层级(hierarchy)或者是概念结构(conceptual structure)。比如说,你在看 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndjXp5ayczwemklMk9ZA3ig.jpg) +![](https://cdn.xyxsw.site/boxcndjXp5ayczwemklMk9ZA3ig.jpg) 你会快速的辨认出一匹马,一个人。 @@ -387,7 +387,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 有人对此做过研究,人的眼睛可能会逐步判断一个物体的信息,比如说你看到一张图片,你会先看颜色,然后看纹理然后再看整体,那么我们需要一种操作来模拟这个过程,我们管这种操作叫卷积操作。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnsm0cJGKqt0AU8Kv3K3rkKg.png) +![](https://cdn.xyxsw.site/boxcnsm0cJGKqt0AU8Kv3K3rkKg.png) ## 卷积是如何工作的 @@ -395,13 +395,13 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 当然也有最新研究说卷积不具备平移不变性,但是我这里使用这个概念是为了大伙更好的理解,举个例子:你将 8 无论放在左上角还是左下角都改变不了他是 8 的事实 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHo4tt4wmnC7sUykRPPLKmm.png) +![](https://cdn.xyxsw.site/boxcnHo4tt4wmnC7sUykRPPLKmm.png) 我们将一张图像分成这么多个小块,然后输入神经网络中的是一个小块。每次判断一张小图块。 然而,有一个非常重要的不同:对于每个小图块,我们会使用同样的神经网络权重。换一句话来说,我们平等对待每一个小图块。如果哪个小图块有任何异常出现,我们就认为这个图块是「异常」 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnCxlvaanbzweMmeCOsp1xKf.png) +![](https://cdn.xyxsw.site/boxcnCxlvaanbzweMmeCOsp1xKf.png) 换一句话来说,我们从一整张图片开始,最后得到一个稍小一点的数组,里面存储着我们图片中的哪一部分有异常。 @@ -413,7 +413,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 让我们先来看每个 2×2 的方阵数组,并且留下最大的数: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnquKepO4wJ74KfNIy3LtqVg.png) +![](https://cdn.xyxsw.site/boxcnquKepO4wJ74KfNIy3LtqVg.png) 每一波我们只保留一个数,这样就大大减少了图片的计算量了。 @@ -435,7 +435,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东 你猜怎么着?数组就是一串数字而已,所以我们我们可以把这个数组输入到另外一个神经网络里面去。最后的这个神经网络会决定这个图片是否匹配。为了区分它和卷积的不同,我们把它称作「全连接」网络 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnDqrUZwXHzgmLR6yvbYSgsV.png) +![](https://cdn.xyxsw.site/boxcnDqrUZwXHzgmLR6yvbYSgsV.png) 我们的图片处理管道是一系列的步骤:卷积、最大池化,还有最后的「全连接」网络。 diff --git a/4.人工智能/4.3.1.1程序示例——maze迷宫解搜索.md b/4.人工智能/4.3.1.1程序示例——maze迷宫解搜索.md index d3c0838..2afd41e 100644 --- a/4.人工智能/4.3.1.1程序示例——maze迷宫解搜索.md +++ b/4.人工智能/4.3.1.1程序示例——maze迷宫解搜索.md @@ -5,7 +5,7 @@ ::: ::: tip 📥 -本节附件下载 +本节附件下载 ::: /4.人工智能/code/MAZE.zip @@ -176,7 +176,7 @@ class Maze: 5. 两种算法总是能找到相同长度的路径 2. 下面的问题将问你关于下面迷宫的问题。灰色单元格表示墙壁。在这个迷宫上运行了一个搜索算法,找到了从 A 点到 B 点的黄色突出显示的路径。在这样做的过程中,红色突出显示的细胞是探索的状态,但并没有达到目标。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MKtXbfJW3ocWT3xSMK0cwVc4nWf.png) + ![](https://cdn.xyxsw.site/MKtXbfJW3ocWT3xSMK0cwVc4nWf.png) 在讲座中讨论的四种搜索算法中——深度优先搜索、广度优先搜索、曼哈顿距离启发式贪婪最佳优先搜索和曼哈顿距离启发式$A^*$ @@ -196,7 +196,7 @@ class Maze: 4. 深度限制的极小极大值永远不会比没有深度限制的极大极小值更可取 4. 下面的问题将询问您关于下面的 Minimax 树,其中绿色向上箭头表示 MAX 玩家,红色向下箭头表示 MIN 玩家。每个叶节点都标有其值。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/UVssbyMxCoEQSuxvjh3caWAFnOb.png) +![](https://cdn.xyxsw.site/UVssbyMxCoEQSuxvjh3caWAFnOb.png) 根节点的值是多少? diff --git a/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md b/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md index 422ad9a..ded373a 100644 --- a/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md +++ b/4.人工智能/4.3.1.2项目:Tic-Tac-Toe井字棋.md @@ -5,7 +5,7 @@ 如果你卡住了,请记得回来阅读文档,或请求身边人的帮助。 ::: tip 📥 -本节附件下载 +本节附件下载 ::: `pip3 install -r requirements.txt` diff --git a/4.人工智能/4.3.1搜索.md b/4.人工智能/4.3.1搜索.md index de60c51..d3e27a5 100644 --- a/4.人工智能/4.3.1搜索.md +++ b/4.人工智能/4.3.1搜索.md @@ -18,13 +18,13 @@ 导航是使用搜索算法的一个典型的搜索,它接收您的当前位置和目的地作为输入,并根据搜索算法返回建议的路径。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Hesobke0ZocH48xGFyocf9Cxntd.png) +![](https://cdn.xyxsw.site/Hesobke0ZocH48xGFyocf9Cxntd.png) 在计算机科学中,还有许多其他形式的搜索问题,比如谜题或迷宫。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/SYw4bOzqAo65PQxZQLucbZAxnHd.png) +![](https://cdn.xyxsw.site/SYw4bOzqAo65PQxZQLucbZAxnHd.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/LPgEbVQg2oZBSexmGWwcwfbdnVd.png) +![](https://cdn.xyxsw.site/LPgEbVQg2oZBSexmGWwcwfbdnVd.png) # 举个例子 @@ -42,14 +42,14 @@ - 搜索算法开始的状态。在导航应用程序中,这将是当前位置。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HCxXbwKFyof6DFx6FZ8c5EHknBh.png) +![](https://cdn.xyxsw.site/HCxXbwKFyof6DFx6FZ8c5EHknBh.png) - 动作(Action) - 一个状态可以做出的选择。更确切地说,动作可以定义为一个函数。当接收到状态$s$作为输入时,$Actions(s)$将返回可在状态$s$ 中执行的一组操作作为输出。 - 例如,在一个数字华容道中,给定状态的操作是您可以在当前配置中滑动方块的方式。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MpgrbCjtDo1NlLxVyL1cMH6FnAg.png) +![](https://cdn.xyxsw.site/MpgrbCjtDo1NlLxVyL1cMH6FnAg.png) - 过渡模型(Transition Model) @@ -58,14 +58,14 @@ - 在接收到状态$s$和动作$a$作为输入时,$Results(s,a)$返回在状态$s$中执行动作$a$ 所产生的状态。 - 例如,给定数字华容道的特定配置(状态$s$),在任何方向上移动正方形(动作$a$)将导致谜题的新配置(新状态)。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/RKV2buJoroCV6SxiMUuct3dbnPU.png) +![](https://cdn.xyxsw.site/RKV2buJoroCV6SxiMUuct3dbnPU.png) - 状态空间(State Space) - 通过一系列的操作目标从初始状态可达到的所有状态的集合。 - 例如,在一个数字华容道谜题中,状态空间由所有$\frac{16!}{2}$种配置,可以从任何初始状态达到。状态空间可以可视化为有向图,其中状态表示为节点,动作表示为节点之间的箭头。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/JdCqb2UI9ooWmdxk258cTIIznab.png) +![](https://cdn.xyxsw.site/JdCqb2UI9ooWmdxk258cTIIznab.png) - 目标测试(Goal Test) @@ -112,9 +112,9 @@ - 展开节点(找到可以从该节点到达的所有新节点),并将生成的节点添加到边域。 - 将当前节点添加到探索集。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/K53FbGmswoM7JAxqJZxcQEjdnES.png) +![](https://cdn.xyxsw.site/K53FbGmswoM7JAxqJZxcQEjdnES.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/THhpbemEHoxl80xHeTjc9d35nVh.png) +![](https://cdn.xyxsw.site/THhpbemEHoxl80xHeTjc9d35nVh.png) 边域从节点 A 初始化开始 @@ -122,9 +122,9 @@ a. 取出边域中的节点 A,展开节点 A,将节点 B 添加到边域。 b. 取出节点 B,展开,添加...... c. 到达目标节点,停止,返回解决方案 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/XmnObIGaUoF4ssxkgzUc4vTUnmf.png) +![](https://cdn.xyxsw.site/XmnObIGaUoF4ssxkgzUc4vTUnmf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Wsntb9rLwogdAKxpJgLchrI8nae.png) +![](https://cdn.xyxsw.site/Wsntb9rLwogdAKxpJgLchrI8nae.png) 会出现什么问题?节点 A-> 节点 B-> 节点 A->......-> 节点 A。我们需要一个探索集,记录已搜索的节点! @@ -143,13 +143,13 @@ c. 到达目标节点,停止,返回解决方案 - 所找到的解决方案可能不是最优的。 - 在最坏的情况下,该算法将在找到解决方案之前探索每一条可能的路径,从而在到达解决方案之前花费尽可能长的时间。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/SGVWbCcTlobQwJxSjKvcNyJAnEG.png) +![](https://cdn.xyxsw.site/SGVWbCcTlobQwJxSjKvcNyJAnEG.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Vv9Sb26QfoMrkqx5apycIYPJnlf.png) +![](https://cdn.xyxsw.site/Vv9Sb26QfoMrkqx5apycIYPJnlf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Gjd5bpdpcoIxGtxcUJ0c2OVfnOf.png) +![](https://cdn.xyxsw.site/Gjd5bpdpcoIxGtxcUJ0c2OVfnOf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/M2vZbA5hpoT9RExuAGwcBHF1nmh.png) +![](https://cdn.xyxsw.site/M2vZbA5hpoT9RExuAGwcBHF1nmh.png) - 代码实现 @@ -175,13 +175,13 @@ def remove(self): - 几乎可以保证该算法的运行时间会比最短时间更长。 - 在最坏的情况下,这种算法需要尽可能长的时间才能运行。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/S6SRbMUrcoYQCYxZGgJczkdcnBP.png) +![](https://cdn.xyxsw.site/S6SRbMUrcoYQCYxZGgJczkdcnBP.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Xg7Qbv59IoQB3bxPFO1ceXgRnkf.png) +![](https://cdn.xyxsw.site/Xg7Qbv59IoQB3bxPFO1ceXgRnkf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/X34Rb5R7AonUg3xYs7DcQzSfndg.png) +![](https://cdn.xyxsw.site/X34Rb5R7AonUg3xYs7DcQzSfndg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/PQeZbJv3Bom6NYxa6lccT084nFn.png) +![](https://cdn.xyxsw.site/PQeZbJv3Bom6NYxa6lccT084nFn.png) - 代码实现 @@ -202,13 +202,13 @@ def remove(self): - 贪婪最佳优先搜索扩展最接近目标的节点,如启发式函数$h(n)$所确定的。顾名思义,该函数估计下一个节点离目标有多近,但可能会出错。贪婪最佳优先算法的效率取决于启发式函数的好坏。例如,在迷宫中,算法可以使用启发式函数,该函数依赖于可能节点和迷宫末端之间的曼哈顿距离。曼哈顿距离忽略了墙壁,并计算了从一个位置到目标位置需要向上、向下或向两侧走多少步。这是一个简单的估计,可以基于当前位置和目标位置的$(x,y)$坐标导出。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Pe3WbBuTjomWjfxd5Ryc3OPPnSd.png) +![](https://cdn.xyxsw.site/Pe3WbBuTjomWjfxd5Ryc3OPPnSd.png) - 然而,重要的是要强调,与任何启发式算法一样,它可能会出错,并导致算法走上比其他情况下更慢的道路。不知情的搜索算法有可能更快地提供一个更好的解决方案,但它比知情算法更不可能这样。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HkvdbcEdmo6RtjxOqqic31XFnSh.png) +![](https://cdn.xyxsw.site/HkvdbcEdmo6RtjxOqqic31XFnSh.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/SU2DbQeN2oxs5ex3K3NcMaJfnch.png) +![](https://cdn.xyxsw.site/SU2DbQeN2oxs5ex3K3NcMaJfnch.png) - $A^*$搜索 @@ -220,9 +220,9 @@ def remove(self): - 一致性,这意味着从新节点到目标的估计路径成本加上从先前节点转换到该新节点的成本应该大于或等于先前节点到目标的估计路径成本。用方程的形式表示,$h(n)$是一致的,如果对于每个节点n$和后续节点n'$,从n$到$n'$的步长为c$,满足$h(n)≤h(n')+c$。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/BbIiba1pwo3uI7x4k7QcwicznGc.png) +![](https://cdn.xyxsw.site/BbIiba1pwo3uI7x4k7QcwicznGc.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HhG9bcJP2okKMMxY0FGclP0AnXY.png) +![](https://cdn.xyxsw.site/HhG9bcJP2okKMMxY0FGclP0AnXY.png) # 对抗性搜索 @@ -232,41 +232,41 @@ def remove(self): - 作为对抗性搜索中的一种算法,Minimax 将获胜条件表示为$(-1)$表示为一方,$(+1)$表示为另一方。进一步的行动将受到这些条件的驱动,最小化的一方试图获得最低分数,而最大化的一方则试图获得最高分数。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FYu3bQwCZofBgsxKDJiciTR7nzc.png) + ![](https://cdn.xyxsw.site/FYu3bQwCZofBgsxKDJiciTR7nzc.png) - 井字棋 AI 为例 - $s_0$: 初始状态(在我们的情况下,是一个空的3X3棋盘) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/WstnbmHwYoQauRxUQOCclz8Jngb.png) + ![](https://cdn.xyxsw.site/WstnbmHwYoQauRxUQOCclz8Jngb.png) - $Players(s)$: 一个函数,在给定状态$$s$$的情况下,返回轮到哪个玩家(X或O)。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/DKzTbJSZMoc1UkxT9KOcIHqvnob.png) + ![](https://cdn.xyxsw.site/DKzTbJSZMoc1UkxT9KOcIHqvnob.png) - $Actions(s)$: 一个函数,在给定状态$$s$$的情况下,返回该状态下的所有合法动作(棋盘上哪些位置是空的)。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/LuEzbLOaqox7yox5lXzcouWYnKc.png) + ![](https://cdn.xyxsw.site/LuEzbLOaqox7yox5lXzcouWYnKc.png) - $Result(s, a)$: 一个函数,在给定状态$$s$$和操作$$a$$的情况下,返回一个新状态。这是在状态$$s$$上执行动作$$a$$(在游戏中移动)所产生的棋盘。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/AdOVbwCGhoVcWVx21TMcdhbDnIg.png) + ![](https://cdn.xyxsw.site/AdOVbwCGhoVcWVx21TMcdhbDnIg.png) - $Terminal(s)$: 一个函数,在给定状态$$s$$的情况下,检查这是否是游戏的最后一步,即是否有人赢了或打成平手。如果游戏已结束,则返回True,否则返回False。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/EOfJbvoUMogVT8xsrTxcl5ugnrk.png) + ![](https://cdn.xyxsw.site/EOfJbvoUMogVT8xsrTxcl5ugnrk.png) - $Utility(s)$: 一个函数,在给定终端状态s的情况下,返回状态的效用值:$$-1、0或1$$。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/UcpAbpWtJoHb5Wx6ycrcG2ZZnIe.png) +![](https://cdn.xyxsw.site/UcpAbpWtJoHb5Wx6ycrcG2ZZnIe.png) - 算法的工作原理: - 该算法递归地模拟从当前状态开始直到达到终端状态为止可能发生的所有游戏状态。每个终端状态的值为$(-1)$、$0$或$(+1)$。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/DN3mb0lbno2AHvx2M0JcrTvtnYf.png) +![](https://cdn.xyxsw.site/DN3mb0lbno2AHvx2M0JcrTvtnYf.png) - 根据轮到谁的状态,算法可以知道当前玩家在最佳游戏时是否会选择导致状态值更低或更高的动作。 @@ -278,7 +278,7 @@ def remove(self): 在得到这些值之后,最大化的玩家会选择最高的一个。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/EjB9bzgZNohQtkxXwXgcVrKwnth.png) +![](https://cdn.xyxsw.site/EjB9bzgZNohQtkxXwXgcVrKwnth.png) - 具体算法: @@ -310,7 +310,7 @@ def remove(self): - 这一点最容易用一个例子来说明:最大化的玩家知道,在下一步,最小化的玩家将试图获得最低分数。假设最大化玩家有三个可能的动作,第一个动作的值为4。然后玩家开始为下一个动作生成值。要做到这一点,如果当前玩家做出这个动作,玩家会生成最小化者动作的值,并且知道最小化者会选择最低的一个。然而,在完成最小化器所有可能动作的计算之前,玩家会看到其中一个选项的值为3。这意味着没有理由继续探索最小化玩家的其他可能行动。尚未赋值的动作的值无关紧要,无论是10还是(-10)。如果该值为10,则最小化器将选择最低选项3,该选项已经比预先设定的4差。如果尚未估价的行动结果是(-10),那么最小化者将选择(-10)这一选项,这对最大化者来说更加不利。因此,在这一点上为最小化者计算额外的可能动作与最大化者无关,因为最大化玩家已经有了一个明确的更好的选择,其值为4。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/LDZab4TeMoByvDxF1Onc8WQenpb.png) +![](https://cdn.xyxsw.site/LDZab4TeMoByvDxF1Onc8WQenpb.png) - 深度限制的极大极小算法(Depth-Limited Minimax) diff --git a/4.人工智能/4.3.2.1程序示例——命题逻辑与模型检测.md b/4.人工智能/4.3.2.1程序示例——命题逻辑与模型检测.md index db1d8ef..e56c0e9 100644 --- a/4.人工智能/4.3.2.1程序示例——命题逻辑与模型检测.md +++ b/4.人工智能/4.3.2.1程序示例——命题逻辑与模型检测.md @@ -6,7 +6,7 @@ ::: ::: tip 📥 -本节附件下载 +本节附件下载 ::: # Sentence——父类 @@ -315,15 +315,15 @@ check_knowledge(knowledge) 在这个游戏中,玩家一按照一定的顺序排列颜色,然后玩家二必须猜测这个顺序。每一轮,玩家二进行猜测,玩家一返回一个数字,指示玩家二正确选择了多少颜色。让我们用四种颜色模拟一个游戏。假设玩家二猜测以下顺序: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FZCJbOzr9o4oQPx7SNGcFxTSnRd.png) +![](https://cdn.xyxsw.site/FZCJbOzr9o4oQPx7SNGcFxTSnRd.png) 玩家一回答“二”。因此,我们知道其中一些两种颜色位于正确的位置,而另两种颜色则位于错误的位置。根据这些信息,玩家二试图切换两种颜色的位置。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Y80wbn96sol7PUxO5fKcOA9Hnbg.png) +![](https://cdn.xyxsw.site/Y80wbn96sol7PUxO5fKcOA9Hnbg.png) 现在玩家一回答“零”。因此,玩家二知道切换后的颜色最初位于正确的位置,这意味着未被切换的两种颜色位于错误的位置。玩家二切换它们。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/EuXObldHcoaO74xIzZocQQKTn4k.png) +![](https://cdn.xyxsw.site/EuXObldHcoaO74xIzZocQQKTn4k.png) 在命题逻辑中表示这一点需要我们有(颜色的数量)$^2$个原子命题。所以,在四种颜色的情况下,我们会有命题 red0,red1,red2,red3,blue0…代表颜色和位置。下一步是用命题逻辑表示游戏规则(每个位置只有一种颜色,没有颜色重复),并将它们添加到知识库中。最后一步是将我们所拥有的所有线索添加到知识库中。在我们的案例中,我们会补充说,在第一次猜测中,两个位置是错误的,两个是正确的,而在第二次猜测中没有一个是对的。利用这些知识,模型检查算法可以为我们提供难题的解决方案。 diff --git a/4.人工智能/4.3.2.2项目:扫雷,骑士与流氓问题.md b/4.人工智能/4.3.2.2项目:扫雷,骑士与流氓问题.md index 7b0c716..642cdbd 100644 --- a/4.人工智能/4.3.2.2项目:扫雷,骑士与流氓问题.md +++ b/4.人工智能/4.3.2.2项目:扫雷,骑士与流氓问题.md @@ -5,7 +5,7 @@ 如果你卡住了,请记得回来阅读文档,或请求身边人的帮助。 ::: tip 📥 -本节附件下载 +本节附件下载 ::: `pip3 install -r requirements.txt` @@ -75,7 +75,7 @@ C 说:“A 是骑士。” 写一个 AI 来玩扫雷游戏。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/CQmGb6QTjoeyVCx9vjncYF2QnQe.png) +![](https://cdn.xyxsw.site/CQmGb6QTjoeyVCx9vjncYF2QnQe.png) ## 背景 @@ -84,7 +84,7 @@ C 说:“A 是骑士。” - 扫雷器是一款益智游戏,由一个单元格网格组成,其中一些单元格包含隐藏的“地雷”。点击包含地雷的单元格会引爆地雷,导致用户输掉游戏。单击“安全”单元格(即不包含地雷的单元格)会显示一个数字,指示有多少相邻单元格包含地雷,其中相邻单元格是指从给定单元格向左、向右、向上、向下或对角线一个正方形的单元格。 - 例如,在这个 3x3 扫雷游戏中,三个 1 值表示这些单元格中的每个单元格都有一个相邻的单元格,该单元格是地雷。四个 0 值表示这些单元中的每一个都没有相邻的地雷。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/BcfWbqCNKoXpTHxPQVqczsvcnBd.png) +![](https://cdn.xyxsw.site/BcfWbqCNKoXpTHxPQVqczsvcnBd.png) - 给定这些信息,玩家根据逻辑可以得出结论,右下角单元格中一定有地雷,左上角单元格中没有地雷,因为只有在这种情况下,其他单元格上的数字标签才会准确。 - 游戏的目标是标记(即识别)每个地雷。在游戏的许多实现中,包括本项目中的实现中,玩家可以通过右键单击单元格(或左键双击,具体取决于计算机)来标记地雷。 @@ -94,7 +94,7 @@ C 说:“A 是骑士。” - 你在这个项目中的目标是建立一个可以玩扫雷游戏的人工智能。回想一下,基于知识的智能主体通过考虑他们的知识库来做出决策,并根据这些知识做出推断。 - 我们可以表示人工智能关于扫雷游戏的知识的一种方法是,使每个单元格成为命题变量,如果单元格包含地雷,则为真,否则为假。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/IROdbJ4zAooiWNxitU9cRovbnne.png) +![](https://cdn.xyxsw.site/IROdbJ4zAooiWNxitU9cRovbnne.png) - 我们现在掌握了什么信息?我们现在知道八个相邻的单元格中有一个是地雷。因此,我们可以写一个逻辑表达式,如下所示,表示其中一个相邻的单元格是地雷。 - `Or(A,B,C,D,E,F,G,H)` @@ -128,12 +128,12 @@ Or( - 这种表示法中的每个逻辑命题都有两个部分:一个是网格中与提示数字有关的一组单元格 `cell`,另一个是数字计数 `count`,表示这些单元格中有多少是地雷。上面的逻辑命题说,在单元格 A、B、C、D、E、F、G 和 H 中,正好有 1 个是地雷。 - 为什么这是一个有用的表示?在某种程度上,它很适合某些类型的推理。考虑下面的游戏。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/UiHObqm4noSOKlxcEtScuwPlnLd.png) +![](https://cdn.xyxsw.site/UiHObqm4noSOKlxcEtScuwPlnLd.png) - 利用左下数的知识,我们可以构造命题 `{D,E,G}=0`,意思是在 D、E 和 G 单元中,正好有 0 个是地雷。凭直觉,我们可以从这句话中推断出所有的单元格都必须是安全的。通过推理,每当我们有一个 `count` 为 0 的命题时,我们就知道该命题的所有 `cell` 都必须是安全的。 - 同样,考虑下面的游戏。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/VSbubz9JYo7H8XxgSbCcmMQHniK.png) +![](https://cdn.xyxsw.site/VSbubz9JYo7H8XxgSbCcmMQHniK.png) - 我们的人工智能会构建命题 `{E,F,H}=3`。凭直觉,我们可以推断出所有的 E、F 和 H 都是地雷。更一般地说,任何时候 `cell` 的数量等于 `count`,我们都知道这个命题的所有单元格都必须是地雷。 - 一般来说,我们只希望我们的命题是关于那些还不知道是安全的还是地雷的 `cell`。这意味着,一旦我们知道一个单元格是否是地雷,我们就可以更新我们的知识库来简化它们,并可能得出新的结论。 @@ -141,7 +141,7 @@ Or( - 同样,如果我们的人工智能知道命题 `{A,B,C}=2`,并且我们被告知 C 是一颗地雷,我们可以从命题中删除 C,并减少计数的值(因为 C 是导致该计数的地雷),从而得到命题 `{A、B}=1`。这是合乎逻辑的:如果 A、B 和 C 中有两个是地雷,并且我们知道 C 是地雷,那么 A 和 B 中一定有一个是地雷。 - 如果我们更聪明,我们可以做最后一种推理。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GsxxbeoPzoOZn4xSUaecVzKNnBc.png) +![](https://cdn.xyxsw.site/GsxxbeoPzoOZn4xSUaecVzKNnBc.png) - 考虑一下我们的人工智能根据中间顶部单元格和中间底部单元格会知道的两个命题。从中上角的单元格中,我们得到 `{A,B,C}=1`。从底部中间单元格中,我们得到 `{A,B,C,D,E}=2`。从逻辑上讲,我们可以推断出一个新的知识,即 `{D,E}=1`。毕竟,如果 A、B、C、D 和 E 中有两个是地雷,而 A、B 和 C 中只有一个是地雷的话,那么 D 和 E 必须是另一个地雷。 - 更一般地说,任何时候我们有两个命题满足 `set1=count1` 和 `set2=count2`,其中 `set1` 是 `set2` 的子集,那么我们可以构造新的命题 `set2-set1=count2-count1`。考虑上面的例子,以确保你理解为什么这是真的。 diff --git a/4.人工智能/4.3.2知识推理.md b/4.人工智能/4.3.2知识推理.md index 93b3329..14b02ea 100644 --- a/4.人工智能/4.3.2知识推理.md +++ b/4.人工智能/4.3.2知识推理.md @@ -112,7 +112,7 @@ - $KB$: 如果今天是星期四并且不下雨,那我将出门跑步;今天是星期四;今天不下雨。$(P\land\lnot Q)\to R,P,\lnot Q$ - 查询结论(query): $R$ - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/E8YrbXnGtoNHEJxmAttcX4p0nlg.png) + ![](https://cdn.xyxsw.site/E8YrbXnGtoNHEJxmAttcX4p0nlg.png) - 接下来,让我们看看如何将知识和逻辑表示为代码。 @@ -175,31 +175,31 @@ def check_all(knowledge, query, symbols, model):# 如果模型对每个符号都 - 模型检查不是一种有效的算法,因为它必须在给出答案之前考虑每个可能的模型(提醒:如果在$KB$为真的所有模型(真值分配)下,查询结论$R$为真,则$R$ 也为真)。 推理规则允许我们根据现有知识生成新信息,而无需考虑所有可能的模型。 - 推理规则通常使用将顶部部分(前提)与底部部分(结论)分开的水平条表示。 前提是我们有什么知识,结论是根据这个前提可以产生什么知识。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FjYOb3Qr5ofHdOx7REacdcyqn0c.png) + ![](https://cdn.xyxsw.site/FjYOb3Qr5ofHdOx7REacdcyqn0c.png) - 肯定前件(Modus Ponens) - 如果我们知道一个蕴涵及其前件为真,那么后件也为真。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HaqObF0xAoX6O8xDX7KctF0jnpf.png) + ![](https://cdn.xyxsw.site/HaqObF0xAoX6O8xDX7KctF0jnpf.png) - 合取消除(And Elimination) - 如果 And 命题为真,则其中的任何一个原子命题也为真。 例如,如果我们知道哈利与罗恩和赫敏是朋友,我们就可以得出结论,哈利与赫敏是朋友。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/TI5Mb781YocwpqxRsyRcPS8WnAg.png) + ![](https://cdn.xyxsw.site/TI5Mb781YocwpqxRsyRcPS8WnAg.png) - 双重否定消除(Double Negation Elimination) - 被两次否定的命题为真。 例如,考虑命题“哈利没有通过考试是不正确的”。 这两个否定相互抵消,将命题“哈利通过考试”标记为真。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/NuabbQqZjoBkNixz45AcDZ8Bnrg.png) + ![](https://cdn.xyxsw.site/NuabbQqZjoBkNixz45AcDZ8Bnrg.png) - 蕴含消除(Implication Elimination) - 蕴涵等价于被否定的前件和后件之间的 Or 关系。 例如,命题“如果正在下雨,哈利在室内”等同于命题“(没有下雨)或(哈利在室内)”。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/S31Ub9xcUo9yArxntWscU47pnwh.png) + ![](https://cdn.xyxsw.site/S31Ub9xcUo9yArxntWscU47pnwh.png) | $P$ | $Q$ | $P\to Q$ | $\lnot P\lor Q$ | | --- | --- | -------- | --------------- | @@ -212,25 +212,25 @@ def check_all(knowledge, query, symbols, model):# 如果模型对每个符号都 - 等值命题等价于蕴涵及其逆命题的 And 关系。 例如,“当且仅当 Harry 在室内时才下雨”等同于(“如果正在下雨,Harry 在室内”和“如果 Harry 在室内,则正在下雨”)。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/EtPMbOXWwopIZsxjUJ0cYvHXn5g.png) + ![](https://cdn.xyxsw.site/EtPMbOXWwopIZsxjUJ0cYvHXn5g.png) - 德摩根律(De Morgan’s Law) - 可以将 And 连接词变成 Or 连接词。考虑以下命题:“哈利和罗恩都通过了考试是不正确的。” 由此,可以得出“哈利通过考试不是真的”或者“罗恩不是真的通过考试”的结论。 也就是说,要使前面的 And 命题为真,Or 命题中至少有一个命题必须为真。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GTagbx1jso6l8gx1rQOcPW3inIb.png) + ![](https://cdn.xyxsw.site/GTagbx1jso6l8gx1rQOcPW3inIb.png) - 同样,可以得出相反的结论。考虑这个命题“哈利或罗恩通过考试是不正确的”。 这可以改写为“哈利没有通过考试”和“罗恩没有通过考试”。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/XOeTbb4BooRbKBx4gHwc3A7EnYf.png) + ![](https://cdn.xyxsw.site/XOeTbb4BooRbKBx4gHwc3A7EnYf.png) - 分配律(Distributive Property) - 具有两个用 And 或 Or 连接词分组的命题可以分解为由 And 和 Or 组成的更小单元。 - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/KBxzbZhUCoX7FBx5ZVFczfPvnoc.png) + ![](https://cdn.xyxsw.site/KBxzbZhUCoX7FBx5ZVFczfPvnoc.png) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/CvPybic63o7jSlxvuzpcFxjQnse.png) + ![](https://cdn.xyxsw.site/CvPybic63o7jSlxvuzpcFxjQnse.png) ## 知识和搜索问题 @@ -247,16 +247,16 @@ def check_all(knowledge, query, symbols, model):# 如果模型对每个符号都 - 归结是一个强大的推理规则,它规定如果 Or 命题中的两个原子命题之一为假,则另一个必须为真。 例如,给定命题“Ron 在礼堂”或“Hermione 在图书馆”,除了命题“Ron 不在礼堂”之外,我们还可以得出“Hermione 在图书馆”的结论。 更正式地说,我们可以通过以下方式定义归结: - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/PBF7bNpPcoTh1bxP4rqcshA5nIg.png) + ![](https://cdn.xyxsw.site/PBF7bNpPcoTh1bxP4rqcshA5nIg.png) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/LTKXbs7VPoZxlqxfXfkczFh0nBh.png) + ![](https://cdn.xyxsw.site/LTKXbs7VPoZxlqxfXfkczFh0nBh.png) - 归结依赖于互补文字,两个相同的原子命题,其中一个被否定而另一个不被否定,例如$P$和$¬P$。 - 归结可以进一步推广。 假设除了“Rom 在礼堂”或“Hermione 在图书馆”的命题外,我们还知道“Rom 不在礼堂”或“Harry 在睡觉”。 我们可以从中推断出“Hermione 在图书馆”或“Harry 在睡觉”。 正式地说: - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MebubVSxRonfZ2xnYj9c5TYCnIg.png) + ![](https://cdn.xyxsw.site/MebubVSxRonfZ2xnYj9c5TYCnIg.png) - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/UZn3b4V8mo1OXxxKDQ0cAjwYnyf.png) + ![](https://cdn.xyxsw.site/UZn3b4V8mo1OXxxKDQ0cAjwYnyf.png) - 互补文字使我们能够通过解析推理生成新句子。 因此,推理算法定位互补文字以生成新知识。 - 从句(Clause)是多个原子命题的析取式(命题符号或命题符号的否定,例如$P$, $¬P$)。 析取式由Or逻辑连接词 ($P ∨ Q ∨ R$) 相连的命题组成。 另一方面,连接词由And逻辑连接词 ($P ∧ Q ∧ R$) 相连的命题组成。 从句允许我们将任何逻辑语句转换为合取范式 (CNF),它是从句的合取,例如:$(A ∨ B ∨ C) ∧ (D ∨ ¬E) ∧ (F ∨ G)$。 diff --git a/4.人工智能/4.3.3.1程序示例.md b/4.人工智能/4.3.3.1程序示例.md index c3b1111..5b0a5fb 100644 --- a/4.人工智能/4.3.3.1程序示例.md +++ b/4.人工智能/4.3.3.1程序示例.md @@ -7,7 +7,7 @@ ::: tip 📥 -本节附件下载 +本节附件下载 ::: 本节代码不做额外梳理,[不确定性问题](./4.3.3%E4%B8%8D%E7%A1%AE%E5%AE%9A%E6%80%A7%E9%97%AE%E9%A2%98.md) 中已有解释。 @@ -35,7 +35,7 @@ 9. 1 3. 回答关于贝叶斯网络的问题,问题如下: - ![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/PUesbhgsFoiucAxWBKYcUUU3nMd.png) + ![](https://cdn.xyxsw.site/PUesbhgsFoiucAxWBKYcUUU3nMd.png) 以下哪句话是真的? diff --git a/4.人工智能/4.3.3.2项目:遗传.md b/4.人工智能/4.3.3.2项目:遗传.md index 86fb146..c3b0056 100644 --- a/4.人工智能/4.3.3.2项目:遗传.md +++ b/4.人工智能/4.3.3.2项目:遗传.md @@ -7,7 +7,7 @@ ::: ::: tip 📥 -本节附件下载 +本节附件下载 ::: ## 背景 @@ -16,7 +16,7 @@ - 每个孩子都会从他们的父母那里继承一个 GJB2 基因。如果父母有两个变异基因,那么他们会将变异基因传给孩子;如果父母没有变异基因,那么他们不会将变异基因传给孩子;如果父母有一个变异基因,那么该基因传给孩子的概率为 0.5。不过,在基因被传递后,它有一定的概率发生额外的突变:从导致听力障碍的基因版本转变为不导致听力障碍的版本,或者反过来。 - 我们可以尝试通过对所有相关变量形成一个贝叶斯网络来模拟所有这些关系,就像下面这个网络一样,它考虑了一个由两个父母和一个孩子组成的家庭。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FNyab3RWQo3EA8xu8T7cyLwhnyh.png) +![](https://cdn.xyxsw.site/FNyab3RWQo3EA8xu8T7cyLwhnyh.png) - 家庭中的每个人都有一个 `Gene` 随机变量,代表一个人有多少个特定基因(例如,GJB2 的听力障碍版本):一个 0、1 或 2 的值。家族中的每个人也有一个 `Trait` 随机变量,它是 `yes` 或 `no`,取决于该人是否表达基于该基因的性状(例如,听力障碍)。从每个人的 `Gene` 变量到他们的 `Trait` 变量之间有一个箭头,以编码一个人的基因影响他们具有特定性状的概率的想法。同时,也有一个箭头从母亲和父亲的 `Gene` 随机变量到他们孩子的 `Gene` 随机变量:孩子的基因取决于他们父母的基因。 - 你在这个项目中的任务是使用这个模型对人群进行推断。给出人们的信息,他们的父母是谁,以及他们是否具有由特定基因引起的特定可观察特征(如听力损失),你的人工智能将推断出每个人的基因的概率分布,以及任何一个人是否会表现出有关特征的概率分布。 diff --git a/4.人工智能/4.3.3不确定性问题.md b/4.人工智能/4.3.3不确定性问题.md index f6ed14a..6a9c53c 100644 --- a/4.人工智能/4.3.3不确定性问题.md +++ b/4.人工智能/4.3.3不确定性问题.md @@ -24,11 +24,11 @@ $ - 用标准骰子掷出数字 R 的概率可以表示为 $P(R)$ 。在我们的例子中,$P(R)=1/6$ ,因为有六个可能的世界(从 1 到 6 的任何数字),并且每个世界有相同的可能性发生。现在,考虑掷两个骰子的事件。现在,有 36 个可能的事件,同样有相同的可能性发生。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GqlRbfW7Yom5a9xKCBHckMBuniF.png) +![](https://cdn.xyxsw.site/GqlRbfW7Yom5a9xKCBHckMBuniF.png) - 然而,如果我们试图预测两个骰子的总和,会发生什么?在这种情况下,我们只有 11 个可能的值(总和必须在 2 到 12 之间),而且它们的出现频率并不相同。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Y8EbbcnUsoHHlFxHCrGcIUDNn0f.png) +![](https://cdn.xyxsw.site/Y8EbbcnUsoHHlFxHCrGcIUDNn0f.png) - 为了得到事件发生的概率,我们将事件发生的世界数量除以可能发生的世界总数。例如,当掷两个骰子时,有 36 个可能的世界。只有在其中一个世界中,当两个骰子都得到 6 时,我们才能得到 12 的总和。因此,$P(12)=\frac{1}{36}$,或者,换句话说,掷两个骰子并得到两个和为 12 的数字的概率是$\frac{1}{36}$。$P(7)$是多少?我们数了数,发现和 7 出现在 6 个世界中。因此,$P(7)=\frac{6}{36}=\frac{1}{6}$。 @@ -49,11 +49,11 @@ $P(a\land b)=P(a)P(b|a)$ - 例如,考虑$P(总和为12|在一个骰子上掷出6)$,或者掷两个骰子假设我们已经掷了一个骰子并获得了六,得到十二的概率。为了计算这一点,我们首先将我们的世界限制在第一个骰子的值为六的世界: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MkZ6bIPFroAm3lxzLydcsn5QnNg.png) +![](https://cdn.xyxsw.site/MkZ6bIPFroAm3lxzLydcsn5QnNg.png) - 现在我们问,在我们将问题限制在(除以$P(6)$,或第一个骰子产生 6 的概率)的世界中,事件 a(和为 12)发生了多少次? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/XZfhbR6sBorTI9x7hVVchGLUn3b.png) +![](https://cdn.xyxsw.site/XZfhbR6sBorTI9x7hVVchGLUn3b.png) ## 随机变量(Random Variables) @@ -135,7 +135,7 @@ $P(Flight=取消)=0.1$ - 每个节点 X 具有概率分布$P(X|Parents(X))$。 - 让我们考虑一个贝叶斯网络的例子,该网络包含影响我们是否按时赴约的随机变量。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/GKc6be6ueopUYZxxQg4cS4AVnmb.png) +![](https://cdn.xyxsw.site/GKc6be6ueopUYZxxQg4cS4AVnmb.png) - 让我们从上到下描述这个贝叶斯网络: @@ -279,21 +279,21 @@ for node, prediction in zip(model.states, predictions): - 如果我们从对 Rain 变量进行采样开始,则生成的值 none 的概率为 0.7,生成的值 light 的概率为 0.2,而生成的值 heavy 的概率则为 0.1。假设我们的采样值为 none。当我们得到 Maintenance 变量时,我们也会对其进行采样,但只能从 Rain 等于 none 的概率分布中进行采样,因为这是一个已经采样的结果。我们将通过所有节点继续这样做。现在我们有一个样本,多次重复这个过程会生成一个分布。现在,如果我们想回答一个问题,比如什么是$P(Train=on\ time)$,我们可以计算变量 Train 具有准时值的样本数量,并将结果除以样本总数。通过这种方式,我们刚刚生成了$P(Train=on\ {time})$的近似概率。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/CreObGAg4oXB0oxe2hMcQbYZnAc.png) +![](https://cdn.xyxsw.site/CreObGAg4oXB0oxe2hMcQbYZnAc.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Vr96bdSafoV4kBxJ3x2cAU0TnOg.png) +![](https://cdn.xyxsw.site/Vr96bdSafoV4kBxJ3x2cAU0TnOg.png) - 我们也可以回答涉及条件概率的问题,例如$P(rain=light|train=on\ {time})$。在这种情况下,我们忽略 Train 值为 delay 的所有样本,然后照常进行。我们计算在$Train=\text{on time}$的样本中有多少样本具有变量$Rain=light$,然后除以$Train=\text{on time}$的样本总数。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/KsELbuMTCoKZkGxU9U5czQpanKg.png) +![](https://cdn.xyxsw.site/KsELbuMTCoKZkGxU9U5czQpanKg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MrP0b2FbXofDsOxgnmncufUynAB.png) +![](https://cdn.xyxsw.site/MrP0b2FbXofDsOxgnmncufUynAB.png) 去除$T= on time$的样本 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Ilj3bPKuwo0l6Dx13rZcVXfenOb.png) +![](https://cdn.xyxsw.site/Ilj3bPKuwo0l6Dx13rZcVXfenOb.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/AptYbb5MZoylvex7LvPcSqivnef.png) +![](https://cdn.xyxsw.site/AptYbb5MZoylvex7LvPcSqivnef.png) 选择$R=light$的样本 @@ -357,11 +357,11 @@ print(Counter(data)) - 马尔科夫链是一个随机变量的序列,每个变量的分布都遵循马尔科夫假设。也就是说,链中的每个事件的发生都是基于之前事件的概率。 - 为了构建马尔可夫链,我们需要一个过渡模型,该模型将根据当前事件的可能值来指定下一个事件的概率分布。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/VBGxbrNgAovuKXxnTKYcm7UinFd.png) +![](https://cdn.xyxsw.site/VBGxbrNgAovuKXxnTKYcm7UinFd.png) - 在这个例子中,基于今天是晴天,明天是晴天的概率是 0.8。这是合理的,因为晴天之后更可能是晴天。然而,如果今天是雨天,明天下雨的概率是 0.7,因为雨天更有可能相继出现。使用这个过渡模型,可以对马尔可夫链进行采样。从一天是雨天或晴天开始,然后根据今天的天气,对第二天的晴天或雨天的概率进行采样。然后,根据明天的情况对后天的概率进行采样,以此类推,形成马尔科夫链: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/XBghbKBaVoz0C4xa85rch804ngd.png) +![](https://cdn.xyxsw.site/XBghbKBaVoz0C4xa85rch804ngd.png) - 给定这个马尔可夫链,我们现在可以回答诸如“连续四个雨天的概率是多少?”这样的问题。下面是一个如何在代码中实现马尔可夫链的例子: @@ -394,7 +394,7 @@ print(model.sample(50)) - 在衡量网站的用户参与度时,隐藏的状态是用户的参与程度,而观察是网站或应用程序的分析。 - 举个例子。我们的人工智能想要推断天气(隐藏状态),但它只能接触到一个室内摄像头,记录有多少人带了雨伞。这里是我们的传感器模型(sensor model),表示了这些概率: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/E0TtbfgiCoV2dtxbbPHcjPgXnQe.png) +![](https://cdn.xyxsw.site/E0TtbfgiCoV2dtxbbPHcjPgXnQe.png) - 在这个模型中,如果是晴天,人们很可能不会带伞到大楼。如果是雨天,那么人们就很有可能带伞到大楼来。通过对人们是否带伞的观察,我们可以合理地预测外面的天气情况。 @@ -403,7 +403,7 @@ print(model.sample(50)) - 假设证据变量只取决于相应的状态。例如,对于我们的模型,我们假设人们是否带雨伞去办公室只取决于天气。这不一定反映了完整的事实,因为,比如说,比较自觉的、不喜欢下雨的人可能即使在阳光明媚的时候也会到处带伞,如果我们知道每个人的个性,会给模型增加更多的数据。然而,传感器马尔科夫假设忽略了这些数据,假设只有隐藏状态会影响观察。 - 隐马尔科夫模型可以用一个有两层的马尔科夫链来表示。上层,变量$X$,代表隐藏状态。底层,变量$E$,代表证据,即我们所拥有的观察。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/FnyrbYSEWohimaxIYPSchotGnse.png) +![](https://cdn.xyxsw.site/FnyrbYSEWohimaxIYPSchotGnse.png) - 基于隐马尔科夫模型,可以实现多种任务: diff --git a/4.人工智能/4.3人工智能导论及机器学习入门.md b/4.人工智能/4.3人工智能导论及机器学习入门.md index 09e1ce2..27299ac 100644 --- a/4.人工智能/4.3人工智能导论及机器学习入门.md +++ b/4.人工智能/4.3人工智能导论及机器学习入门.md @@ -6,7 +6,7 @@ 人工智能是一个宏大的愿景,目标是让机器像我们人类一样思考和行动,既包括增强我们人类脑力也包括增强我们体力的研究领域。而学习只是实现人工智能的手段之一,并且,只是增强我们人类脑力的方法之一。所以,人工智能包含机器学习。机器学习又包含了深度学习,他们三者之间的关系见下图。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/AMU7bSgh4o8tEIxk82icvtbDn0c.png) +![](https://cdn.xyxsw.site/AMU7bSgh4o8tEIxk82icvtbDn0c.png) # 如何学习本节内容 diff --git a/4.人工智能/4.4FAQ:常见问题.md b/4.人工智能/4.4FAQ:常见问题.md index 4fe53b8..b0f600f 100644 --- a/4.人工智能/4.4FAQ:常见问题.md +++ b/4.人工智能/4.4FAQ:常见问题.md @@ -42,11 +42,11 @@ 机器学习包括深度学习 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnBP4QHAJnXrNfOiK8hp6LIc.png) +![](https://cdn.xyxsw.site/boxcnBP4QHAJnXrNfOiK8hp6LIc.png) [同时向你推荐这个 Data Analytics,Data Analysis,数据挖掘,数据科学,机器学习,大数据的区别是什么?](https://www.quora.com/What-is-the-difference-between-Data-Analytics-Data-Analysis-Data-Mining-Data-Science-Machine-Learning-and-Big-Data-1) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxPsUwwhcCC0zBerZ2s88ld.png) +![](https://cdn.xyxsw.site/boxcnxPsUwwhcCC0zBerZ2s88ld.png) ## 我没有任何相关概念 diff --git a/4.人工智能/4.6.1工欲善其事,必先利其器.md b/4.人工智能/4.6.1工欲善其事,必先利其器.md index 3236dad..93355c2 100644 --- a/4.人工智能/4.6.1工欲善其事,必先利其器.md +++ b/4.人工智能/4.6.1工欲善其事,必先利其器.md @@ -6,7 +6,7 @@ ## 深度学习框架 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnWLzi1LIWLCncrXcTcjAKne.png) +![](https://cdn.xyxsw.site/boxcnWLzi1LIWLCncrXcTcjAKne.png) ### 1、深度学习框架是什么 @@ -113,9 +113,9 @@ PyTorch 完全基于 Python。 官网如下 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnaF9UWNcr5pt99Zu5Wr0PTg.png) +![](https://cdn.xyxsw.site/boxcnaF9UWNcr5pt99Zu5Wr0PTg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnqHCP5KiSF4Vmc6M1cjEXKg.png) +![](https://cdn.xyxsw.site/boxcnqHCP5KiSF4Vmc6M1cjEXKg.png) 选择 Conda 或者 Pip 安装皆可 @@ -140,7 +140,7 @@ conda config --set show_channel_urls yes ### TensorFlow -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn5u9u9M6DPRh83ufoSwfuof.png) +![](https://cdn.xyxsw.site/boxcn5u9u9M6DPRh83ufoSwfuof.png) #### 教程 @@ -167,17 +167,17 @@ cuda 版本需要额外配置,我们将这个任务留给聪明的你!!! 同时按下键盘的 win+r 键,打开 cmd,键入 `dxdiag` 然后回车 系统、显卡、声卡以及其他输入设备的信息都在这里了。(给出我的界面) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXHceTuUl0XzCNJv9RqHN9c.png) +![](https://cdn.xyxsw.site/boxcnXHceTuUl0XzCNJv9RqHN9c.png) cuda 版本查看 桌面空白位置摁下右键 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbxhAei6H4OWjaN0Hp0YICg.png) +![](https://cdn.xyxsw.site/boxcnbxhAei6H4OWjaN0Hp0YICg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnp9i1SagOxXd17W9BiP3RNe.png) +![](https://cdn.xyxsw.site/boxcnp9i1SagOxXd17W9BiP3RNe.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngaZNZB3XLSJia0rk0DgGbe.png) +![](https://cdn.xyxsw.site/boxcngaZNZB3XLSJia0rk0DgGbe.png) #### linux @@ -193,11 +193,11 @@ nvidia-smi 通常大家所指的 cuda 是位于/usr/local 下的 cuda -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcntFGELTpdcVoigy5ldCorAb.png) +![](https://cdn.xyxsw.site/boxcntFGELTpdcVoigy5ldCorAb.png) 当然可以看到 cuda 是 cuda-11.6 所指向的软链接(类似 windows 的快捷方式),所以我们如果要切换 cuda 版本只需要改变软链接的指向即可。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTB39MtPKBr9CgufCpSIYuf.png) +![](https://cdn.xyxsw.site/boxcnTB39MtPKBr9CgufCpSIYuf.png) cuda driver version 是 cuda 的驱动版本。 @@ -205,9 +205,9 @@ cuda runtimer version 是我们实际很多时候我们实际调用的版本。 二者的版本是可以不一致的。如下图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnATNfI2spkNsXbqtIuwwY6c.png) +![](https://cdn.xyxsw.site/boxcnATNfI2spkNsXbqtIuwwY6c.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnz03UebyZ42JNOXpdUfjMBg.png) +![](https://cdn.xyxsw.site/boxcnz03UebyZ42JNOXpdUfjMBg.png) 一般来讲 cuda driver 是向下兼容的。所以 cuda driver version >= cuda runtime version 就不会太大问题。 @@ -217,13 +217,13 @@ cuda runtimer version 是我们实际很多时候我们实际调用的版本。 以 pytorch 为例,可以看到在安装过程中我们选择的 cuda 版本是 10.2 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcns8yMCuacj0A2BbMU6ZB08b.png) +![](https://cdn.xyxsw.site/boxcns8yMCuacj0A2BbMU6ZB08b.png) 那么这个 cudatookit10.2 和 nvidia-smi 的 11.7 以及 nvcc -V 的 11.4 三者有什么区别呢? pytorch 实际只需要 cuda 的链接文件,即.so 文件,这些链接文件就都包含的 cudatookkit 里面。并不需要 cuda 的头文件等其他东西,如下所示 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXWjMnlXjMg2lA1ApjoUhnh.png) +![](https://cdn.xyxsw.site/boxcnXWjMnlXjMg2lA1ApjoUhnh.png) 所以我们如果想让使用 pytorch-cuda 版本,我们实际上不需要/usr/local/cuda。只需要在安装驱动的前提下,在 python 里面安装 cudatookit 即可。 @@ -233,8 +233,8 @@ pytorch 实际只需要 cuda 的链接文件,即.so 文件,这些链接文 Cudnn 是一些链接文件,你可以理解成是为了给 cuda 计算加速的东西。同样的我们也可以用以下命令查看/usr/local/cuda 的 cudnn: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPD5DbA3NPimtV0kVoDJGmh.png) +![](https://cdn.xyxsw.site/boxcnPD5DbA3NPimtV0kVoDJGmh.png) 以及 pytorch 的 cuda 环境的 cudnn -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnZQ2Mc52Us6ku543l7WPEZd.png) +![](https://cdn.xyxsw.site/boxcnZQ2Mc52Us6ku543l7WPEZd.png) diff --git a/4.人工智能/4.6.2你可能会需要的术语介绍.md b/4.人工智能/4.6.2你可能会需要的术语介绍.md index 5e4da52..56057b5 100644 --- a/4.人工智能/4.6.2你可能会需要的术语介绍.md +++ b/4.人工智能/4.6.2你可能会需要的术语介绍.md @@ -40,8 +40,8 @@ 这是我用照片重建的独角兽稀疏点云,红色的不用管,是照相机视角(图不够多,巨糊) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnWx8hYfT6kFug4A1iA3uftg.png) +![](https://cdn.xyxsw.site/boxcnWx8hYfT6kFug4A1iA3uftg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbWfXyklyZwpjwy8uz2XnLh.jpg) +![](https://cdn.xyxsw.site/boxcnbWfXyklyZwpjwy8uz2XnLh.jpg) 先这些,后续想起来了可能会补充。 diff --git a/4.人工智能/4.6.3深度学习快速入门.md b/4.人工智能/4.6.3深度学习快速入门.md index a6f6aea..88dc912 100644 --- a/4.人工智能/4.6.3深度学习快速入门.md +++ b/4.人工智能/4.6.3深度学习快速入门.md @@ -68,7 +68,7 @@ Crash course 的课程,可以基本了解pytorch的内容,但是当然有很 ### 损失 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnRbeabbEppeHlM39UwqJSJc.png) +![](https://cdn.xyxsw.site/boxcnRbeabbEppeHlM39UwqJSJc.png) 首先我们需要有一个损失函数$F(x),x=true-predict$ @@ -77,13 +77,13 @@ Crash course 的课程,可以基本了解pytorch的内容,但是当然有很 ### 梯度下降 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnMuwaG2okodvywzbxX138Re.png) +![](https://cdn.xyxsw.site/boxcnMuwaG2okodvywzbxX138Re.png) 假设损失函数为$y=x^2$,梯度下降的目的是快速找到导数为 0 的位置(附近) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn83M9AW6xDm5pBIqmZEC6Kf.png) +![](https://cdn.xyxsw.site/boxcn83M9AW6xDm5pBIqmZEC6Kf.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcneVFa131Lb9xDMCsIMI9fcc.png) +![](https://cdn.xyxsw.site/boxcneVFa131Lb9xDMCsIMI9fcc.png) 以此类推,我们最后的 w 在 0 的附近反复横跳,最后最接近目标函数的权重 w 就是 0。 @@ -97,7 +97,7 @@ Crash course 的课程,可以基本了解pytorch的内容,但是当然有很 # 关于 MINIST -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxdyWA6Sj82kNxMlQ1b9hDg.png) +![](https://cdn.xyxsw.site/boxcnxdyWA6Sj82kNxMlQ1b9hDg.png) 这个数据集可以说是最最经典的数据集了,里面有 0-9 这 10 个数字的手写图片和标注,正确率最高已经到了 99.7%. diff --git a/4.人工智能/4.6.4Pytorch安装.md b/4.人工智能/4.6.4Pytorch安装.md index b4c2e36..6a5ee3b 100644 --- a/4.人工智能/4.6.4Pytorch安装.md +++ b/4.人工智能/4.6.4Pytorch安装.md @@ -4,7 +4,7 @@ 进入官网后选择 Install,在下面表格中按照你的配置进行选择: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxltvaT52E6mu6JIYaKvM1X.png) +![](https://cdn.xyxsw.site/boxcnxltvaT52E6mu6JIYaKvM1X.png) 其中 Package 部分选择安装的途径,这里主要介绍 Pip 和 Conda 两种途径。 @@ -56,8 +56,8 @@ conda config --show channels 同时按下 Win+R,运行 cmd,输入 `dxdiag` 并回车。系统、显卡、声卡以及其他设备信息都会显示。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnepK0nkI8pWAJaO89zQoRgh.png) +![](https://cdn.xyxsw.site/boxcnepK0nkI8pWAJaO89zQoRgh.png) cuda 版本查看 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnRoZEZsUdVduFRR9DjegeNh.png) +![](https://cdn.xyxsw.site/boxcnRoZEZsUdVduFRR9DjegeNh.png) diff --git a/4.人工智能/4.6.5.1CV领域任务(研究目标).md b/4.人工智能/4.6.5.1CV领域任务(研究目标).md index 72368c6..49be167 100644 --- a/4.人工智能/4.6.5.1CV领域任务(研究目标).md +++ b/4.人工智能/4.6.5.1CV领域任务(研究目标).md @@ -2,7 +2,7 @@ ### CV 领域的大任务 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTUlm8EI0byGJJQ78IqGWGx.png) +![](https://cdn.xyxsw.site/boxcnTUlm8EI0byGJJQ78IqGWGx.png) #### (a)Image classification 图像分类 @@ -18,7 +18,7 @@ - 这张图我们需要标注两个类别 `head(头)、helmet(头盔)` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnoyxKL4bOeYOOjrh6it0BHd.gif) +![](https://cdn.xyxsw.site/boxcnoyxKL4bOeYOOjrh6it0BHd.gif) #### (c)Semantic segmentation 语义分割 @@ -32,13 +32,13 @@ #### (e)Key Point 人体关键点检测 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnT2udZtMmV2kLQsXoPuElNd.png) +![](https://cdn.xyxsw.site/boxcnT2udZtMmV2kLQsXoPuElNd.png) 通过人体关键节点的组合和追踪来识别人的运动和行为,对于描述人体姿态,预测人体行为至关重要。 #### (f)Scene Text Recognition(STR)场景文字识别 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnB8ZB4bSaHhIhPFHHrxkakb.png) +![](https://cdn.xyxsw.site/boxcnB8ZB4bSaHhIhPFHHrxkakb.png) 很多照片中都有一些文字信息,这对理解图像有重要的作用。 @@ -48,7 +48,7 @@ 利用两张图片或者其他信息生成一张新的图片 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnOdmG0c1kkivVdTn5RUMCIc.png) +![](https://cdn.xyxsw.site/boxcnOdmG0c1kkivVdTn5RUMCIc.png) 利用左边两张小图生成右边的图片 @@ -56,6 +56,6 @@ 将输入图片分辨率增加 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnDJ5aNv49ySjw96uCCF0dW8.png) +![](https://cdn.xyxsw.site/boxcnDJ5aNv49ySjw96uCCF0dW8.png) 当然还有一些新兴领域我们没有写入~ diff --git a/4.人工智能/4.6.5.2.1数据读取.md b/4.人工智能/4.6.5.2.1数据读取.md index 9e0b5c4..63d10ed 100644 --- a/4.人工智能/4.6.5.2.1数据读取.md +++ b/4.人工智能/4.6.5.2.1数据读取.md @@ -117,7 +117,7 @@ Torchvision 库中的 torchvision.datasets 包中提供了丰富的图像数据 下表中列出了 torchvision.datasets 包所有支持的数据集。各个数据集的说明与接口,详见链接 [https://pytorch.org/vision/stable/datasets.html](https://pytorch.org/vision/stable/datasets.html)。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnxvqC7FKt1qeCZoI2kVf9yg.png) +![](https://cdn.xyxsw.site/boxcnxvqC7FKt1qeCZoI2kVf9yg.png) 注意,torchvision.datasets 这个包本身并不包含数据集的文件本身,它的工作方式是先从网络上把数据集下载到用户指定目录,然后再用它的加载器把数据集加载到内存中。最后,把这个加载后的数据集作为对象返回给用户。 @@ -129,11 +129,11 @@ MNIST 数据集是一个著名的手写数字数据集,因为上手简单, MNIST 数据集是 NIST 数据集的一个子集,MNIST 数据集你可以通过[这里](http://yann.lecun.com/exdb/mnist/)下载。它包含了四个部分。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnCP2Sp932nPy8Il5Z5d4Aih.png) +![](https://cdn.xyxsw.site/boxcnCP2Sp932nPy8Il5Z5d4Aih.png) MNIST 数据集是 ubyte 格式存储,我们先将“训练集图片”解析成图片格式,来直观地看一看数据集具体是什么样子的。具体怎么解析,我们在后面数据预览再展开。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnjsG31hhjqdxOnoCGFGR6sh.png) +![](https://cdn.xyxsw.site/boxcnjsG31hhjqdxOnoCGFGR6sh.png) 接下来,我们看一下如何使用 Torchvision 来读取 MNIST 数据集。 diff --git a/4.人工智能/4.6.5.3.1AlexNet.md b/4.人工智能/4.6.5.3.1AlexNet.md index 46968ca..84436b7 100644 --- a/4.人工智能/4.6.5.3.1AlexNet.md +++ b/4.人工智能/4.6.5.3.1AlexNet.md @@ -12,21 +12,21 @@ AlexNet 有 6 千万个参数和 650,000 个神经元。 ### 网络框架图 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcng0jB2dmDD18EwU8nAIFPIc.png) +![](https://cdn.xyxsw.site/boxcng0jB2dmDD18EwU8nAIFPIc.png) ### 使用 ReLU 激活函数代替 tanh 在当时,标准的神经元激活函数是 tanh()函数,这种饱和的非线性函数在梯度下降的时候要比非饱和的非线性函数慢得多,因此,在 AlexNet 中使用 ReLU 函数作为激活函数。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnFlENdpKXUR7l4MhUXFKzfg.png) +![](https://cdn.xyxsw.site/boxcnFlENdpKXUR7l4MhUXFKzfg.png) ### 采用 Dropout 防止过拟合 dropout 方法会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络(如下图所示),然后再用反向传播方法进行训练。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnNXzBUtJWXbUtEZzxugBr6W.png) +![](https://cdn.xyxsw.site/boxcnNXzBUtJWXbUtEZzxugBr6W.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn7kG0PcXNumIdTFuEdaHl0e.png) +![](https://cdn.xyxsw.site/boxcn7kG0PcXNumIdTFuEdaHl0e.png) ### diff --git a/4.人工智能/4.6.5.3.2FCN.md b/4.人工智能/4.6.5.3.2FCN.md index f3eec40..de453d7 100644 --- a/4.人工智能/4.6.5.3.2FCN.md +++ b/4.人工智能/4.6.5.3.2FCN.md @@ -10,7 +10,7 @@ ### 框架图 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndYCXYj7rNfhXoSaEPZxpyc.png) +![](https://cdn.xyxsw.site/boxcndYCXYj7rNfhXoSaEPZxpyc.png) ### 同 CNN 的对比 @@ -26,7 +26,7 @@ FCN 对图像进行像素级的分类,从而解决了语义级别的图像分 这里图像的反卷积使用了这一种反卷积手段使得图像可以变大,FCN 作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现 end to end。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngqgiogbvy4OYpIzIo6eSXd.png) +![](https://cdn.xyxsw.site/boxcngqgiogbvy4OYpIzIo6eSXd.png) ### 视频 diff --git a/4.人工智能/4.6.5.3.3ResNet.md b/4.人工智能/4.6.5.3.3ResNet.md index 9edc309..e8573d6 100644 --- a/4.人工智能/4.6.5.3.3ResNet.md +++ b/4.人工智能/4.6.5.3.3ResNet.md @@ -21,11 +21,11 @@ 如图所示,随着层数越来越深,预测的效果反而越来越差(error 越大) ::: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnBDfBnOPmS0btwNseKvsN6f.png) +![](https://cdn.xyxsw.site/boxcnBDfBnOPmS0btwNseKvsN6f.png) ## 网络模型 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnn8a16DYyEPEVuHxvvw7eAf.png) +![](https://cdn.xyxsw.site/boxcnn8a16DYyEPEVuHxvvw7eAf.png) ::: warning 😺 我们可以看到,ResNet 的网络依旧非常深,这是因为研究团队不仅发现了退化现象,还采用出一个可以将网络继续加深的 trick:shortcut,亦即我们所说的 residual。 @@ -35,7 +35,7 @@ ::: ### residual 结构 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhgVaLChu3O2omGJKzFU7uB.png) +![](https://cdn.xyxsw.site/boxcnhgVaLChu3O2omGJKzFU7uB.png) ## 网络代码 diff --git a/4.人工智能/4.6.5.3.4UNet.md b/4.人工智能/4.6.5.3.4UNet.md index 2cd4886..08158a6 100644 --- a/4.人工智能/4.6.5.3.4UNet.md +++ b/4.人工智能/4.6.5.3.4UNet.md @@ -8,7 +8,7 @@ ## 网络框架 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnoo4bKuLo5qQdQmRP2H75Sb.png) +![](https://cdn.xyxsw.site/boxcnoo4bKuLo5qQdQmRP2H75Sb.png) ::: warning 😺 diff --git a/4.人工智能/4.6.5.3.7还要学更多?.md b/4.人工智能/4.6.5.3.7还要学更多?.md index 12b9354..2a893f7 100644 --- a/4.人工智能/4.6.5.3.7还要学更多?.md +++ b/4.人工智能/4.6.5.3.7还要学更多?.md @@ -6,11 +6,11 @@ - 你可以先行尝试一下怎么把在 MNIST 上训练的网络真正投入应用,比如识别一张你自己用黑笔写的数字~ -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn2juA3J3ycnHoN5SmYAfEfd.jpg) +![](https://cdn.xyxsw.site/boxcn2juA3J3ycnHoN5SmYAfEfd.jpg) - 比如你可以尝试训练一个网络来实现人体五官分割(笔者之前就玩过这个)数据集采用 [helen 数据集](https://pages.cs.wisc.edu/~lizhang/projects/face-parsing/),关于数据集的架构你可以搜一搜,自己设计一个 Dataloader 和 YourModle 来实现前言中的五官分割效果(真的很有乐子 hhh) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJJlzanhvtE55Q7d0IR1vph.png) +![](https://cdn.xyxsw.site/boxcnJJlzanhvtE55Q7d0IR1vph.png) - 当然你也可以尝试一些自己感兴趣的小任务来锻炼工程能力~ diff --git a/4.人工智能/4.6.5.4.1NeRF.md b/4.人工智能/4.6.5.4.1NeRF.md index 15c09fa..01418e2 100644 --- a/4.人工智能/4.6.5.4.1NeRF.md +++ b/4.人工智能/4.6.5.4.1NeRF.md @@ -6,11 +6,11 @@ NeRF 想做这样一件事,不需要中间三维重建的过程,仅根据位 在生成建模前,我们需要对被建模物体进行密集的采样,如下图是一个示例的训练集,它含有 100 张图片以及保存了每一张图片相机参数(表示拍摄位置,拍摄角度,焦距的矩阵)的 json 文件。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn6jg09V944MU1sBsstmdaib.png) +![](https://cdn.xyxsw.site/boxcn6jg09V944MU1sBsstmdaib.png) 你可以看到,这 100 张图片是对一个乐高推土机的多角度拍摄结果。我们需要的是一个可以获取这个推土机在任意角度下拍摄的图片的模型。如图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnLEEyuUWOwiJOePhmmsAakd.gif) +![](https://cdn.xyxsw.site/boxcnLEEyuUWOwiJOePhmmsAakd.gif) 现在来看 NeRF 网络: @@ -40,7 +40,7 @@ NeRF 想做这样一件事,不需要中间三维重建的过程,仅根据位 - 对应的小方块的 RGB 信息 - 不透明度 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcni4q9Cp8G7H9HjKMrfImcZe.jpg) +![](https://cdn.xyxsw.site/boxcni4q9Cp8G7H9HjKMrfImcZe.jpg) 在这里,作者选择了最简单的 MLP,因此,这是一个输入为 5 维,输出为 4 维向量($R,G,B,\sigma$)的简单网络,值得注意的是,不透明度与观察角度无关,这里在网络中进行了特殊处理,让这个值与后两维无关。 @@ -58,15 +58,15 @@ NeRF 想做这样一件事,不需要中间三维重建的过程,仅根据位 这段要仔细看和推导,第一遍不容易直接懂。顺带一提,我们的小方块学名叫体素为了显得我们更专业一点以后就叫它体素罢 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnwHy3Hlhbu2bOsi6r2BYJe.png) +![](https://cdn.xyxsw.site/boxcnnwHy3Hlhbu2bOsi6r2BYJe.png) 上面所说的公式具体如下:t 是我们的$\sigma$,$t_f,t_n$分别是离发射点最远的体素和最近的体素。这个公式求得是像素的颜色。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnDWBUOJucS2YdT7MlKBAq8g.png) +![](https://cdn.xyxsw.site/boxcnDWBUOJucS2YdT7MlKBAq8g.png) 思路总体如上,这里放一张找来的渲染过程示意图(不知道为什么有点包浆) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfH30VDvbSdzahs5lRuirUd.gif) +![](https://cdn.xyxsw.site/boxcnfH30VDvbSdzahs5lRuirUd.gif) # 算法细节部分 @@ -86,10 +86,10 @@ NeRF 想做这样一件事,不需要中间三维重建的过程,仅根据位 粗网络就是上述采样方法用的普通网络,而粗网络输出的不透明度值会被作为一个概率分布函数,精细网络根据这个概率分布在光线上进行采样,不透明度越大的点,它的邻域被采样的概率越大,也就实现了我们要求的在实体上多采样,空气中少采样。最后精细网络输出作为结果,因此粗网络可以只求不透明度,无视颜色信息。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnwl72wntQgYMFvRPTWY5fPf.png) +![](https://cdn.xyxsw.site/boxcnwl72wntQgYMFvRPTWY5fPf.png) ## 位置编码 学过 cv 的大家想必对这个东西耳熟能详了吧~,这里的位置编码是对输入的两个位置和一个方向进行的(体素位置,相机位置和方向),使用的是类似 transformer 的三角函数类编码如下。位置编码存在的意义是放大原本的 5 维输入对网络的影响程度,把原本的 5D 输入变为 90 维向量;并且加入了与其他体素的相对位置信息。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnliAj5mb0Afz0TOMwrwytmh.png) +![](https://cdn.xyxsw.site/boxcnliAj5mb0Afz0TOMwrwytmh.png) diff --git a/4.人工智能/4.6.5.4.2NeRF的改进方向.md b/4.人工智能/4.6.5.4.2NeRF的改进方向.md index e5c93fb..b889f72 100644 --- a/4.人工智能/4.6.5.4.2NeRF的改进方向.md +++ b/4.人工智能/4.6.5.4.2NeRF的改进方向.md @@ -12,19 +12,19 @@ Pixel-nerf 对输入图像使用卷积进行特征提取再执行 nerf,若有多个输入,对每个视角都执行 CNN,在计算光线时,取每一个已有视角下该坐标的特征,经过 mlp 后算平均。可以在少量视角下重建视图,需要进行预训练才能使用,有一定自动补全能力(有限) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnEiUODOd4FOBxYIZmmihyef.png) +![](https://cdn.xyxsw.site/boxcnEiUODOd4FOBxYIZmmihyef.png) ### 2.IBRnet IBRnet 是 pixel-nerf 的改进版,取消了 CNN,并且在 mlp 后接入了 transformer 结构处理体密度(不透明度),对这条光线上所有的采样点进行一个 transformer。同时,在获取某个体素的颜色和密度时,作者用了本视角相邻的两个视角,获取对应体素在这两张图片中的像素,以图片像素颜色,视角,图片特征作为 mlp 的输入。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnwH75jIO9NiVwQaBqDrbe8e.png) +![](https://cdn.xyxsw.site/boxcnwH75jIO9NiVwQaBqDrbe8e.png) ### 3.MVSnerf MVSnerf 它用 MVS 的方法构建代价体然后在后面接了一个 nerf,MVS 是使用多视角立体匹配构建一个代价体,用 3D 卷积网络进行优化,这里对代价体进行 nerf 采样,可以得到可泛化网络。它需要 15min 的微调才能在新数据上使用。多视角立体匹配是一种传统算法,通过光线,几何等信息计算图像中小块的相似度,得出两个相机视角之间的位置关系。这个算法也被广泛使用在得到我们自己采样的数据的相机变换矩阵上(我就是这么干的) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbd2YxumunZR9LZG3ANrPrb.png) +![](https://cdn.xyxsw.site/boxcnbd2YxumunZR9LZG3ANrPrb.png) 此处涉及较多图形学,使用了平面扫描算法,其中有单应性变换这个角度变换算法,推导与讲解如下: @@ -34,7 +34,7 @@ 平面扫描就是把 A 视角中的某一像素点(如图中红色区域)的相邻的几个像素提取出来,用单应性变换转换到 B 视角中,这时候用的深度是假设的深度,遍历所有假设的深度,计算通过每一个假设深度经过单应性变换得到的像素小块和 B 视角中对应位置的差值(loss),取最小的 loss 处的深度作为该像素的深度。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn5JmWUh1Gu283biqHq3Op0r.png) +![](https://cdn.xyxsw.site/boxcn5JmWUh1Gu283biqHq3Op0r.png) 构建代价体: @@ -55,7 +55,7 @@ 展开说说:其实这也是神经网络发展的一个方向,以前的深层网络倾向于把所有东西用网络参数表示,这样推理速度就会慢,这里使用哈希表的快速查找能力存储一些数据信息,instant-ngp 就是把要表达的模型数据特征按照不同的精细度存在哈希表中,使用时通过哈希表调用或插值调用。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXSUge0BqBCecdDJLQr4cRc.png) +![](https://cdn.xyxsw.site/boxcnXSUge0BqBCecdDJLQr4cRc.png) # 3.可编辑(指比如人体运动等做修改工作的) @@ -63,7 +63,7 @@ Human-nerf 生成可编辑的人体运动视频建模,输入是一段人随便动动的视频。输出的动作可以编辑修改,并且对衣物折叠等有一定优化。使用的模型并非全隐式的,并且对头发和衣物单独使用变换模型。使用了逆线性蒙皮模型提取人物骨骼(可学习的模型),上面那个蓝色的就是姿态矫正模块,这个模块赋予骨骼之间运动关系的权重(因为使用的是插值处理同一运动时不同骨骼的平移旋转矩阵,一块骨骼动会牵动其他骨骼)图中的 Ω 就是权重的集合,它通过 mlp 学习得到。然后得到显式表达的人物骨骼以及传入视频中得到的对应骨骼的 mesh,skeletal motion 就是做游戏人物动作用的编辑器这种,后面残差链接了一个 non-rigid-motion(非刚性动作),这个是专门处理衣物和毛发的,主要通过学习得到,然后粗暴的加起来就能得到模型,再经过传统的 nerf 渲染出图像。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHRnNXHvwVXrRmM8wnl53p9.png) +![](https://cdn.xyxsw.site/boxcnHRnNXHvwVXrRmM8wnl53p9.png) ### 2.Neural Body @@ -75,7 +75,7 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作,演示视频右下。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnYmy1MnyWSPNEWvFWj9mzCf.png) +![](https://cdn.xyxsw.site/boxcnYmy1MnyWSPNEWvFWj9mzCf.png) 这是 EasyMocap 的演示。 @@ -87,7 +87,7 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作 是个预训练模型,训练的模块就是这个 3D 卷积神经网络。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbclBwg3BsubGOrt8vZf0qb.png) +![](https://cdn.xyxsw.site/boxcnbclBwg3BsubGOrt8vZf0qb.png) ### 3.wild-nerf @@ -101,11 +101,11 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作 在此网络的单个输出上貌似是不监督的,因为没办法进行人为标注。这点我不是很确定,以后如果发现了会来修改的。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnYeaiioqtFzQlztsTwiEpzg.png) +![](https://cdn.xyxsw.site/boxcnYeaiioqtFzQlztsTwiEpzg.png) 渲染经过形变的物体时,光线其实是在 t=0 时刻进行渲染的,因为推土机的铲子放下去了,所以光线是弯曲的。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcng7xDooDmmpbCJRyLJBucwe.png) +![](https://cdn.xyxsw.site/boxcng7xDooDmmpbCJRyLJBucwe.png) # 4.用于辅助传统图像处理 @@ -123,23 +123,23 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作 GRAF 把 GAN 与 nerf 结合,增加了两个输入,分别是外观/形状编码 z2D 采样编码 v,z 用来改变渲染出来东西的特征,比如把生成的车变色或者变牌子,suv 变老爷车之类的。v(s,u)用来改变下图 2 中训练时选择光线的标准。这里训练时不是拿 G 生成的整张图扔进 D 网络,而是根据 v 的参数选择一些光线组成的 batch 扔进 D 进行辨别 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnVyFqHIoA2MGGc4JJo9tObh.png) +![](https://cdn.xyxsw.site/boxcnVyFqHIoA2MGGc4JJo9tObh.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnvBzqwCn9i8GGBIkMFEs3ne.png) +![](https://cdn.xyxsw.site/boxcnvBzqwCn9i8GGBIkMFEs3ne.png) ### 2.GIRAFFE GIRAFFE 是 GRAF 的改进工作,可以把图片中的物品,背景一个个解耦出来单独进行改变或者移动和旋转,也可以增加新的物品或者减少物品,下图中蓝色是不可训练的模块,橙色可训练。以我的理解好像要设置你要解耦多少个(N)物品再训练,网络根据类似 k 近邻法的方法在特征空间上对物品进行分割解耦,然后分为 N 个渲染 mlp 进行训练,训练前加入外观/形状编码 z。最后还是要扔进 D 训练。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnB04hwHA1o64WBvYSyVTDod.png) +![](https://cdn.xyxsw.site/boxcnB04hwHA1o64WBvYSyVTDod.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnC2bKVHOANjGOePLHk7jfZe.png) +![](https://cdn.xyxsw.site/boxcnC2bKVHOANjGOePLHk7jfZe.png) ### 3.OSF OSFObject-Centric Neural Scene Rendering,可以给移动的物体生成合理的阴影和光照效果。加入了新的坐标信息:光源位置,与相机坐标等一起输入。对每个小物件构建一个单独的小 nerf,计算这个小 nerf 的体素时要先经过光源照射处理(训练出来的)然后在每个小物件之间也要计算反射这样的光线影响,最后进行正常的渲染。这篇文章没人写 review,有点冷门,这些都是我自己读完感觉的,不一定对。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnV7YcKIq5y8TkOGEGzrPc5g.png) +![](https://cdn.xyxsw.site/boxcnV7YcKIq5y8TkOGEGzrPc5g.png) ### 4.Hyper-nerf-gan @@ -153,7 +153,7 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作 左边是常规卷积网络生成图像,右边是用 INR 生成图像。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnGCCZ8qXD1Hhc531NxfLzLd.png) +![](https://cdn.xyxsw.site/boxcnGCCZ8qXD1Hhc531NxfLzLd.png) 这种方法存在两个问题: @@ -165,8 +165,8 @@ EasyMocap 是通过多视角视频生成骨架以及 SMPL 模型的一个工作 FMM 主要是把要学习的矩阵转化为两个低秩矩阵,去先生成他们俩再相乘,减少网络计算量。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn0oHY54dgL2bxmryxjqxC6f.png) +![](https://cdn.xyxsw.site/boxcn0oHY54dgL2bxmryxjqxC6f.png) 现在开始讲 Hyper-nerf-gan 本身,它看上去其实就是 nerf 接在 gan 上。不过有一些变化,比如输入不再包含视角信息,我很怀疑它不能很好表达反光效果。而且抛弃了粗网络细网络的设计,只使用粗网络减少计算量。这里的 generator 完全就是 INR-Gan 的形状,生成权重,然后再经过 nerf 的 mlp 层生成,没啥别的了,就这样吧。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnc9bZ1nqt3Lighlrj9zSrdd.png) +![](https://cdn.xyxsw.site/boxcnc9bZ1nqt3Lighlrj9zSrdd.png) diff --git a/4.人工智能/4.6.5.4.3自制数据集的工具COLMAP.md b/4.人工智能/4.6.5.4.3自制数据集的工具COLMAP.md index 029b38a..bfae611 100644 --- a/4.人工智能/4.6.5.4.3自制数据集的工具COLMAP.md +++ b/4.人工智能/4.6.5.4.3自制数据集的工具COLMAP.md @@ -2,7 +2,7 @@ 如何使用和怎么下载就不讲了,直接搜就有,它可以把多个拍摄同一物体的图片转换为它们对应视角的相机矩阵和拍摄角度,可以实现自制数据集做 nerf。它的流程(SFM 算法)可以概括如下: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXzgaIhmUQ7HQtEn52ksWIf.png) +![](https://cdn.xyxsw.site/boxcnXzgaIhmUQ7HQtEn52ksWIf.png) 这里主要是记录一下它的原理: 首先是一个经典关键点匹配技术:SIFT @@ -11,53 +11,53 @@ ## DOG 金字塔 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcneERqw4amGHf6f2SX7gcdny.png) +![](https://cdn.xyxsw.site/boxcneERqw4amGHf6f2SX7gcdny.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnv4dRbGDg9eemcyQFREYs0b.png) +![](https://cdn.xyxsw.site/boxcnv4dRbGDg9eemcyQFREYs0b.png) 下面是原理方法: 首先是高斯金字塔,它是把原图先放大两倍,然后使用高斯滤波(高斯卷积)对图像进行模糊化数次,取出倒数第三层缩小一半继续进行这个过程,也就是说它是由一组一组的小金字塔组成的。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnKJWrCUc5cPOuZg01HqNCsc.png) +![](https://cdn.xyxsw.site/boxcnKJWrCUc5cPOuZg01HqNCsc.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnd25i5LQ7WjGJEe2xgU3qce.jpg) +![](https://cdn.xyxsw.site/boxcnd25i5LQ7WjGJEe2xgU3qce.jpg) 然后是基于高斯金字塔的 DOG 金字塔,也叫差分金字塔,它是把相邻的高斯金字塔层做减法得到的,因为经过高斯模糊,物体的轮廓(或者说不变特征)被模糊化,也就是被改变。通过相减可以得到这些被改变的点。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcncKZlnG7F4oEpcrQYqth8kh.jpg) +![](https://cdn.xyxsw.site/boxcncKZlnG7F4oEpcrQYqth8kh.jpg) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnAEQSDhsLdDsNOQVxqcic5d.jpg) +![](https://cdn.xyxsw.site/boxcnAEQSDhsLdDsNOQVxqcic5d.jpg) ## 空间极值点检测 为了找到变化的最大的几个点来作为特征点,我们需要找到变化的极值点,因此需要进行比较,这里是在整个金字塔中进行对比,我们提取某个点周边 3*3*3 的像素点进行比较,找到最大或最小的局部极值点。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnl48ovxbqSeTljgF3rp16ue.png) +![](https://cdn.xyxsw.site/boxcnl48ovxbqSeTljgF3rp16ue.png) 同时我们也对关键点分配方向,也就是这个点在图片空间中的梯度方向 梯度为: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbQx8TntyX8iETPixOnKjef.png) +![](https://cdn.xyxsw.site/boxcnbQx8TntyX8iETPixOnKjef.png) 梯度方向为: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnfw5FrBxPaD4bNFT4GFyXmd.png) +![](https://cdn.xyxsw.site/boxcnfw5FrBxPaD4bNFT4GFyXmd.png) 我们计算以关键点为中心的邻域内所有点的梯度方向,然后把这些 360 度范围内的方向分配到 36 个每个 10 度的方向中,并构建方向直方图,这里的示例使用了 8 个方向,几个随你其实: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnyuV5HCumJMhyW7Cb3HSxcg.jpg) +![](https://cdn.xyxsw.site/boxcnyuV5HCumJMhyW7Cb3HSxcg.jpg) 取其中最大的为主方向,若有一个方向超过主方向的 80%,那么把它作为辅方向。 操作可以优化为下图,先把关键点周围的像素分成 4 块,每块求一次上面的操作,以这个 4 个梯度直方图作为关键点的方向描述。也就是一个 2*2*8(方向数量)的矩阵作为这个点的方向特征。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnEvWRhUKcWKAoYKWbN1kAuc.png) +![](https://cdn.xyxsw.site/boxcnEvWRhUKcWKAoYKWbN1kAuc.png) 实验表明,使用 4*4*8=122 的描述更加可靠。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniVb6FvrZziID1B1JFmgVzx.jpg) +![](https://cdn.xyxsw.site/boxcniVb6FvrZziID1B1JFmgVzx.jpg) 特征点的匹配是通过计算两组特征点的 128 维的关键点的欧式距离实现的。欧式距离越小,则相似度越高,当欧式距离小于设定的阈值时,可以判定为匹配成功。 diff --git a/4.人工智能/4.6.5.5行人重识别(ReID).md b/4.人工智能/4.6.5.5行人重识别(ReID).md index c3f0e87..219682d 100644 --- a/4.人工智能/4.6.5.5行人重识别(ReID).md +++ b/4.人工智能/4.6.5.5行人重识别(ReID).md @@ -8,10 +8,10 @@ 该任务目前在学术上是检索出不同摄像头下的相同行人图片,同时数据集中只有人的全身照,如下图所示。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ReID1.png) +![](https://cdn.xyxsw.site/ReID1.png) 但是实际上在实际应用中的时候会和检测结合,简单来说先框出目标后分类,如下图所示。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ReID2.png) +![](https://cdn.xyxsw.site/ReID2.png) 这个方向做的比较的奇怪,该模块只做整体性介绍,同时希望学习该模块的你对经典网络有所了解。 diff --git a/4.人工智能/4.6.6.1NLP领域任务(研究目标).md b/4.人工智能/4.6.6.1NLP领域任务(研究目标).md index e729a12..f0516f9 100644 --- a/4.人工智能/4.6.6.1NLP领域任务(研究目标).md +++ b/4.人工智能/4.6.6.1NLP领域任务(研究目标).md @@ -4,25 +4,25 @@ 分类 (text classification): 给一句话或者一段文本,判断一个标签。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/PxE3b05ApofzZ1x8u49cirdUnye.png) +![](https://cdn.xyxsw.site/PxE3b05ApofzZ1x8u49cirdUnye.png) 图 2:分类 (text classification) 蕴含 (textual entailment): 给一段话,和一个假设,看看前面这段话有没有蕴含后面的假设。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/OuhabfzABoqxQxxS1n1cPLTinKb.png) +![](https://cdn.xyxsw.site/OuhabfzABoqxQxxS1n1cPLTinKb.png) 图 3:蕴含 (textual entailment) 相似 (Similarity): 判断两段文字是否相似。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ByeFbxTfToxFlgxh6xmcIKeRnzd.png) +![](https://cdn.xyxsw.site/ByeFbxTfToxFlgxh6xmcIKeRnzd.png) 图 4:相似 (Similarity) 多选题 (Multiple Choice): 给个问题,从 N 个答案中选出正确答案。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ZYgybsj5dol1Ifx96Koc6SRpnmc.jpeg) +![](https://cdn.xyxsw.site/ZYgybsj5dol1Ifx96Koc6SRpnmc.jpeg) 图 5:多选题 (Multiple Choice) diff --git a/4.人工智能/4.6.6.2.2.3推荐系统实例.md b/4.人工智能/4.6.6.2.2.3推荐系统实例.md index c2fd453..3855193 100644 --- a/4.人工智能/4.6.6.2.2.3推荐系统实例.md +++ b/4.人工智能/4.6.6.2.2.3推荐系统实例.md @@ -1,6 +1,6 @@ # 推荐系统的外围架构 -![推荐系统外围架构图](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/推荐系统外围架构图.png) +![推荐系统外围架构图](https://cdn.xyxsw.site/推荐系统外围架构图.png)
推荐系统外围架构图
@@ -22,7 +22,7 @@ 若是将推荐系统的任务细分,可以结合现实实际情况:将最新加入的物品推荐给用户;商业上需要宣传的物品推荐给用户;为用户推荐不同种类的物品。 **复杂的特征和情况不同的任务**会让推荐系统变得非常复杂,所以推荐系统的架构为了方便考虑,采用多个不同的推荐引擎组成,每个推荐引擎专门负责某一类特征和一种任务,而推荐系统再将推荐引擎的结果按照一定的优先级合并,排序并返回给UI系统。 -![推荐系统的架构图](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/推荐系统的架构图.png) +![推荐系统的架构图](https://cdn.xyxsw.site/推荐系统的架构图.png)
推荐系统的架构
如上图所示。 @@ -38,7 +38,7 @@ - 推荐列表筛选、过滤、重排列部分 -![推荐引擎的架构](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/推荐引擎的架构.png) +![推荐引擎的架构](https://cdn.xyxsw.site/推荐引擎的架构.png) 以上为推荐引擎的架构图。 diff --git a/4.人工智能/4.6.6.2.2.4利用用户行为数据.md b/4.人工智能/4.6.6.2.2.4利用用户行为数据.md index d49ef7d..1d92a3e 100644 --- a/4.人工智能/4.6.6.2.2.4利用用户行为数据.md +++ b/4.人工智能/4.6.6.2.2.4利用用户行为数据.md @@ -179,7 +179,7 @@ $$Preference(u,i)=r_{ui}=p^T_uq_i=\sum^F_{f=1}{p_{u,k}q_{i,k}}$$ 在研究图模型之前,需要用已有的数据生成一个图,设二元组 $(u,i)$ 表示用u对于物品 i 产生过行为。令 $G(V,E)$ 表示用户物品二分图,其中$V=V_U\cup V_I$ 由用户顶点集合和物品顶点集合组成,$E$ 是边的集合。对于数据集中的二元组 $(u,i)$ 图中都会有对应的边 $e(v_u,v_i)\in E$ 如下图所示。 -![用户物品二分图模型](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/用户物品二分图模型.png) +![用户物品二分图模型](https://cdn.xyxsw.site/用户物品二分图模型.png) ### 基于图的推荐算法 diff --git a/4.人工智能/4.6.6.2.3序列化推荐.md b/4.人工智能/4.6.6.2.3序列化推荐.md index 3c0065f..5cc0a73 100644 --- a/4.人工智能/4.6.6.2.3序列化推荐.md +++ b/4.人工智能/4.6.6.2.3序列化推荐.md @@ -10,5 +10,5 @@

而SRSs则是将用户和商品的交互建模为一个动态的序列并且利用序列的依赖性来活捉当前和最近用户的喜好。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnolggxKhDZDBzIFPIaDFfhc.png) +![](https://cdn.xyxsw.site/boxcnolggxKhDZDBzIFPIaDFfhc.png) diff --git a/4.人工智能/4.6.6.2推荐系统.md b/4.人工智能/4.6.6.2推荐系统.md index 6fa4dd1..967e47e 100644 --- a/4.人工智能/4.6.6.2推荐系统.md +++ b/4.人工智能/4.6.6.2推荐系统.md @@ -4,7 +4,7 @@ 如下图是阿里巴巴著名的“千人千面”推荐系统 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3bdrD08wpaYhL59ezDukuc.jpg) +![](https://cdn.xyxsw.site/boxcn3bdrD08wpaYhL59ezDukuc.jpg) 还有短视频应用用户数量的急剧增长,这背后,视频推荐引擎发挥着不可替代的作用 diff --git a/4.人工智能/4.6.7.1VIT.md b/4.人工智能/4.6.7.1VIT.md index ef5c653..1203809 100644 --- a/4.人工智能/4.6.7.1VIT.md +++ b/4.人工智能/4.6.7.1VIT.md @@ -18,7 +18,7 @@ ## 模型详解 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn1wqKtwBc6MCJDm7ehvhXac.png) +![](https://cdn.xyxsw.site/boxcn1wqKtwBc6MCJDm7ehvhXac.png) ### 模型主题结构 @@ -51,9 +51,9 @@ 例如 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn1szLG4Y4s0UkY3kkW18Xoc.png) +![](https://cdn.xyxsw.site/boxcn1szLG4Y4s0UkY3kkW18Xoc.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnv2inISAGi2xOauc3pxKpCb.png) +![](https://cdn.xyxsw.site/boxcnv2inISAGi2xOauc3pxKpCb.png) 其中该张图片的编码为[0.5,0.6,0.3,....] diff --git a/4.人工智能/4.6.7.2BERT.md b/4.人工智能/4.6.7.2BERT.md index b28e205..5d3b8e1 100644 --- a/4.人工智能/4.6.7.2BERT.md +++ b/4.人工智能/4.6.7.2BERT.md @@ -30,13 +30,13 @@ mlp 的重点和创新并非它的模型结构,而是它的训练方式,前 BERT 模型的输入就是上面三者的和,如图所示: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcngc1a7cWapQA9rSLXYqUvkf.png) +![](https://cdn.xyxsw.site/boxcngc1a7cWapQA9rSLXYqUvkf.png) ## 模型结构 简单来说,BERT 是 transformer编码器的叠加,也就是下图左边部分。这算一个 block。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPg8594YzCdnX6KZxpEYYod.png) +![](https://cdn.xyxsw.site/boxcnPg8594YzCdnX6KZxpEYYod.png) 说白了就是一个 多头自注意力=>layer-norm=> 接 feed forward(其实就是 mlp)=>layer-norm,没有什么创新点在这里。因为是一个 backbone 模型,它没有具体的分类头之类的东西。输出就是最后一层 block 的输出。 diff --git a/4.人工智能/4.6.7.3MAE.md b/4.人工智能/4.6.7.3MAE.md index 45f7ac5..3533bf9 100644 --- a/4.人工智能/4.6.7.3MAE.md +++ b/4.人工智能/4.6.7.3MAE.md @@ -28,7 +28,7 @@ cv 领域,其实预训练模型早已推广,一般是在 imagenet 上进行 在这里,作者为了加大任务的难度,扩大了被 mask 掉的比例,避免模型只学到双线性插值去修补缺的图像。作者把 75% 的 patch 进行 mask,然后放入模型训练。从下图可以看出,被 mask 的块是不进行编码的,这样也可以降低计算量,减少成本。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnd7HTEFOiJxVQ3jtOpzK4ie.png) +![](https://cdn.xyxsw.site/boxcnd7HTEFOiJxVQ3jtOpzK4ie.png) 在被保留的块通过编码器后,我们再在原先位置插入只包含位置信息的 mask 块,一起放入解码器。 @@ -38,7 +38,7 @@ cv 领域,其实预训练模型早已推广,一般是在 imagenet 上进行 下面是原论文给的训练结果,可以看到效果是很惊人的。(有些图我脑补都补不出来) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPWO0VWbPvCE537tf6MWu4e.png) +![](https://cdn.xyxsw.site/boxcnPWO0VWbPvCE537tf6MWu4e.png) # 相关资料 diff --git a/4.人工智能/4.6.8.1前言.md b/4.人工智能/4.6.8.1前言.md index 697999b..20ddac7 100644 --- a/4.人工智能/4.6.8.1前言.md +++ b/4.人工智能/4.6.8.1前言.md @@ -24,7 +24,7 @@ 直观来讲,我们把特征的向量进行一下归一化,它们就分布在一个超球面上。简单起见,我们先看 3 维向量 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJ6HpIJqxJuxiz7Cw5GopSh.png) +![](https://cdn.xyxsw.site/boxcnJ6HpIJqxJuxiz7Cw5GopSh.png) 我们通过正样本(跟拿到的特征应当相近的另一个特征)与负样本(反之)的对比,使得 diff --git a/4.人工智能/4.6.8.2Inst Disc.md b/4.人工智能/4.6.8.2Inst Disc.md index 3d6e134..88ad2c4 100644 --- a/4.人工智能/4.6.8.2Inst Disc.md +++ b/4.人工智能/4.6.8.2Inst Disc.md @@ -8,7 +8,7 @@ 作者团队认为,让这些猎豹,雪豹的标签相互接近(指互相在判别时都排名靠前)的原因并不是它们有相似的标签,而是它们有相似的图像特征。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnrR3eFvOSKYRH8Ni0dvHYkc.png) +![](https://cdn.xyxsw.site/boxcnrR3eFvOSKYRH8Ni0dvHYkc.png) ## 个体判别任务 @@ -16,7 +16,7 @@ 于是他们把每一个图片当作一个类别,去跟其他的图片做对比,具体模型如下 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnPNukes2FlNwUFSKiqIJEbd.png) +![](https://cdn.xyxsw.site/boxcnPNukes2FlNwUFSKiqIJEbd.png) 先介绍一下模型结构: @@ -48,11 +48,11 @@ A 是起始点,B 是第一次更新后的点,C 是第二次更新后的点 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn5zfD155Joy1eD5CvbZXZnc.png) +![](https://cdn.xyxsw.site/boxcn5zfD155Joy1eD5CvbZXZnc.png) 而在我们刚刚提到的动量更新里,它的公式可以概括为: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTLEK31rFmuRo2MOWGRBoYe.png) +![](https://cdn.xyxsw.site/boxcnTLEK31rFmuRo2MOWGRBoYe.png) m 表示动量,k 是新的特征,q 是上一个特征,只要设置小的动量就可以使改变放缓。 diff --git a/4.人工智能/4.6.8.3定义正负样本的方式.md b/4.人工智能/4.6.8.3定义正负样本的方式.md index c62f67d..04af727 100644 --- a/4.人工智能/4.6.8.3定义正负样本的方式.md +++ b/4.人工智能/4.6.8.3定义正负样本的方式.md @@ -4,7 +4,7 @@ # 1.时序性定义(生成式模型) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnC10uzdj0G0BJPlUZKFIi7C.png) +![](https://cdn.xyxsw.site/boxcnC10uzdj0G0BJPlUZKFIi7C.png) 这是处理音频的一个例子,给模型 t 时刻以前的信息,让它抽取特征并对后文进行预测,真正的后文作为正样本,负样本当然是随便选取就好啦。 @@ -24,4 +24,4 @@ (这篇论文我准备开个新坑放着了,因为说实话不算对比学习,算多模态) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnssaOVvp73SVIrzVvZPr1Je.png) +![](https://cdn.xyxsw.site/boxcnssaOVvp73SVIrzVvZPr1Je.png) diff --git a/4.人工智能/4.6.8.4MoCo.md b/4.人工智能/4.6.8.4MoCo.md index 1d633dd..e048089 100644 --- a/4.人工智能/4.6.8.4MoCo.md +++ b/4.人工智能/4.6.8.4MoCo.md @@ -24,7 +24,7 @@ NCE 把所有负样本都视作一样的,但实际上负样 右边就是 memory bank 啦 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnKMjslIshEA5SFqc8rbmqoe.png) +![](https://cdn.xyxsw.site/boxcnKMjslIshEA5SFqc8rbmqoe.png) # MoCo 做出的改进 @@ -38,7 +38,7 @@ NCE 把所有负样本都视作一样的,但实际上负样 动量编码器是独立于原编码器的一个编码器,它的参数是根据原编码器动量更新的,k 和 q 就是指代全部参数了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnFLSP9PtQRkgYgcMwM4idog.png) +![](https://cdn.xyxsw.site/boxcnFLSP9PtQRkgYgcMwM4idog.png) 这样的话就是解码器在缓慢更新,比对特征使用动量更新要更有连续性。 @@ -48,7 +48,7 @@ NCE 把所有负样本都视作一样的,但实际上负样 [(什么?你看到这了还不会交叉熵?戳这里)](https://zhuanlan.zhihu.com/p/149186719) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnnWI38bkSzeCe5TtVTBCrNh.png) +![](https://cdn.xyxsw.site/boxcnnWI38bkSzeCe5TtVTBCrNh.png) q·k 其实就是各个特征(因为那时候用的都是 transformer 了,这里就是 trnasformer 里的 k 和 q) @@ -56,9 +56,9 @@ q·k 其实就是各个特征(因为那时候用的都是 transformer 了, T 越大,损失函数就越对所有负样本一视同仁,退化为二分类的 NCEloss;T 越小,损失函数就越关注一些难分类的特征,但有时候会出现两张其实都是猫猫的图片,你硬要让模型说猫猫跟猫猫不一样,这也不太好,这个参数要根据数据集情况适中调整。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhuabU9XzXmVQfu0ruENs83.png) +![](https://cdn.xyxsw.site/boxcnhuabU9XzXmVQfu0ruENs83.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnsGpqCNePn2G34GnJqPieBf.png) +![](https://cdn.xyxsw.site/boxcnsGpqCNePn2G34GnJqPieBf.png) 上面那张是 T 较大的情况,下面是 T 较小的情况(x 轴是各个类别,y 轴是分类得分) diff --git a/4.人工智能/4.6.8.5SimCLR.md b/4.人工智能/4.6.8.5SimCLR.md index 07c49fa..7721627 100644 --- a/4.人工智能/4.6.8.5SimCLR.md +++ b/4.人工智能/4.6.8.5SimCLR.md @@ -6,7 +6,7 @@ x 是输入的图片,它经过两种不同的数据增强得到 xi 和 xj 两个正样本,而同一个 mini-batch 里的所有其他样本都作为负样本。说白了还是个体判别任务 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnq5TYzSltn6CsPM3Bn3xxAb.png) +![](https://cdn.xyxsw.site/boxcnq5TYzSltn6CsPM3Bn3xxAb.png) 左右的f 都是编码器,并且是完全一致共享权重的,可以说是同一个。 @@ -18,7 +18,7 @@ x 是输入的图片,它经过两种不同的数据增强得到 xi 和 xj 两 下面这个是更加具体的流程图 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnj3FZsRiJbWsKW07b9B8Fkb.png) +![](https://cdn.xyxsw.site/boxcnj3FZsRiJbWsKW07b9B8Fkb.png) # 总结 diff --git a/4.人工智能/4.6.8.6SwAV.md b/4.人工智能/4.6.8.6SwAV.md index bbfd152..9d270fe 100644 --- a/4.人工智能/4.6.8.6SwAV.md +++ b/4.人工智能/4.6.8.6SwAV.md @@ -20,7 +20,7 @@ 下图左边是常规的对比学习(比如 SimCLR)的结构,右图是 SWAV 的结构,不难看出多了一个叫 prototypes 的东西。这个东西其实是聚类中心向量所构成的矩阵。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnGteJZelEtVqBFwwukw7c8g.png) +![](https://cdn.xyxsw.site/boxcnGteJZelEtVqBFwwukw7c8g.png) 下面的内容可能有些理解上的难度(反正我第一次听讲解的时候就云里雾里的),我会尽可能直白地描述这个过程。 @@ -40,7 +40,7 @@ 而我们的优化要采用 [K-means](https://zhuanlan.zhihu.com/p/78798251)(不懂可以看这里)的类似做法,先对聚类中心进行优化,再对特征进行优化。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnKe4DzDfdNbhhHowdE4BJEf.png) +![](https://cdn.xyxsw.site/boxcnKe4DzDfdNbhhHowdE4BJEf.png) so,why?相信你现在肯定是一脸懵,不过别急,希望我能为你讲懂。 diff --git a/4.人工智能/4.6.8.7BYOL.md b/4.人工智能/4.6.8.7BYOL.md index fd53f56..fbfd220 100644 --- a/4.人工智能/4.6.8.7BYOL.md +++ b/4.人工智能/4.6.8.7BYOL.md @@ -18,7 +18,7 @@ predictor的模型结构就是跟 z 一样的mlp 层。它的任务是通过紫色的特征去预测粉色的特征。也就是说它的代理任务换成了生成式。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcne7eizRhw5GKRSpF40KcMEh.png) +![](https://cdn.xyxsw.site/boxcne7eizRhw5GKRSpF40KcMEh.png) 而具体的损失只有预测特征和真实特征的损失,用的是MSEloss。 @@ -32,7 +32,7 @@ ### 有篇博客在复现 BYOL 时,不小心没加这个 BN 层,导致模型直接摆烂。那么 BN 到底藏着什么呢? -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn8wfpZCjOD2lFsM03N5vatl.png) +![](https://cdn.xyxsw.site/boxcn8wfpZCjOD2lFsM03N5vatl.png) 我们得先来回顾一下 BN 做了什么。 @@ -52,7 +52,7 @@ BN 根据批次的均值和方差进行归一化   这篇论文叫 BYOL works even without batch statistics,即在没有 BN 的时候 BYOL 照样能工作,详细的消融实验结果如下表所示 : -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcncmJWb99mlUUIFTPjGoCqYb.png) +![](https://cdn.xyxsw.site/boxcncmJWb99mlUUIFTPjGoCqYb.png) BN 非常关键:只要是 `projector`(SimCLR 提出的 mlp)中没有 BN 的地方,SimCLR 性稍微下降;但是 BYOL 全都模型坍塌了。 diff --git a/4.人工智能/4.6.8.8SimSiam.md b/4.人工智能/4.6.8.8SimSiam.md index 98fe5f1..f9480a1 100644 --- a/4.人工智能/4.6.8.8SimSiam.md +++ b/4.人工智能/4.6.8.8SimSiam.md @@ -20,7 +20,7 @@ BYOL 之后,大家都发现对比学习是靠许许多多的小 trick 和技 虽然看起来只有左边预测右边,其实右边也有一个 predictor 去预测左边的特征,两边是对称的,左右的优化有先后顺序。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnWk5QzvbsSNlyV4B7SMt5zb.png) +![](https://cdn.xyxsw.site/boxcnWk5QzvbsSNlyV4B7SMt5zb.png) 结构其实没什么特殊的地方,主要讲讲思想。 @@ -44,7 +44,7 @@ BYOL 之后,大家都发现对比学习是靠许许多多的小 trick 和技 这是作者总结的所有”孪生网络“的模型结构,很精炼。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn8OWwnN8ae2vUVttqlu5O8e.png) +![](https://cdn.xyxsw.site/boxcn8OWwnN8ae2vUVttqlu5O8e.png) 下面是这些网络训练结果的对比,也列出了它们分别有哪些 trick(用的是分类任务) @@ -52,8 +52,8 @@ BYOL 之后,大家都发现对比学习是靠许许多多的小 trick 和技 负样本 动量编码器 训练轮数 ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3uizAKNhAxQryOwvHxFSDb.png) +![](https://cdn.xyxsw.site/boxcn3uizAKNhAxQryOwvHxFSDb.png) 具体结果还是图片比较直观( -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnqdfrOIxim4wBayDDBitHCd.png) +![](https://cdn.xyxsw.site/boxcnqdfrOIxim4wBayDDBitHCd.png) diff --git a/4.人工智能/4.6.8.9MoCo v3.md b/4.人工智能/4.6.8.9MoCo v3.md index f849189..e3e0ecc 100644 --- a/4.人工智能/4.6.8.9MoCo v3.md +++ b/4.人工智能/4.6.8.9MoCo v3.md @@ -10,7 +10,7 @@ MoCo v3,它缝合了 MoCo 和 SimSiam,以及新的骨干网络 VIT。 可能因为和前面的工作太像了,作者就没有给模型总览图,我们借 MoCo 的总览图来讲 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnhxg4HZw2NExIbYZxQGISze.png) +![](https://cdn.xyxsw.site/boxcnhxg4HZw2NExIbYZxQGISze.png) 总体架构其实没有太多变化,还是 memory bank 的结构,右边也还是动量编码器,不过加入了 SimCLR 提出的 projection head(就是额外的那层 mlp),并且在对比上用了 SimSiam 的预测头对称学习方式。具体也不展开了,都是老东西缝合在一起。 @@ -18,11 +18,11 @@ MoCo v3,它缝合了 MoCo 和 SimSiam,以及新的骨干网络 VIT。 作者在用 VIT 做骨干网络训练的时候,发现如下问题: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnMMhbVk6wc81H8BSoack7Mg.png) +![](https://cdn.xyxsw.site/boxcnMMhbVk6wc81H8BSoack7Mg.png) 在使用 VIT 训练的时候,batchsize 不算太大时训练很平滑,但是一旦 batchsize 变大,训练的图像就会出现如上图这样的波动。于是作者去查看了每一层的梯度,发现问题出在VIT 的第一层线性变换上。也就是下图中的粉色那个层,把图片打成 patch 后展平做的线性变换。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniBkiypcv6IQbxr9D6JukOb.png) +![](https://cdn.xyxsw.site/boxcniBkiypcv6IQbxr9D6JukOb.png) 在这一层中,梯度会出现波峰,而正确率则会突然下跌。 diff --git a/4.人工智能/4.6.9.3基本概念介绍.md b/4.人工智能/4.6.9.3基本概念介绍.md index c4c7761..227f026 100644 --- a/4.人工智能/4.6.9.3基本概念介绍.md +++ b/4.人工智能/4.6.9.3基本概念介绍.md @@ -4,13 +4,13 @@ ## 强化学习的基本过程 前面已经介绍过强化学习的核心过程,在于智能体与环境进行交互,通过给出的奖励反馈作为信号学习的过程。简单地用图片表示如下: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/4.6.9.3.1.png) +![](https://cdn.xyxsw.site/4.6.9.3.1.png) 正是在这个与环境的交互过程中,智能体不断得到反馈,目标就是尽可能地让环境反馈的奖励足够大。 ## 强化学习过程的基本组成内容 为了便于理解,我们引入任天堂经典游戏——[新超级马里奥兄弟U](https://www.nintendoswitch.com.cn/new_super_mario_bros_u_deluxe/pc/index.html),作为辅助理解的帮手。作为一个2D横向的闯关游戏,它的状态空间和动作空间无疑是简单的。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/4.6.9.3.2.png) +![](https://cdn.xyxsw.site/4.6.9.3.2.png) 1.智能体(Agent):它与环境交互,可以观察到环境并且做出决策,然后反馈给环境。在马里奥游戏中,能操控的这个马里奥本体就是智能体。 @@ -22,7 +22,7 @@ 5.策略(Policy):智能体采取动作的规则,分为**确定性策略**与**随机性策略**。确定性策略代表在相同的状态下,智能体所输出的动作是唯一的。而随机性策略哪怕是在相同的状态下,输出的动作也有可能不一样。这么说有点过于抽象了,那么请思考这个问题:在下面这张图的环境中,如果执行确定性策略会发生什么?(提示:着重关注两个灰色的格子) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/4.6.9.3.3.png) +![](https://cdn.xyxsw.site/4.6.9.3.3.png) 因此,在强化学习中我们一般使用随机性策略。随机性策略通过引入一定的随机性,使环境能够被更好地探索。同时,如果策略固定——你的对手很容易能预测你的下一步动作并予以反击,这在博弈中是致命的。 随机性策略$\pi$定义如下: diff --git a/4.人工智能/SRT.md b/4.人工智能/SRT.md index e3f6dce..5b20f2d 100644 --- a/4.人工智能/SRT.md +++ b/4.人工智能/SRT.md @@ -2,7 +2,7 @@ SRT 社团,全名 Student Research Trainning,旨在通过真正的科研活动培养本科生的科研能力。SRT 社团依托 [智能信息处理处理实验室](http://iipl.net.cn/index/list_team.aspx)(IIPL),主要研究方向围绕人工智能,具体来说,包括:计算机视觉,多模态,3D 视觉,Slam 等领域。有充足且优质的显卡资源,工位资源,以及学长学姐,老师的指导。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Am3Iwb1ggnyUkB1b9osh.png) +![](https://cdn.xyxsw.site/Am3Iwb1ggnyUkB1b9osh.png) 社团每年都在全校范围为智能信息处理实验室招收,培养本科生。本科生进入实验室后跟随导师独立或合作进行科研项目,发表论文。我们届时会在自动化以及通信学院进行宣讲招新,新生在经过1-2学期的培养后,能够具备独立科研的能力。在正式进入实验室前,可以暂时使用社团的工位,进入实验室后可以拥有独立工位以及显卡资源。社团的实验室在科技馆五楼,欢迎大家常来 ~ @@ -12,4 +12,4 @@ SRT 社团,全名 Student Research Trainning,旨在通过真正的科研活 当然,在学习人工智能模块时遇到任何问题也都可以咨询我们,我们将在能力范围内尽力给各位解答! -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/srt2023newqqgroup.png) +![](https://cdn.xyxsw.site/srt2023newqqgroup.png) diff --git a/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md b/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md index 1faca46..7879620 100644 --- a/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md +++ b/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md @@ -8,7 +8,7 @@ 这不是因为那些人没有完全入门嵌入式,而是因为在嵌入式的学习过程中你会发现,它的概念会越来越大,逐渐模糊了你的认知,就拿一张某乎上的照片而言: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcny07MPlh99IIS5yxAdL4iDb.png) +![](https://cdn.xyxsw.site/boxcny07MPlh99IIS5yxAdL4iDb.png) 可见嵌入式的概念之广。 @@ -20,7 +20,7 @@ 这玩意儿大家估计不陌生,比如你去酒店里,也许会有一个可以坐电梯上下楼层来完成特定任务的机器人(说实话高二在某季酒店第一次见的时候还蛮新鲜) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn99MPmacSrXPkIgQ13FLABc.jpg) +![](https://cdn.xyxsw.site/boxcn99MPmacSrXPkIgQ13FLABc.jpg) 而它也是一个嵌入式产品(或者说它们)。 diff --git a/5.富有生命的嵌入式/5.2New meaning of C.md b/5.富有生命的嵌入式/5.2New meaning of C.md index 2389768..42117e4 100644 --- a/5.富有生命的嵌入式/5.2New meaning of C.md +++ b/5.富有生命的嵌入式/5.2New meaning of C.md @@ -83,15 +83,15 @@ ORG 0BH 下面引入一个 STM32F1 系列的 GPIO 部分寄存器图(来源正点原子提供的 F1 参考手册): -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/MyDMbeCKLowC1Mx7Q6Ec9BLPn4g.png) +![](https://cdn.xyxsw.site/MyDMbeCKLowC1Mx7Q6Ec9BLPn4g.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/LJ1SbFfv6oUIgtx8CstcbWTNnRg.png) +![](https://cdn.xyxsw.site/LJ1SbFfv6oUIgtx8CstcbWTNnRg.png) 如果我们想做一个简单的实验-驱动一个 LED 灯(假设此 LED 灯以 PB5 为输出驱动口),在对相应的 RCC 时钟等配置之外,最重要的是对相应的 GPIO 口的配置,首先我们查阅其寄存器的物理起始地址: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/CZ3cbiEhsoWDgJxhwXIcpUkAnMg.png) +![](https://cdn.xyxsw.site/CZ3cbiEhsoWDgJxhwXIcpUkAnMg.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/HTFUbsQCNouQVzx0QYiciQWOnZf.png) +![](https://cdn.xyxsw.site/HTFUbsQCNouQVzx0QYiciQWOnZf.png) 可见 GPIO 外设通过 APB2 总线进行地址定位与传输数据的,所以我们要控制 PB5 的话首先需要定位到对应的地址: diff --git a/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!.md b/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!.md index a5ee4b4..3e8d5cf 100644 --- a/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!.md +++ b/5.富有生命的嵌入式/5.3还玩裸机?上操作系统!.md @@ -16,13 +16,13 @@ RTOS 中最重要的概念则是“任务”。 我们可以回想一下在 MCU 开发过程中,一般都是在 main 函数里做个 while(1)来完成大部分的处理,将一些相对来说对实时性要求高的函数(如 PID 控制器)扔到定时器中断当中,即应用程序是个无限的循环,是个单任务系统(前后台系统),while(1)作为后台,中断服务函数作为前台。这里采用了“正点原子”的一张图: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnFySF1Cd02I052V0a9glH1c.png) +![](https://cdn.xyxsw.site/boxcnFySF1Cd02I052V0a9glH1c.png) 而 RTOS 则是一个多任务系统,那么它这么做有什么好处呢? 2>1 嘛(乐),实际上在前后台系统中,你的每项 Task 要轮流排队等着上次 Task 执行结束后再进行自己的程序,大大影响了其系统的实时性要求;而 RTOS 中我们把整个 while(1)区分成了很多小任务,并且在表面上看起来这些任务运行起来像是同时进行,实际上是因为任务所需的时间较少导致它看起来像是并行,但这将会带来新的疑问,到底什么任务先执行呢?RTOS 就为此提供了任务的相关 API 接口,赋予任务相应的执行优先级属性,并通过任务调度器来控制任务的执行顺序。这里同样采用了“正点原子”的一张图: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcntQgR61yRboDpyb1bpI10Xp.png) +![](https://cdn.xyxsw.site/boxcntQgR61yRboDpyb1bpI10Xp.png) 所以,其实可以这么说:RTOS 将整个流程变成了很多个 while(1)【每个任务都是个 while(1)】。 @@ -66,7 +66,7 @@ int main(){ 由于硬件技术的飞速发展,针对于机器人软件设计的框架也面临着极大的挑战,而 ROS 的出现无异是所有机器人开发者的福音,因为如果按照以前的制作一个机器人流程来讲,也许你要经历以下步骤:硬件结构搭建、控制处理、相关算法构建等等,但是 ROS 的开源共享模式令其可以在其平台上巧妙利用别人的开源模型完成自己的机器人搭建,也就是说 Ros 的出现打破了原本各个开发者(或团队)闭门造车的开发现象,使得其可以共享优秀的机器人应用软件,换句话说就是提高了机器人研发的软件复用率。(毕竟哪个团队都不可能同时在建图、导航、视觉等机器人应用方面处于顶尖位置) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnRy7E27xggqNshXX3cu4J5Q.png) +![](https://cdn.xyxsw.site/boxcnRy7E27xggqNshXX3cu4J5Q.png) 由于 ROS 中完成度最高的是 Ubuntu,所以我们建议你以此展开学习,当然你也可以选择 macOS、Debian 等 OS。 diff --git a/5.富有生命的嵌入式/5.富有生命的嵌入式.md b/5.富有生命的嵌入式/5.富有生命的嵌入式.md index 7c88e20..0fd5f17 100644 --- a/5.富有生命的嵌入式/5.富有生命的嵌入式.md +++ b/5.富有生命的嵌入式/5.富有生命的嵌入式.md @@ -16,6 +16,6 @@ Author:肖扬 > “点星星之火,燃燎原之势,热血芳华,理想当燃” -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3t2GyLQqe4RpGdRtakcwBc.png) +![](https://cdn.xyxsw.site/boxcn3t2GyLQqe4RpGdRtakcwBc.png) ps:若对此部分讲义有相关疑问或者建议,欢迎 QQ 联系-1213047454 diff --git a/6.计算机安全/6.1.1SQL 注入.md b/6.计算机安全/6.1.1SQL 注入.md index d89e491..9a8242d 100644 --- a/6.计算机安全/6.1.1SQL 注入.md +++ b/6.计算机安全/6.1.1SQL 注入.md @@ -34,7 +34,7 @@ def check_pass(username, password): 从 `users` 表中查出 `username` 对应的 `password` 的哈希值,将其与用户传入的密码哈希值进行比对,若相等则意味着用户传入的密码与数据库中储存的密码相吻合,于是返回准许登录 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnHiNBWN86AR4AvSSsUVwSWb.png) +![](https://cdn.xyxsw.site/boxcnHiNBWN86AR4AvSSsUVwSWb.png) 那么问题来了,在语句 @@ -144,7 +144,7 @@ mysql> select group_concat(id,username separator '_') from users; 现在我们传入 `Liki4'` 这个字符串 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn8TrpE02fnPV7dFzkmnHiAe.png) +![](https://cdn.xyxsw.site/boxcn8TrpE02fnPV7dFzkmnHiAe.png) 很遗憾,报错了,这个查询因为 SQL 语句存在语法错误而无法完成。 @@ -154,7 +154,7 @@ mysql> select group_concat(id,username separator '_') from users; 那如果我们传入 `Liki4';#` 这个字符串,那么在拼接后的查询又是什么结果呢 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbAKreqEeZxOYQuQMtZbd9d.png) +![](https://cdn.xyxsw.site/boxcnbAKreqEeZxOYQuQMtZbd9d.png) 很显然,`#` 号将原本语句的 `';` 注释掉了 @@ -166,7 +166,7 @@ mysql> select group_concat(id,username separator '_') from users; `raw_sql_danger' UNION SELECT password FROM users WHERE username = 'Liki5';#` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcniDohuM3F8FbMqz7YSC0Y5g.png) +![](https://cdn.xyxsw.site/boxcniDohuM3F8FbMqz7YSC0Y5g.png) 真是惊人的壮举!我完全不认识这个叫 Liki5 的家伙,但我居然知道了他的密码对应的哈希值! @@ -273,7 +273,7 @@ if __name__ == "__main__": 接下来我们进行一次常规查询 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnpCCmEi6LIKNi0UqEkXfJ8g.png) +![](https://cdn.xyxsw.site/boxcnpCCmEi6LIKNi0UqEkXfJ8g.png) 可以看到我们成功从数据库中查出了 `username` 和 `password`,并显示在返回中 @@ -293,7 +293,7 @@ def query(username): ... ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbaW15gnJc1O9Iv9WXqJxPc.png) +![](https://cdn.xyxsw.site/boxcnbaW15gnJc1O9Iv9WXqJxPc.png) 可以看到,实际执行的语句为 @@ -307,7 +307,7 @@ SELECT * FROM users WHERE username = '123' UNION SELECT 1, 2;#' 构造语句 `123' UNION SELECT DATABASE(), @@version;#` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnDeDp5yPE7W4KX9ByBl9ovh.png) +![](https://cdn.xyxsw.site/boxcnDeDp5yPE7W4KX9ByBl9ovh.png) 我们就能看到返回中包含了当前数据库名与当前数据库版本 @@ -317,13 +317,13 @@ SELECT * FROM users WHERE username = '123' UNION SELECT 1, 2;#' > `information_schema` 库是一个 MySQL 内置数据库,储存了数据库中的一些基本信息,比如数据库名,表名,列名等一系列关键数据,SQL 注入中可以查询该库来获取数据库中的敏感信息。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnkwvSnhKBhlHNLOSthgul9d.png) +![](https://cdn.xyxsw.site/boxcnkwvSnhKBhlHNLOSthgul9d.png) 我们可以发现,当前数据库中还存在一张叫 `secret` 的表,让我们偷看一下里面存的是什么 构造语句 `123' UNION SELECT 1, secret_string FROM secret;#` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn3kfhJ79ByNML2Z1Q1MwRye.png) +![](https://cdn.xyxsw.site/boxcn3kfhJ79ByNML2Z1Q1MwRye.png) 好像得到了什么不得了的秘密 :-) @@ -363,7 +363,7 @@ if __name__ == "__main__": 这样一来我们就只能知道自己是否登录成功,并不能看到查询返回的结果了 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcn2seUNESHkLC9PYvDp0vFbe.png) +![](https://cdn.xyxsw.site/boxcn2seUNESHkLC9PYvDp0vFbe.png) 那也就是说,我们无法直观地查看数据库中的数据了,即便查出了不该查的也看不到了 :-( @@ -396,7 +396,7 @@ else: > rlike 是 MySQL 中的一个关键字,是 regex 和 like 的结合体 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJEeAKow3ZhUSvbL4FQXxOh.png) +![](https://cdn.xyxsw.site/boxcnJEeAKow3ZhUSvbL4FQXxOh.png) 这里实际执行的语句就变成了 @@ -404,13 +404,13 @@ else: SELECT password FROM users WHERE username = 'Liki4' AND if(@@version rlike '^5',1,0); ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJ3jImTQcMUOWJclTACj74e.png) +![](https://cdn.xyxsw.site/boxcnJ3jImTQcMUOWJclTACj74e.png) ```sql SELECT password FROM users WHERE username = 'Liki4' AND if(@@version rlike '^8',1,0); ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnEDPFbKQ6iaM5WhHWUWmI5d.png) +![](https://cdn.xyxsw.site/boxcnEDPFbKQ6iaM5WhHWUWmI5d.png) 也就是说,当 if 语句中的条件为真时,这个查询才会将 password 查询出来 @@ -480,7 +480,7 @@ if __name__ == "__main__": exp() ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnXyMaLh26lkNuAPiQVHuaNg.png) +![](https://cdn.xyxsw.site/boxcnXyMaLh26lkNuAPiQVHuaNg.png) #### @@ -523,7 +523,7 @@ if __name__ == "__main__": 如果想要让布尔盲注不可用,我们可以做一个假设,假设我们并不知道账户的密码,也就无法通过登陆验证,这个时候就失去了布尔盲注最大的依赖,也就无法得知 if 表达式的真或假了。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcndxf4WEQQQEXspS7GwNKI6J.png) +![](https://cdn.xyxsw.site/boxcndxf4WEQQQEXspS7GwNKI6J.png) 但,真的没办法了吗? @@ -600,7 +600,7 @@ if __name__ == "__main__": exp() ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnsStdHC5VmBylyx6S7hakEb.png) +![](https://cdn.xyxsw.site/boxcnsStdHC5VmBylyx6S7hakEb.png) ### 基于报错的 SQL 注入 (TODO) @@ -640,7 +640,7 @@ if __name__ == "__main__": main() ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnl67uDDSIdh3J7y7Jxjk0dc.png) +![](https://cdn.xyxsw.site/boxcnl67uDDSIdh3J7y7Jxjk0dc.png) 这样一来如果 SQL 语句执行报错的话,错误信息就会被打印出来 @@ -671,9 +671,9 @@ MySQL 8.0 doc: [https://dev.mysql.com/doc/refman/8.0/en/](https://dev.mysql.com/ `Liki4';INSERT INTO users VALUES ('Liki3','01848f8e70090495a136698a41c5b37406968c648ab12133e0f256b2364b5bb5');#` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnrMIc2m6oubxC86CEtw1jMe.png) +![](https://cdn.xyxsw.site/boxcnrMIc2m6oubxC86CEtw1jMe.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnVRdntvakiTpt7nP8JhKKfc.png) +![](https://cdn.xyxsw.site/boxcnVRdntvakiTpt7nP8JhKKfc.png) INSERT 语句也被成功执行了,向数据库中插入了 Liki3 的数据 @@ -776,7 +776,7 @@ INSERT 语句也被成功执行了,向数据库中插入了 Liki3 的数据 在 GB2312、GBK、GB18030、BIG5、Shift_JIS 等编码下来吃掉 ASCII 字符的方法,可以用来绕过 `addslashes()` `id=0%df%27%20union%20select%201,2,database();` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnaRtyUGC0sX3btnFIgpDCob.png) +![](https://cdn.xyxsw.site/boxcnaRtyUGC0sX3btnFIgpDCob.png) ### information_schema 被过滤 @@ -795,7 +795,7 @@ select table_name from mysql.innodb_index_stats where database_name=database select table_name from mysql.innodb_table_stats where database_name=database(); ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbMtjAq8osStjcSbFuIdDSc.png) +![](https://cdn.xyxsw.site/boxcnbMtjAq8osStjcSbFuIdDSc.png) ##### MySQL 5.7 的新特性 @@ -812,7 +812,7 @@ select table_name from sys.schema_table_statistics_with_buffer where table_schem select table_name from sys.x$schema_table_statistics_with_buffer where table_schema=database(); ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnV68mdIQmovJwczDsOc53gc.png) +![](https://cdn.xyxsw.site/boxcnV68mdIQmovJwczDsOc53gc.png) ### 无列名注入 @@ -820,7 +820,7 @@ select table_name from sys.x$schema_table_statistics_with_buffer where table_sch `select a,b from (select 1 as a, 2 as b union select * from users)x;` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnI3jJNlLqq4f7WqRKGEWTeh.png) +![](https://cdn.xyxsw.site/boxcnI3jJNlLqq4f7WqRKGEWTeh.png) ## 超脱 MySQL 之外 (TODO) diff --git a/6.计算机安全/6.2.1基础工具的使用.md b/6.计算机安全/6.2.1基础工具的使用.md index 54122fd..3b794ea 100644 --- a/6.计算机安全/6.2.1基础工具的使用.md +++ b/6.计算机安全/6.2.1基础工具的使用.md @@ -12,7 +12,7 @@ IDA pro 是收费软件,价格极其昂贵,一套完全版人民币 10W 左 ## 0x00 IDA 简单介绍 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809113855166.png) +![](https://cdn.xyxsw.site/image-20220809113855166.png) IDA是一款交互式反汇编和反编译工具,其支持文件类型和文件平台丰富。 @@ -20,7 +20,7 @@ IDA是一款交互式反汇编和反编译工具,其支持文件类型和文 ## 0x01 启动界面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809114834244.png) +![](https://cdn.xyxsw.site/image-20220809114834244.png) ``` NEW:打开IDA同时弹出对话框选择要打开的文件 @@ -30,15 +30,15 @@ Previous,或者下面的列表项:快速打开之前的的文件 这里选择Go键,打开以后,将文件拖入 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809124156697.png) +![](https://cdn.xyxsw.site/image-20220809124156697.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809124408179.png) +![](https://cdn.xyxsw.site/image-20220809124408179.png) 这里按我们的默认选项点击OK即可 ## 0x02 关闭界面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809125554853.png) +![](https://cdn.xyxsw.site/image-20220809125554853.png) ``` 第一个选项:就是不打包数据包文件,那么这些数据库文件就会分开这放。 @@ -53,15 +53,15 @@ Previous,或者下面的列表项:快速打开之前的的文件 反汇编代码的图表窗口 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809130857159.png) +![](https://cdn.xyxsw.site/image-20220809130857159.png) 按**空格键**切换成文本结构的反汇编 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809130940294.png) +![](https://cdn.xyxsw.site/image-20220809130940294.png) 按**F5**进行反编译跳转至`Pseudocode`(伪代码)界面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809131038284.png) +![](https://cdn.xyxsw.site/image-20220809131038284.png) 然后就可以分析代码逻辑了 @@ -71,19 +71,19 @@ Previous,或者下面的列表项:快速打开之前的的文件 十六进制窗口(不太常用) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809132027773.png) +![](https://cdn.xyxsw.site/image-20220809132027773.png) ## 0x05 主界面-Structures 结构体窗口 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809132130778.png) +![](https://cdn.xyxsw.site/image-20220809132130778.png) ## 0x06 主界面-Enums 枚举类型界面 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809132242739.png) +![](https://cdn.xyxsw.site/image-20220809132242739.png) ## 0x07 主界面-Imports @@ -91,23 +91,23 @@ Previous,或者下面的列表项:快速打开之前的的文件 可以查看当前模块用了哪些模块的哪些函数 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809132327043.png) +![](https://cdn.xyxsw.site/image-20220809132327043.png) ## 0x08 主界面-Exports 导出表 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809151050575.png) +![](https://cdn.xyxsw.site/image-20220809151050575.png) ## 0x09 主界面-Strings 按`Shift+F12`转到`String`界面,该操作会搜索程序中的字符串数据并展示 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809153126737.png) +![](https://cdn.xyxsw.site/image-20220809153126737.png) 按`Ctrl+F`后输入想要检索的字符可以快速搜索字符串 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809153408536.png) +![](https://cdn.xyxsw.site/image-20220809153408536.png) ## 0x0a 其他界面-Functions @@ -115,7 +115,7 @@ Previous,或者下面的列表项:快速打开之前的的文件 其中一般来说`main`是程序的主要函数 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809151328885.png) +![](https://cdn.xyxsw.site/image-20220809151328885.png) ## 0x0b 其他界面-Output @@ -125,13 +125,13 @@ Previous,或者下面的列表项:快速打开之前的的文件 另外还可以直接在下面输入python语句,方便在ida使用过程中简单的数据处理 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809151536894.png) +![](https://cdn.xyxsw.site/image-20220809151536894.png) ## 0x0c 其他界面-导航栏 一个二进制文件包括不同的区块,这里显示程序的不同类型数据,不同的颜色代表二进制文件中不同的块 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809151815243.png) +![](https://cdn.xyxsw.site/image-20220809151815243.png) @@ -170,7 +170,7 @@ Previous,或者下面的列表项:快速打开之前的的文件 IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅助操作 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809154742462.png) +![](https://cdn.xyxsw.site/image-20220809154742462.png) 可以参考这篇文章了解常用的接口 @@ -184,17 +184,17 @@ IDA 提供可与其交互的IDA Python接口,可以使用Python做很多的辅 可以先在汇编代码或伪代码界面下断点,然后`F9`选择调试器,这里直接选`Local Windows Debugger` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809160044665.png) +![](https://cdn.xyxsw.site/image-20220809160044665.png) 之后就可以用F7(单步不跳过执行)/F8(单步跳过执行)/F9(继续执行,遇到断点停止)进行调试 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809163138453.png) +![](https://cdn.xyxsw.site/image-20220809163138453.png) ### 调试Linux下的文件 可以先在汇编代码或伪代码界面下断点 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809155352920.png) +![](https://cdn.xyxsw.site/image-20220809155352920.png) 由于Linux下文件调试比较特殊,需要远程起一个服务器运行服务端,这里可以使用**Vmware**或者**WSL2(Windows subsystem Linux)**进行调试 @@ -240,21 +240,21 @@ int main() { ##### 将程序拖入IDA -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809173439491.png) +![](https://cdn.xyxsw.site/image-20220809173439491.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809173548998.png) +![](https://cdn.xyxsw.site/image-20220809173548998.png) ##### F5分析查看伪代码 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809173627488.png) +![](https://cdn.xyxsw.site/image-20220809173627488.png) 发现有`change`和`check`的自定义函数 按`n`修改一下变量名 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174001600.png) +![](https://cdn.xyxsw.site/image-20220809174001600.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174015603.png) +![](https://cdn.xyxsw.site/image-20220809174015603.png) 分别进入里面查看函数逻辑 @@ -262,11 +262,11 @@ int main() { change函数 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174035800.png) +![](https://cdn.xyxsw.site/image-20220809174035800.png) check函数 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174058831.png) +![](https://cdn.xyxsw.site/image-20220809174058831.png) ###### 静态分析逻辑 @@ -280,19 +280,19 @@ change函数是对输入字符串的每一个字节进行修改 随意的进行一些输入 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174913326.png) +![](https://cdn.xyxsw.site/image-20220809174913326.png) 然后断下来 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809174957987.png) +![](https://cdn.xyxsw.site/image-20220809174957987.png) F7进入函数进行单步不跳过调试 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809175413448.png) +![](https://cdn.xyxsw.site/image-20220809175413448.png) 遇到类似`strlen`等库函数可以F8单步调试跳过 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/image-20220809175459668.png) +![](https://cdn.xyxsw.site/image-20220809175459668.png) 可以发现输入字符串的每一个字节的Ascii值都减小了1 diff --git a/6.计算机安全/6.2.2软件破解、软件加固.md b/6.计算机安全/6.2.2软件破解、软件加固.md index aa9c56c..7ec8ecb 100644 --- a/6.计算机安全/6.2.2软件破解、软件加固.md +++ b/6.计算机安全/6.2.2软件破解、软件加固.md @@ -45,7 +45,7 @@ ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP. 还是上一篇的示例, 入口一句 `pushad`, 我们按下 F8 执行 `pushad` 保存寄存器状态, 我们可以在右边的寄存器窗口里发现 `ESP` 寄存器的值变为了红色, 也即值发生了改变. -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJdWqlHmhlvB471dIGT4GEh.png) +![](https://cdn.xyxsw.site/boxcnJdWqlHmhlvB471dIGT4GEh.png) 我们鼠标右击 `ESP` 寄存器的值, 也就是图中的 `0019FF64`, 选择 `HW break[ESP]` 后, 按下 `F9` 运行程序, 程序会在触发断点时断下. 如图来到了 `0040D3B0` 的位置. 这里就是上一篇我们单步跟踪时到达的位置, 剩余的就不再赘述. diff --git a/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md b/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md index e7d0a07..2be07c7 100644 --- a/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md +++ b/6.计算机安全/6.2.3漏洞挖掘、漏洞利用.md @@ -4,7 +4,7 @@ #### 栈介绍 栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/stack.png) +![](https://cdn.xyxsw.site/stack.png) 高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了栈这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,**程序的栈是从进程地址空间的高地址向低地址增长的**。 #### 栈溢出基本原理 @@ -21,7 +21,7 @@ int main() 对于如上程序,运行后可以发现`ch`和`a`的地址相差不大(`a`和`ch`的顺序不一定固定为`a`在前`ch`在后): -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/out1.PNG) +![](https://cdn.xyxsw.site/out1.PNG) 可以发现`ch`和`ch2`刚好差`8`个字节,也就是`ch`的长度。 `ch`只有`8`个字节,那么如果我们向`ch`中写入超过`8`个字节的数据呢?很显然,会从`ch`处发生溢出,写入到`ch2`的空间中,覆盖`ch2`的内容。 @@ -37,7 +37,7 @@ int main() } ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/out2.PNG) +![](https://cdn.xyxsw.site/out2.PNG) 这就是栈溢出的基本原理。 @@ -131,7 +131,7 @@ retn 可以看到其中使用`call`指令来调用`add`函数。那么该指令是如何工作的呢?其实`call`指令相当于`push next_loc;jmp loc`,通过将`call`指令下一行汇编的地址压栈的方式,等到函数调用完再取回,从而从`call`指令的下一行继续执行。由于栈地址从高向低生长,新调用的函数的局部变量生成在返回地址的上方(低地址处),因此如果我们在新函数中使用栈溢出来修改这一返回地址,如果将返回地址修改为某个函数的地址,就可以执行任意函数: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/stack2.png) +![](https://cdn.xyxsw.site/stack2.png) > 注意该图中,使用32位的寄存器(EBP、ESP、EIP),实际原理一样的,并且上方为高地址,下方为低地址 @@ -139,22 +139,22 @@ retn 32位的程序,我们使用IDA来打开该题目,查看反编译代码,可以发现有非常明显的栈溢出: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/main.png) +![](https://cdn.xyxsw.site/main.png) 由于第`8`行`gets`函数并没有检查输入的长度和`s`的长度,我们可以轻易地通过栈溢出来控制`main`函数的返回地址。而在程序中,存在另外一个函数`secure`,在该函数中有一个后门`system("/bin/sh")`,如果我们想办法执行该后门,就可以拿到目标机器的`shell`,从而控制目标计算机。 由于我们需要将返回地址在标准输入中输入待测程序,而返回地址拆分成小端序的字节后经常无法手动输入到待测程序中,所以此处我们使用`pwntools`这一`python`包来方便地进行攻击。 首先查看后门的地址: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/backdoor.png) +![](https://cdn.xyxsw.site/backdoor.png) 接着计算溢出长度,这里我们使用gdb来调试程序,图中的gdb安装了pwndbg插件,该插件在pwn调试时比较好用: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/gdb.png) +![](https://cdn.xyxsw.site/gdb.png) 将断点打在`gets`函数前后,可以看到此时`esp`值为`0xffffcd80`,`ebp`值为`0xffffce08`,在 IDA 中我们又可以看到`s`相对于`esp`的偏移为`+1C`,此时我们即可计算`hex(0xffffcd80+0x1c-0xffffce08)=-0x6C`,即`s`相对于`ebp`的偏移为`0x6C`,由于在`main`函数的开头有`push ebp`的操作,所以将`0x6C`再加`4`,即可到达返回地址处: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/s.png) +![](https://cdn.xyxsw.site/s.png) ```python from pwn import * @@ -165,7 +165,7 @@ sh.sendline(exp) sh.interactive() # 切换为手动交互模式 ``` -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/shell.png) +![](https://cdn.xyxsw.site/shell.png) ##### 0x1 通过上面的学习,我们已经可以知道执行任意函数的办法,但很多情况下,对于攻击者来说,程序中并没有可用的后门函数来达到攻击的目的,因此我们需要一种手段,来让程序执行任意代码(任意汇编代码),这样就可以最高效地进行攻击。ROP(Return Oriented Programming)面向返回编程就是这样的一种技术,在栈溢出的基础上,通过在程序中寻找以retn结尾的小片段(gadgets),来改变某些寄存器、栈变量等的值,再结合Linux下的系统调用,我们就可以执行需要的任意代码。 diff --git a/7.网络应用开发/7.1.1.1基础部分.md b/7.网络应用开发/7.1.1.1基础部分.md index 0a73110..ca6cc8b 100644 --- a/7.网络应用开发/7.1.1.1基础部分.md +++ b/7.网络应用开发/7.1.1.1基础部分.md @@ -43,13 +43,13 @@ 设计稿如下: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnVR5z4U8YlXZbc8beDNEHXc.jpg) +![](https://cdn.xyxsw.site/boxcnVR5z4U8YlXZbc8beDNEHXc.jpg) #### 可能需要用到的图片资源 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnbigxAK5SbxiWuDHr1Ashne.png) +![](https://cdn.xyxsw.site/boxcnbigxAK5SbxiWuDHr1Ashne.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnrqddPFusKhe0vZuzXJOosg.png) +![](https://cdn.xyxsw.site/boxcnrqddPFusKhe0vZuzXJOosg.png) #### 基本要求 @@ -91,9 +91,9 @@ ### 🎫TodoList -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnikdFX5WNml7sgtPMOJQiGh.png) +![](https://cdn.xyxsw.site/boxcnikdFX5WNml7sgtPMOJQiGh.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnFZwQVTUWkfsbNxYfJkgPDg.png) +![](https://cdn.xyxsw.site/boxcnFZwQVTUWkfsbNxYfJkgPDg.png)
一些参考
@@ -119,7 +119,7 @@ - 实现不同设备屏幕尺寸的自适应 - 添加任务热力图(可以参考一下 GitHub 个人主页哦 🤔) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcncVQswB7ziUoV4LvEs35DAe.png) +![](https://cdn.xyxsw.site/boxcncVQswB7ziUoV4LvEs35DAe.png) #### 可能涉及的知识点 diff --git a/7.网络应用开发/7.1.1.2进阶部分.md b/7.网络应用开发/7.1.1.2进阶部分.md index e4526d3..0f59f52 100644 --- a/7.网络应用开发/7.1.1.2进阶部分.md +++ b/7.网络应用开发/7.1.1.2进阶部分.md @@ -10,11 +10,11 @@ 如果你曾经用过助手的小程序,你可能会在首页看到这样的天气卡片: -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnTNJhtqw6Km24fKgAnjZtBS.png) +![](https://cdn.xyxsw.site/boxcnTNJhtqw6Km24fKgAnjZtBS.png) 当然了,平时大家也会用到各种天气 APP -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnUuqMoTjiOH9NSdYx4GCGme.png) +![](https://cdn.xyxsw.site/boxcnUuqMoTjiOH9NSdYx4GCGme.png) 那么,让我们动手实现一个天气卡片吧~ @@ -63,9 +63,9 @@ ## 🎶 音乐播放器 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnRaBolh8i2FkoIJW69a5g3e.png) +![](https://cdn.xyxsw.site/boxcnRaBolh8i2FkoIJW69a5g3e.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnJ13CDzxp9lwEtGivTuJ4nh.png) +![](https://cdn.xyxsw.site/boxcnJ13CDzxp9lwEtGivTuJ4nh.png) 相信你平时或多或少都会听音乐,那么你是喜欢用网易云还是 QQ 音乐呢?或者是系统自带的音乐播放器?不过,其实你也可以自己做一个音乐播放器,来满足你对听音乐这件事的所有幻想,听起来是不是很酷呢 😎~那么,来试试看吧! diff --git a/7.网络应用开发/7.1.1.5附录3:跨端开发.md b/7.网络应用开发/7.1.1.5附录3:跨端开发.md index f5cd32e..96569af 100644 --- a/7.网络应用开发/7.1.1.5附录3:跨端开发.md +++ b/7.网络应用开发/7.1.1.5附录3:跨端开发.md @@ -69,7 +69,7 @@ 它是基于WebView渲染,通过JS Bridge 把一部分系统能力开放给JS调用。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/235436487dsfhtwuytjyfj.png) +![](https://cdn.xyxsw.site/235436487dsfhtwuytjyfj.png) WebView容器的工作原理是基于Web技术来实现界面和功能,通过将原生的接口封装、暴露给JavaScript调用,JavaScript编写的页面可以运行在系统自带的WebView中。这样做的优势是,对于前端开发者比较友好,可以很快地实现页面跨端,同时保留调用**原生的能力**,通过搭建桥接层和原生能力打通。但这种设计,跨端的能力受限于桥接层,当调用之前没有的原生能力时,就需要增加桥。另外,浏览器内核的渲染独立于系统组件,无法保证原生体验,**渲染的效果会差不少**。 @@ -80,7 +80,7 @@ WebView容器的工作原理是基于Web技术来实现界面和功能,通过 浏览器提供了一个容器,屏蔽了底层差异,提供了统一的 api(dom api),这样就可以实现同一份代码跑在不同平台的统一的容器里。这个容器叫做浏览器引擎,由 js 引擎、渲染引擎等构成。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/fdegetyjyrj.png) +![](https://cdn.xyxsw.site/fdegetyjyrj.png) #### PWA 尽管PWA的出现不是为了“跨端”,但他们对于“跨端”的天然支持,能够让一套代码运行在PC、移动两端,就再一次产生了跨端设计实施的可能性。 @@ -107,7 +107,7 @@ PWA 是 Google 于 2016 年提出的概念,于 2017 年正式落地,于 2018 #### Electron -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/wettrjryju.png) +![](https://cdn.xyxsw.site/wettrjryju.png) Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的框架,可构建出兼容 Mac、Windows 和 Linux 三个平台的应用程序。 @@ -123,7 +123,7 @@ Electron 的跨端原理并不难理解:它通过集成浏览器内核,使 #### React Native React Native 是一个由 Facebook 于2015年9月发布的一款开源的 JavaScript 框架,它可以让开发者使用 JavaScript 和 React 来开发跨平台的移动应用。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/eryyjyuj.png) +![](https://cdn.xyxsw.site/eryyjyuj.png) React Native 的思路是最大化地复用前端的生态和 Native 的生态,和 WebView 容器的最大区别在于 View 的渲染体系。React Native 抛弃了低效的浏览器内核渲染,转而**使用自己的 DSL 生成中间格式**,然后映射到对应的平台,**渲染成平台的组件**。相对 WebView 容器,体验会有一定的提升。不过,渲染时需要 JavaScript 和原生之间通信,在有些场景可能会导致卡顿。另外就是,渲染还是在Native层,要求开发人员对Native有一定的熟悉度。 @@ -150,7 +150,7 @@ Flutter与上述Recat Native、WebView容器本质上都是不同的,它没有 微信小程序的渲染层与逻辑层分别由两个线程管理,渲染层的界面使用 webview 进行渲染;逻辑层采用 JSCore运行JavaScript代码。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/rtjyujyu.png) +![](https://cdn.xyxsw.site/rtjyujyu.png) ## 类前端开发:拿过来吧你 @@ -166,7 +166,7 @@ Flutter与上述Recat Native、WebView容器本质上都是不同的,它没有 JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式的开发语言,页面业务逻辑则支持ECMAScript规范的JavaScript语言。JS UI框架提供的类Web编程范式,可以让开发者避免编写UI状态切换的代码,视图配置信息更加直观。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/3465ytyjyjy.png) +![](https://cdn.xyxsw.site/3465ytyjyjy.png) ## 跨端不只是跨端:爱你的全世界 @@ -174,9 +174,9 @@ JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式 ## 什么样的场景可以跨端? 跨端应用能够真正推进下去,除了有技术保障外,还需要合适的需求场景,使用PC端的功能型产品主要是需要大屏带来的“效率”(办公、个人管理、教育)与“沉浸”(数据、金融、游戏、影视)体验。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ertehry.png) +![](https://cdn.xyxsw.site/ertehry.png) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ertjyunyunm.png) +![](https://cdn.xyxsw.site/ertjyunyunm.png) 依赖PC、移动双端进行经营管理的电商场景,也有很多内容适合跨端。 @@ -185,25 +185,25 @@ JS UI框架采用类HTML和CSS Web编程语言作为页面布局和页面样式 1. 双端基础组件设计规则对齐(对前端来说是同类组件API、属性对齐以及组件功能形态映射) -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/ewttrhjy.png) +![](https://cdn.xyxsw.site/ewttrhjy.png) Select对应Picker 1. 布局响应规则(行列变化,聚合变化等); -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/20191118PGkkRz.jpg) +![](https://cdn.xyxsw.site/20191118PGkkRz.jpg) 卡片布局的一种聚合变化 1. 交互形态响应规则(导航、交互模式等); -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/20191118aoefIO.jpg) +![](https://cdn.xyxsw.site/20191118aoefIO.jpg) 表单型弹窗对应新页面 1. 不同场景的跨端策略,例如Dashboard页面的跨端应保证用户在首屏快速获取关键信息,下图的Bootstrap模板是一个错误示例,移动端的布局方式浪费首屏空间,降低用户获取关键信息的效率。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/20191118BrYZzg.jpg) +![](https://cdn.xyxsw.site/20191118BrYZzg.jpg) Mobile first 不是唯一准则。进行具体场景的跨端设计时,我们会从两端场景出发重新对比分析用户的需求差异,明确体验的增强点与折损点。特别是电商中后台场景中:有些业务中用户的主阵地并不是在移动端,而是PC端,比如用户运营策略的设置;有些是两端分别承载不同的场景需求,比如任务的处理。 @@ -217,7 +217,7 @@ Mobile first 不是唯一准则。进行具体场景的跨端设计时,我们 Serverless字面意思是无服务,但并不代表再也不需要服务器了,而是指开发者不需要过多的考虑服务器的问题,计算资源作为服务出现而不是服务器的概念出现。 那么Serverlss,是对全部底层资源和操作的封装,让开发者专注于业务逻辑。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/gfhuewgfuiwe.png) +![](https://cdn.xyxsw.site/gfhuewgfuiwe.png) Serverless = Faas (Function as a service) + Baas (Backend as a service) @@ -254,7 +254,7 @@ Serverless 带来的其实是前端研发模式上的颠覆。相对以往纯前 - 无需在代码内考虑高并发高可靠性,可以专注于业务 - 通过云函数实例的高并发能力,实现业务高并发 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/fhuieufsiofhei.png) +![](https://cdn.xyxsw.site/fhuieufsiofhei.png) #### 自动弹性压缩 @@ -281,7 +281,7 @@ uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编 - 在Android平台,将.uts文件编译为kotlin代码 - 在iOS平台,将.uts文件编译为swift代码 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/uni-function-diagram.png) +![](https://cdn.xyxsw.site/uni-function-diagram.png) 1. 区分页面和组件的区别:页面和组件的生命周期 2. 云函数、云数据库 @@ -298,12 +298,12 @@ uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编 1. Frameless:桌面端不仅仅只有方框矩形,而是想你所想。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/df77f01037fc4ceb8d4aa8f06168fc95~tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif) +![](https://cdn.xyxsw.site/df77f01037fc4ceb8d4aa8f06168fc95~tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif) ## 参考作业 尝试使用某种跨端框架和云函数,实现一个查看课表应用,形式不限。推荐使用hdu-lis包拿到数据。 -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/Snipaste_2023-04-22_18-57-44.png) +![](https://cdn.xyxsw.site/Snipaste_2023-04-22_18-57-44.png) diff --git a/7.网络应用开发/7.1WEB开发入门.md b/7.网络应用开发/7.1WEB开发入门.md index e675321..8c41223 100644 --- a/7.网络应用开发/7.1WEB开发入门.md +++ b/7.网络应用开发/7.1WEB开发入门.md @@ -107,7 +107,7 @@ A:理论上可以。但一般不会这么做(除了一些实时的网络聊 登登登,后端登场! -![](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/boxcnorsQ6py7AU0LsCtn4f5LSd.png) +![](https://cdn.xyxsw.site/boxcnorsQ6py7AU0LsCtn4f5LSd.png) 解释一下: diff --git a/README.md b/README.md index c002acb..6d2d40e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- logo + logo

HDU计算机科学讲义

@@ -51,7 +51,7 @@ zzm 花费了一年的时间动员了大伙对讲义进行修缮和完备,不得不说这确实不是一个小的工作,不过在2023年3月,在计院领导的支持下,计算机学院科协成立了。我们将在学院的支持下继续完善这个内容,同时也欢迎大伙加入我们,共同参与到讲义的学习与撰写中来!

- +
## 学习原则 diff --git a/components/Parallax.vue b/components/Parallax.vue index 9056c31..4f135e3 100644 --- a/components/Parallax.vue +++ b/components/Parallax.vue @@ -39,13 +39,13 @@ const containerStyle: CSSProperties = { const layer0 = computed(() => ({ ...layerBase, - content:'url(https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/hdu-cs-wiki_main.png)', + content:'url(https://cdn.xyxsw.site/hdu-cs-wiki_main.png)', transform: `translateX(${parallax.tilt * 10}px) translateY(${parallax.roll * 10 }px) scale(1)`, })) const layer1 = computed(() => ({ - content:'url(https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/sparkles.gif)', + content:'url(https://cdn.xyxsw.site/sparkles.gif)', userSelect: 'none', "-webkit-user-drag": "none", transform: `translateX(${parallax.tilt * 20}px) translateY(${parallax.roll * 20 diff --git a/wiki史.md b/wiki史.md index bacff61..f36c150 100644 --- a/wiki史.md +++ b/wiki史.md @@ -32,7 +32,7 @@ 在那一轮培训的过程中,晓宇来改作业,我来组织大伙开会和讲一些内容,我们看着很多原本电脑都不会用的同学有机会能接触到世界相较而言很前沿的任务,心里还是很有成就感的。 -![最早的SRT社团培训](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/The%20earliest%20SRT%20community%20training.jpg) +![最早的SRT社团培训](https://cdn.xyxsw.site/The%20earliest%20SRT%20community%20training.jpg) (图一:最早的SRT社团培训) @@ -60,20 +60,20 @@ 于是我当时的计划是,先尽自己所能,将自己在学习过程中踩得坑,走的错误道路都记录下来,然后借鉴南京大学和上海交大的思想,先写一些有指导意义的软文,然后把自己学的 AI 和编程的内容写下来,并且吸取一些国外优质的课程内容。争取做一些更新手友好的内容。写了两个月,将 AI 和编程部分自己的入门经验写出来了,估计输出了数万字。 -![早期Wiki](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/afaaac5d-b99e-4a84-b0ef-862cad4dc1d0.jpg) +![早期Wiki](https://cdn.xyxsw.site/afaaac5d-b99e-4a84-b0ef-862cad4dc1d0.jpg) (早期Wiki) 不过问题很快暴露出来,我作为一个个体是渺小且无力的,而计算机科学的世界是宏伟且庞大的,凭借我一个人,我这辈子写完是没戏了。不过没关系,我在冥冥之中仿佛与战国时期翻手为云,覆手为雨的纵横学家有了心灵感应,是时候发动人民群众的力量了! 在新生到来前的那个暑假,我先后联系了杭电技术最强的几个技术团体的同学,一起参与到 Wiki 的完善工作去,尽可能补齐计算机技术的方方面面,甚至我们找到了杭电最受欢迎的老师之一韩健夫老师为我们写了一篇文章。随着 22 届新生的到来,Wiki 已经初具雏形了,我们依靠新生的反馈,循序渐进地修改内容,并且鼓励新生可以根据自己的学习心得对 Wiki 进行修正。 -![超大规模的22届](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/dcf8ab68-4de4-4af2-898d-bd930f829f9f.jpg) +![超大规模的22届](https://cdn.xyxsw.site/dcf8ab68-4de4-4af2-898d-bd930f829f9f.jpg) (图三:超大规模的22届) 在这个时候,我觉得也许仅仅靠校内的视角,是远远不够的,我们需要一些更为先进的生产力的帮助!这个时候我想到了之前看到过的 Datawhale 的教程,于是我去联系了他们的开源项目负责人和创始人,甚至去了他们在杭州的总部。 -![datawhale杭州](https://pic-hdu-cs-wiki-1307923872.cos.ap-shanghai.myqcloud.com/dc84aef9-a21e-49e2-92f2-63fe1c3671de.jpg) +![datawhale杭州](https://cdn.xyxsw.site/dc84aef9-a21e-49e2-92f2-63fe1c3671de.jpg) 在与他们的沟通过之后备受振奋,有种酒逢知己千杯少的快乐,感觉 Datawhale 这样的社区就是一群我这样的聚集在了一起。我们的理念和思考完全相同,并且他们传递给了我一种力量,一种可以让理想真正落地的力量,一种靠人与人之间互相关怀,互相帮助,通过信任和感情把大伙联系起来。 diff --git a/简介.md b/简介.md index c90c8aa..2145990 100644 --- a/简介.md +++ b/简介.md @@ -31,7 +31,7 @@ 想必在这里,你或多或少都能得到自己的答案!
- +
欢迎加群与学长交流!我们也可以针对你的喜好为你定制一个方案!