├── .gitignore ├── README.md ├── ai-notes.html ├── assets ├── Stack-I.png ├── Stack-II.png ├── eq3,4.png └── eq5,6.png ├── cifar.py ├── cnn.png ├── cnn0.81.h5 ├── cnn_evaluation.png ├── nn.png ├── nn0.52.h5 ├── nn_evaluation.png └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.pdf 2 | *.docx 3 | batches.meta 4 | data_batch_1 5 | data_batch_2 6 | data_batch_3 7 | data_batch_4 8 | data_batch_5 9 | test_batch 10 | image-classification-rnn/* 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #
人工智能导论 - 2019 秋季笔记
Introduction to Artificial Intelligence - 2019 Fall Notes
2 | 3 | > 我们期末考试的题型主要包括了**选择、填空、判断、问答、证明**等题型。大家复习的时候需要多理解老师们在课上讲的关于传统人工智能、博弈论、新人工智能的部分中的**示例**,不需要死记硬背一些概念。其中博弈论部分复习要点为: 4 | > 5 | > 1.**基本概念 博弈 占优策略 纳什均衡 (混合)策略 囚徒困境** 6 | > 7 | > 2.**对抗算法基本原理 minimax 算法 alpha-beta 剪枝 蒙特卡洛树搜索算法** 8 | > 9 | > [HTML formula version 公式整洁版](https://chenwx.com/github/ai-notes.html) 10 | 11 | 求star❤💕💖😘 if you like it! 12 | 13 | ## 人工智能的概念 14 | 15 | - #### 定义 智能机器 16 | 能够在各类环境中自主地或交互地执行各种**拟人任务**(anthropomorphic tasks)的机器。 17 | - #### 定义 1 人工智能 18 | AI 是关于知识的科学,怎样**表示知识**以及怎样**获得知识**并**使用知识**的科学。(Nilsson) 19 | AI 就是研究如何使计算机做过去**只有人才能做**的智能工作。(Winston) 20 | - #### 定义 2 人工智能(学科) 21 | 人工智能(学科)是计算机科学中涉及研究、设计和应用智能机器的一个分支。它的近期主要目标在于研究用机器来**模仿和执行人脑的某些智力功能**,并开发相关理论和技术。 22 | - #### 定义 3 人工智能(能力) 23 | 人工智能(能力)是智能机器所执行的通常与**人类智能有关的智能行为**,如判断、推理、证明、识别、感知、理解、通信、设计、思考、规划、学习和问题求解等思维活动。 24 | - #### 定义 4 25 | 人工智能是一种**使计算机能够思维**,使机器具有智力的激动人心的新尝试(Haugeland,1985)。 26 | - #### 定义 5 27 | 人工智能是那些与人的思维、决策、问题求解和学习等有关**活动的自动化**(Bellman,1978)。 28 | - #### 定义 6 29 | 人工智能是用计算模型研究智力行为 (Charniak 和 McDermott,1985)。 30 | - #### 定义 7 31 | 人工智能是研究那些使理解、推理和行为成为可能的计算(Winston,1992)。 32 | - #### 定义 8 33 | 人工智能是一种能够执行需要人的智能的创造性机器的技术(Kurzwell,1990)。 34 | - #### 定义 9 35 | - 人工智能研究如何使计算机做事让人过得更好(Rick 和 Knight,1991)。 36 | - #### 定义 10 37 | 人工智能是一门通过计算过程力图**理解和模仿智能行为**的学科(Schalkoff,1990)。 38 | - #### 定义 11 39 | 人工智能是计算机科学中与智能行为的自动化有关的一个分支(Luger 和 Stubblefield,1993)。 40 | 41 | > 定义 4 和定义 5 涉及**拟人思维**; 42 | > 定义 6 和定义 7 与**理性思维**有关; 43 | > 定义 8 和定义 9 涉及**拟人行为**; 44 | > 定义 10 和定义 11 与**拟人理性行为**有关。 45 | 46 | AI 研究如何用计算机来**表示和执行**人类的**智能活动**,以**模拟**人脑所从事的推理、学习、思考和规划等**思维活动**,并**解决**需要人类的智力才能处理的**复杂问题**等。AI 还涉及到脑科学、神经生理学、心理学、语言学、逻辑学、认知科学等许多学科领域。是一门综合性的交叉科学和边缘学科。 47 | 48 | > 不属于人工智能: 49 | > 50 | > - 自动控制类 51 | > - 科学计算类 52 | > - 固定了算法的 53 | 54 | #### 强人工智能 _VS_ 弱人工智能 55 | 56 | - 弱人工智能: 某方面人工智能 强 57 | - 强人工智能: 综合的多方面的人工智能 弱 58 | 59 | #### 人工智能的潜力和界限 60 | 61 | - 机器的智能:不管什么计算机,都等价于**图灵机** 62 | - 人的智能:还远远没有认识清楚 63 | 64 | #### 图灵机 65 | 66 | 67 | 68 | - 一台图灵机是是一个数学概念,一个七元**有序**组 69 | | 纸带 | 符号 | 读写头 | 规则 | 状态 | 起始 | 结束 | 70 | | ---- | ---- | ------ | ---- | ---- | ---- | ---- | 71 | | 存储 | 符号 | 读写 | 程序 | 数据 | 开始 | 结束 | 72 | - ##### 停机问题 73 | 74 | - 就是判断任意一个程序是否能在有限的时间之内结束运行的问题 75 | - 等价于是否存在一个程序 P,对于任意输入的程序 w,能够判断 w 会在**有限时间内结束**或者**死循环** 76 | 77 | 78 | 79 | ```python 80 | def halt(func, input): 81 | '''判定函数func在输入input下是否能结束/停机''' 82 | if func(input): return True 83 | else: return False 84 | def Turing(func): 85 | '''返回函数func在输入自己时是否能结束/停机的逆向结果''' 86 | if halt(func, func): return False 87 | else: return True 88 | if Turing(Turing) == True: 89 | ==> halt(Turing, Turing) == False 90 | ==> Turing(Turing) == False 91 | else Turing(Turing) == True: 92 | ==> halt(Turing, Turing) == False 93 | ==> Turing(Turing) == False 94 | ``` 95 | 96 | #### 哥德尔不完备定理 97 | 98 | - 任何**包含自然数定义的形式系统**都是不完全的,也就是存在不能证明为真,也不能证明为假的命题 99 | 100 | #### 可计算性 101 | 102 | - 一个语言$L$是可以被图灵机所枚举(**enumerate**)的,如果存在一个图灵机$M$,使得输入是$L$中的串时,M 输出“接受”;而对非$L$中的串,$M$输出“拒绝”或不停机 103 | - 存在语言$L_d$,是不能被图灵机所枚举的,以及存在语言$L_u$,是不能被图灵机所决定的 104 | 105 | ## 人工智能的三大流派 106 | 107 | #### 符号主义:最经典、接受程度最高的人工智能 108 | 109 | - 把现实的物,映射到代表它的符号,在符号上完成所有的推理、计算等等,如**图灵测试** 110 | 111 | #### 连接主义:新人工智能最红火的部分 112 | 113 | - **神经网络**模型,模拟人脑神经元之间的连接,从而模拟出人脑的功能 114 | - **深度学习**的功能强大,问题也不少 115 | 116 | #### 行为主义:智能来自更低级的感知和行动 117 | 118 | - 波士顿动力公司的机器狗、无人机、群体智能 119 | 120 | ## 人工智能的三个阶段 121 | 122 | #### 早期人工智能:1956 年创立到 80 年代早期 123 | 124 | - 科技贵族的专属品 125 | - 概念、机器定理证明,博弈,机器翻译,模式识别…… 126 | - **摩尔定律**:当价格不变时,集成电路上可容纳的元器件的数目,约每隔 18-24 个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔 18-24 个月翻一倍以上 127 | 128 | #### 中期的人工智能:80 年代到 2010 年 129 | 130 | - 以**专家系统**为代表的,以**知识**为核心 131 | - 偏向控制,介于**自动化和计算机**之间 132 | 133 | #### 新人工智能:近几年开始 134 | 135 | - 介于**计算机**和**软件**之间 136 | 137 | 138 | 139 | ## 人工智能的三次浪潮 140 | 141 | #### 20 世纪 50 年代末至 70 年代初 142 | 143 | 人工智能学科诞生,基于知识的方法和具有初步智能的机器出现。 144 | 由于数学模型存在缺陷,以及计算能力无法完成复杂度呈指数级增长的计算任务,使人工智能发展陷入低谷。 145 | 146 | #### 20 世纪 80 年代初至 90 年代初 147 | 148 | 数学模型实现了重大突破,诞生了多层神经网络、BP 反向传播算法和高度智能机器等。 149 | 由于人工智能计算机的成本与维护难度都较高,限制了其大规模商业应用和普及,使人工智能再次步入低谷。 150 | 151 | #### 21 世纪初至今 152 | 153 | 大数据、算法模型和计算能力的多重突破共同驱动了新一代人工智能的快速发展,尤其是 2006 年深度学习神经网络的提出,使人工智能的性能获得突破性进展,标志着人工智能迎来第三次高速成长期。 154 | 155 | 156 | 157 | #### 新一代人工智能技术的新特点:人机融合,大数据,群体性,自主化,跨媒体 158 | 159 | 160 | 161 | #### 新一代人工智能与前两轮浪潮的本质区别 162 | 163 | - 已经可以**大规模应用于经济社会实践**,给企业带来盈利,给社会管理带来实质性改善。 164 | - 从**学术驱动、研究驱动**转变为**需求驱动和产业驱动**, 企业的研发激励巨大、引领作用显著; 165 | - **企业投资**及**研发主导、政府规划引领**,使新一代人工智能发展正进入良性循环;前两次浪潮中主要依赖**政府资助**。 166 | 167 | 168 | 169 | ## 人工智能的领域 170 | 171 | #### 常见的应用领域 172 | 173 | - 机器定理证明(早期很红火,证明了四色定理) 174 | - 博弈:人工智能的经典问题 175 | - **Alpha GO 成为新人工智能的标志事件**,从 Alpha Go 到 Alpha Go Zero 到 Alpha Zero 176 | - 模式识别:声图文 177 | - 视频图像(目标跟踪、视频理解、检索等等) 178 | - 静态图像(人脸识别、图像理解、检索等等) 179 | - 声音识别(内容识别、声纹识别、语音矫正、语音合成、检索等) 180 | - 文字识别(手写、联机手写、印刷体、多语种等等) 181 | - 自然语言处理(很多方向) 182 | - 翻译、理解、问答、作文作诗 183 | - 翻译是最复杂,有规则学派和统计学派 184 | - 数据挖掘和知识发现(当年曾经号称发现了开普洛行星运行定律) 185 | - 专家系统(费肯鲍姆) 186 | 187 | #### 自动程序设计 188 | 189 | #### 机器人 190 | 191 | #### NP-NPC 问题 192 | 193 | #### 群体智能 194 | 195 | #### 智能+ 196 | 197 | - 教育、网络、CAD、绘画、作曲、决策、模拟...... 198 | 199 | #### 从研究方向的分类 200 | 201 | - 知识表示(IF–then,框架,三元组,统计模型,HMM 隐马尔可夫链) 202 | - 推理方法(归结原理,Lisp 语言,Prolog 语言) 203 | - 搜索技术 204 | - 机器学习(发现规则,调整参数) 205 | - 群智算法(简单智能间能否配合) 206 | - 规划(机器人) 207 | - 神经网络(自己发现规则) 208 | - 图计算(用一个数代表一个节点) 209 | 210 | --- 211 | 212 | ## 大数据 213 | 214 | #### 大数据的 5V 特点(IBM 提出) 215 | 216 | 217 | 218 | - Volume (大量) 219 | - Velocity(高速) 220 | - Variety(多样) 221 | - Value(低价值密度) 222 | - Veracity(真实性) 223 | 224 | 225 | 226 | #### 大数据时代大量的使用相关性而不是因果性 227 | 228 | #### 局部大数据和打通的大数据 229 | 230 | #### 合法的大数据与非法大数据 231 | 232 | --- 233 | 234 | ## 专家系统与产生式 235 | 236 | #### 专家系统(产生式系统)的组成三要素 237 | 238 | 1. 一个综合数据库——存放信息 239 | 2. 一组产生式规则——知识 240 | | 规则的一般形式 | 简写 | 241 | | :-------------------: | :--------------: | 242 | | IF <前提> THEN <结论> | <前提> —> <结论> | 243 | | IF <条件> THEN <行动> | <条件> —> <行动> | 244 | 3. 一个控制系统——规则的解释或执行程序(控制策略)(推理引擎) 245 | 246 | 247 | #### Example 1 字符转换(六六六) 248 | 249 | - 综合数据库:{x},其中 x 为字符 250 | - 规则集 251 | 1. IF A∧B THEN C 252 | 2. IF A∧C THEN D 253 | 3. IF B∧C THEN G 254 | 4. IF B∧E THEN F 255 | 5. IF D THEN E 256 | - 控制策略:顺序排队 257 | - 初始条件:{A,B} 258 | - 结束条件:F∈{x} 259 | - 求解过程 260 | 261 | | 数据库 | 可触发规则 | 被触发规则 | 262 | | :-----------------: | :--------: | :--------: | 263 | | A,B | (1) | (1) | 264 | | A,B,C | (2) (3) | (2) | 265 | | A,B,C,D | (3) (5) | (3) | 266 | | A,B,C,D,G | (5) | (5) | 267 | | A,B,C,D,G,E | (4) | (4) | 268 | | A,B,C,D,G,E,F | | | 269 | 270 | #### Example 2 M-C 问题 Missionaries and Cannibals 271 | 272 | - 综合数据库:$(m, c, b)$,其中:$0 ≤ m, c ≤ 3, b ∈ {0, 1}$ 273 | - 规则集: 274 | 1. $\bold{IF} (m, c, 1) \bold{AND} 1≤i+j≤2 \bold{THEN} (m-i, c-j, 0)$ 275 | 2. $\bold{IF} (m, c, 0) \bold{AND} 1≤i+j≤2 \bold{THEN} (m+i, c+j, 1)$ 276 | - 控制策略 277 | - 初始状态:(3,3,1) 278 | - 目标状态(结束状态):(0,0,0) 279 | - 求解过程 280 | 281 | | | M Go → | C Go → | M Come ← | C Come ← | 282 | | :---: | :----: | :----: | :------: | :------: | 283 | | 33 00 | | 2 | | 1 | 284 | | 32 01 | | 2 | | 1 | 285 | | 31 02 | 2 | | 1 | 1 | 286 | | 22 11 | 2 | | | 1 | 287 | | 03 30 | | 2 | | 1 | 288 | | 02 31 | | 2 | | | 289 | | 00 33 | | | | | 290 | 291 | #### Example 3 猴子摘香蕉问题 292 | 293 | - 综合数据库:$(M, B, Box, On, H)$ 294 | - M:猴子的位置 295 | - B:香蕉的位置 296 | - Box:箱子的位置 297 | - On=0:猴子在地板上 298 | - On=1:猴子在箱子上 299 | - H=0:猴子没有抓到香蕉 300 | - H=1:猴子抓到了香蕉 301 | - 规则集: 302 | 1. IF $(x, y, z, 0, 0)$ THEN $(w, y, z, 0, 0)$【猴子可移动】 303 | 2. IF $(x, y, x, 0, 0)$ THEN $(z, y, z, 0, 0)$【猴子可以带同位置箱子动】 304 | 3. IF $(x, y, x, 0, 0)$ THEN $(x, y, x, 1, 0)$【猴子可以爬上箱子】 305 | 4. IF $(x, y, x, 1, 0)$ THEN $(x, y, x, 0, 0)$【猴子可以从箱子下来】 306 | 5. IF $(x, x, x, 1, 0)$ THEN $(x, x, x, 1, 1)$【猴子、香蕉、箱子同一位置,且站在箱子上,可以摘香蕉】 307 | - 控制策略 308 | - 初始状态:$(c, a, b, 0, 0)$ 309 | - 结束状态:$(x1, x2, x3, x4, 1)$ 310 | - 求解过程 311 | $1. (x, y, z, 0, 0)$ 312 | $2. (z, y, z, 0, 0)$ 313 | $3. (y, y, y, 0, 0)$ 314 | $4. (y, y, y, 1, 0)$ 315 | $5. (y, y, y, 1, 1)$ 316 | 317 | 318 | 319 | #### 产生式系统的特点 320 | 321 | 322 | 323 | - 数据驱动 324 | - 知识的无序性 325 | - 控制系统与问题无关 326 | - 数据、知识和控制相互独立 327 | 328 | 329 | 330 | #### 产生式系统的类型 331 | 332 | - 正向、逆向、双向产生式系统 333 | - 可交换的产生式系统 334 | - 可分解的产生式系统 335 | 336 | --- 337 | 338 | ## 搜索策略 339 | 340 | #### 产生式系统的搜索策略 341 | 342 | - 内容:状态空间的搜索问题 343 | - 搜索方式: 344 | - 盲目搜索 345 | - 启发式搜索 346 | - 关键问题:如何利用知识,尽可能有效地找到问题的解(最佳解) 347 | 348 | #### 回溯策略(皇后问题) 349 | 350 | 351 | 352 | - Example 4 递归回溯的例子 353 | 354 | ```cpp 355 | int ListLenght(LIST *pList) 356 | { 357 | if (pList == NULL) return 0; 358 | else return ListLength(pList->next) + 1; 359 | } 360 | ``` 361 | 362 | ```cpp 363 | procedure bt(c) is 364 | if reject(P, c) then return 365 | if accept(P, c) then output(P, c) 366 | s ← first(P, c) 367 | while s ≠ NULL do 368 | bt(s) 369 | s ← next(P, s) 370 | ``` 371 | 372 | 373 | 374 | #### 图搜索策略 375 | 376 | - 回溯搜索:只保留从初始状态到当前状态的一条路径;不是图搜索 377 | - 图搜索:保留所有已经搜索过的路径。 378 | - 深度优先搜索 Depth First Search 379 | - 一般不能保证找到最优解 380 | - 当深度限制不合理时,可能找不到解 381 | - 宽度优先搜索 Breadth First Search 382 | - 当问题有解时,一定能找到解 383 | - 当问题为单位耗散值,且问题有解时,一定能找到最优解 384 | - 渐进式深度优先搜索方法 385 | 386 | #### 启发式图搜索:利用知识来引导搜索,达到减少搜索范围,降低问题复杂度的目的 387 | 388 | - 启发信息的强度 389 | - 强:降低搜索工作量,但可能导致找不到最优解 390 | - 弱:一般导致工作量加大,极限情况下变为盲目搜索,但可能可以找到最优解 391 | - 基本思想:定义一个评价函数$f$,对当前的搜索状态进行评估,找出一个最有希望的节点来扩展 392 | 393 | #### 启发式搜索算法$A$ 394 | 395 | - $f(n) = g(n) + h(n)$ 396 | - $f(n)$:评价函数 397 | - $h(n)$:启发函数 398 | - 在$A$算法中,如果满足条件:$h(n)≤h^*(n)$则$A$算法称为$A*$算法 399 | 400 | #### $A*$算法的性质 401 | 402 | - $A*$算法的假设:设$n_i、n_j$是任意两个节点,有:$C(n_i, n_j) > ε$其中 ε 为大于 0 的常数 403 | - $f^*(s) = f^*(t) = h^*(s) = g^*(t) = f^*(n)$ 404 | - 其中$s$是初始节点,$t$是目标节点,$n$是$s$到$t$的最佳路径上的节点 405 | - 定理 1:对有限图,如果从初始节点 s 到目标节点 t 有路径存在,则算法$A$一定成功结束 406 | - 定理 2:对无限图,若从初始节点 s 到目标节点 t 有路径存在,则$A*$一定成功结束 407 | - 引理 2.1 408 | - 对无限图,若有从初始节点$s$到目标节点 t 的路径, 则$A*$不结束时,在 OPEN 表中即使最小的一个$f$值也将增到任意大,或有$f(n)>f^*(s)$ 409 | - 引理 2.2:在$A*$结束前,必存在节点$n$,使得$f(n) ≤ f^*(s)$ 410 | > 引理 2.2 证明:存在一个节点 n,n 在 最佳路径上。 411 | > f(n) = g(n) + h(n) 412 | > = g*(n)+h(n) ≤g*(n)+h*(n) = f*(n) 413 | > = f\*(s) 414 | > 得证。 415 | - 推论 2.1:OPEN 表上任一具有$f(n) 推论 2.1 证明:由定理 2,知 A*一定结束,由 A*的结束条件,OPEN 表中 f(t)最小时才结束。而 f(t) ≥ f*(t) = f*(s) 所以 f(n)$由定理1、2知A*一定找到一条路径结束,设找到的路径s→ t不是最佳的(t为目标),则:f(t) = g(t) > f*(s);由引理2.2知结束前OPEN中存在f(n)≤f*(s)的节点n,所以f(n) ≤ f*(s) < f(t),因此A*应选择n扩展,而不是t,与假设A*选择t结束矛盾,得证$ 420 | 421 | - 推论 3.1:$A*$选作扩展的任一节点$n$,有$f(n)≤f^*(s)$。 422 | > 由引理 2.2 知在 A*结束前,OPEN 中存在节点 n’, f(n’)≤f*(s) 423 | > 设此时 A*选择 n 扩展。 424 | > 如果 n=n’,则 f(n)≤f*(s),得证。 425 | > 如果 n≠ n’,由于 A*选择 n 扩展,而不是 n’, 所以有 f(n) ≤ f(n’)≤f*(s)。得证。 426 | - 定理 4:如果 h2(n) > h1(n) (目标节点除外),则 A1 扩展的节点数 ≥A2 扩展的节点数 427 | > 定理 4 证明: 428 | > 使用数学归纳法,对节点的深度进行归纳 429 | > (1)当 d(n)=0 时,即只有一个节点,显然定理成立。 430 | > (2)设 d(n)≤k 时定理成立。(归纳假设) 431 | > (3)当 d(n)=k+1 时,用反证法。 432 | > 设存在一个深度为 k+1 的节点 n,被 A2 扩展,但没有被 A1 扩展。而由假设,A1 扩展了 n 的父节点,即 n 已经被生 成了。因此当 A1 结束时,n 将被保留在 OPEN 中。 433 | > 所以有:f1(n) ≥ f*(s) 434 | > 即:g1(n)+h1(n) ≥ f*(s) 435 | > 所以: h1(n) ≥ f*(s) - g1(n) 436 | > 另一方面,由于 A2 扩展了 n,有 f2(n) ≤ f*(s) 437 | > 即: h2(n) ≤ f*(s) – g2(n) (A) 438 | > 由于 d(n)=k 时,A2 扩展的节点 A1 一定扩展,有 439 | > g1(n) ≤ g2(n) (因为 A2 的路 A1 均走到了) 440 | > 所以:h1(n)≥f*(s)-g1(n)≥f\*(s)–g2(n) (B) 441 | > 比较 A、B 两式,有 h1(n) ≥ h2(n) ,与定理条件矛 盾。故定理得证。 442 | - 定理 5:若 h(n)是单调的,则 A\*扩展了节点 n 之后,就已经找到了到达节点 n 的最佳路径。 443 | - 定理 6:若 h(n)是单调的,则由 A\*所扩展的节点序列其 f 值是非递减的。即 f(ni) ≤ f(nj)。 444 | 445 | 446 | 447 | - 在修正的 A 算法中,fm 的含义是到当前为止,扩展的节点中,f 的最大值 448 | - 对任意节点 n,设 m 是 n 的子节点,当 h 满足条件 h(n)-h(m) ≤ C(n, m), h(t) = 0 时,称 h 是单调的 449 | - 用 A\*算法求解问题时为什么会出现重复扩展节点问题,解决的方法有哪些? 450 | 451 | - 如果 h 函数定义的不合理,则当扩展一个节点时,不一定就找到了从初始节点到该节点的最优路径,对于这样的节点,就有可能被多次扩展。特别是如果这样的节点处于问题的最优解路径上时,则一定会被多次扩展 452 | - 使得 h 满足单调性;修正的 A\*算法可以减少重复扩展节点问题 453 | 454 | 455 | 456 | ## 归结原理 457 | 458 | - 定理证明方法,对机器定理证明问题起到了推动作用 459 | - 化子句集 460 | 461 | 1. 消蕴涵符 $A(x)→B(x) ≡ ~ A(x)∨B(x)$ 462 | 2. 移动否定符 463 | 摩根定律: 464 | $~(A(x)∨B(x)) ≡ ~ A(x)∧ ~ B(x)$ 465 | $~(A(x)∧B(x)) ≡ ~ A(x)∨ ~ B(x)$ 466 | 量词转换律表: 467 | $~((∃x)A(x)) ≡ (∀x)(~ A(x))$ 468 | $~((∀x)A(x)) ≡ (∃x)(~ A(x))$ 469 | 3. 变量换名 $(∃x)A(x)∨(∃x)B(x) => (∃x)A(x)∨(∃y)B(y)$ 470 | 4. 量词左移 $(∃x)A(x)∨(∃y)B(y) => (∃x)(∃y){A(x)∨B(y)}$ 471 | - 前束范式:所有量词均非否定的出现在公式的前部 472 | - 经过以上几步后,就将一个合式公式转化为了前束范式 473 | 5. 消去存在量词(skolem 化) 474 | 475 | | $(∃z)(∀x)(∃y){[(~ P(x)∧ ~ Q(x))∨R(y)]∨U(z)} $ | 476 | | :---------------------------------------------: | 477 | | $\downarrow$ | 478 | | $(∀x){[(~ P(x)∧ ~ Q(x))∨R(f(x))]∨U(a)}$ | 479 | 480 | 6. 化为合取范式 481 | $(A(x)∧B(x))∧C(x) ≡ A(x)∧(B(x)∧C(x))$ 482 | $(A(x)∨B(x))∨C(x) ≡ A(x)∨(B(x)∨C(x))$ 483 | $A(x)∧(B(x)∨C(x)) ≡ (A(x)∧B(x))∨(A(x)∧C(x))$ 484 | $A(x)∨(B(x)∧C(x)) ≡ (A(x)∨B(x))∧(A(x)∨C(x))$ 485 | 486 | 7. 隐去全称量词 487 | 488 | | $(∀x){[~ P(x)∨R(f(x))∨U(a)]∧[~ Q(x)∨R(f(x))∨U(a)]}$ | 489 | | :---------------------------------------------------: | 490 | | $\downarrow$ | 491 | | $[~ P(x)∨R(f(x))∨U(a)]∧[~ Q(x)∨R(f(x))∨U(a)]$ | 492 | 493 | 8. 表示为子句集 494 | 495 | | $[~ P(x)∨R(f(x))∨U(a)]∧[~ Q(x)∨R(f(x))∨U(a)]$ | 496 | | :----------------------------------------------: | 497 | | $\downarrow$ | 498 | | $\{~ P(x)∨R(f(x))∨U(a), ~ Q(x)∨R(f(x))∨U(a)\}$ | 499 | 500 | 9. 变量换名 501 | $\{~ P(x_1)∨R(f(x_1))∨U(a), ~ Q(x_2)∨R(f(x_2))∨U(a)\}$ 502 | 503 | - 合一算法 504 | - 对于子句$C_1∨L_1$和$C_2∨L_2$,如果$L_1$与$~L_2$可合一,且$s$是其合一者,则$(C1∨C2)_s$是其归结式 505 | 506 | ## 传统人工智能考虑问题的方式 507 | 508 | - OCR 光学字符识别 (Optical Character Recognition) 509 | 510 | --- 511 | 512 | ## Game Theory Basics 博弈基础 513 | 514 | #### 博弈定义 515 | 516 | - 研究智慧的理性决策者之间冲突与合作的数学模型 517 | 518 | #### 博弈要素 519 | 520 | - 玩家 players:参与博弈的决策主体 521 | - 策略 strategy:参与者可以采取的行动方案 522 | - 混合策略 mixed strategy:参与者可以通过一定概率分布来选择某确定的策略 523 | - 纯策略 pure strategy:参与者每次行动都选择某个确定的策略 524 | - 所有参与者各自采取行动后形成的状态被称为局势(outcome) 525 | - 收益 payoff:各个参与者在不同局势下得到的利益 526 | - 规则 rule:对参与者行动的先后顺序、参与者获得信息多少等内容的规定 527 | 528 | #### 博弈六特征 Features of Games 529 | 530 | - 2 或多玩家 531 | - 轮流 vs. 同时 532 | - 完整信息 vs.不完整信息 533 | - 确定的 vs. 随机的 534 | - 合作 vs. 竞争 535 | - 零和 vs. 非零和 536 | - 零和:一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加的总和永远为 0 537 | 538 | > Example 5:石头剪刀布 539 | > 2 & 同时 & 不完整 & 随机 & 竞争 & 零和 540 | 541 | #### Dominant Strategy 占优策略 542 | 543 | - 对于玩家 $i$,无论其他玩家做什么,如果策略 $x$ 比策略 $y$ 更好,策略 $x$ 将主导策略 $y$ 544 | - 不满足**帕雷托效率 Pareto efficiency** 545 | - 在没有使任何人境况变坏的前提下,使得至少一个人变得更好 546 | 547 | #### Nash Equilibrium 纳什均衡: 548 | 549 | - 若任何参与者单独改变策略都不会得到好处,则该情形下的策略组合就是一个纳什均衡 550 | - Dominant Strategy 是 Nash Equilibrium 551 | - Nash 定理:有限博弈(参与者有限,每位参与者的策略集有限,收益函数为实值函数)必存在混合策略意义下的纳什均衡 552 | 553 | > Example 6 囚徒困境 554 | > 555 | > | | Deny | Confess | 556 | > | :---------: | :--------: | :---------------: | 557 | > | **Deny** | $(-1, -1)$ | $(-10, 0)$ | 558 | > | **Confess** | $(0, -10)$ | $\bold{(-8, -8)}$ | 559 | > 560 | > 561 | 562 | ## Adversarial Search 对抗搜索(博弈搜索) 563 | 564 | #### 搜索 vs. 博弈 565 | 566 | - 搜索: 非对抗性的 567 | - 解决方案:(启发式)发现目标的方法 568 | - 启发式和约束满足问题(CSP, Constraint Satisfaction Problem)技术->最佳解决方案 569 | - 评估函数:通过给定节点从开始到目标的成本估算 570 | - 示例:路径规划,安排活动 571 | - 博弈:对抗性的 572 | - 解决方案:策略 573 | - 策略针对每个对手的可能反馈作出动作 574 | - 有限时间->近似解决方案 575 | - 评估函数:评估游戏位置的好坏 576 | - 例如:国际象棋,西洋跳棋,黑白棋,五子棋 577 | 578 | #### 对抗搜索的六部分形式化描述 579 | 580 | - 初始状态 𝑆: 游戏所处于的初始状态 581 | - 玩家 𝑃𝐿𝐴𝑌𝐸𝑅 (𝑠): 在当前状态 𝑠 下,该由哪个玩家采取行动 582 | - 行动 𝐴𝐶𝑇𝐼𝑂𝑁𝑆 (𝑠): 在当前状态 𝑠 下所采取的可能移动 583 | - 状态转移模型 𝑅𝐸𝑆𝑈𝐿𝑇 (𝑠, 𝑎): 在当前状态 𝑠 下采取行动 𝑎 后得到的结果 584 | - 终局状态检测 𝑇𝐸𝑅𝑀𝐼𝑁𝐴𝐿 − 𝑇𝐸𝑆𝑇 (𝑠): 检测游戏在状态 𝑠 是否结束 585 | - 终局得分 𝑈𝑇𝐼𝐿𝐼𝑇𝑌 (𝑠, 𝑝): 在终局状态 𝑠 时,玩家 𝑝 的得分 586 | 587 | #### 最小最大搜索(Minimax Search): 588 | 589 | - 最小最大搜索是在对抗搜索中最为基本的一种让玩家来计算最优策略的方法 590 | > **Function** MINIMAX(s) **returns** an action 591 | > **if** TERMINAL-TEST(s) **then return** UTILITY(s) 592 | > **if** PLAYER(s) **=** MAX **then return** $max_{a∈ACTIONS(s)}$MINIMAX(RESULT(s, a)) 593 | > **if** PLAYER(s) **=** MIN **then return** $min_{a∈ACTIONS(s)}$MINIMAX(RESULT(s, a)) 594 | 595 | #### $α-β$ 剪枝搜索(Pruning Search) 596 | 597 | - 一种对最小最大搜索进行改进的算法,即在搜索过程中可剪除无需搜索的分支节点,且不影响搜索结果 598 | - 极大节点的下界为 $α$,极小节点的上界为 $β$ 599 | - 剪枝的条件 $α≥ β$: 600 | 601 | - $max$节点的 $α$ 值 ≥ 后辈$min$节点的 $β$ 值时,$α$ 剪枝 602 | - $min$节点的 $β$ 值 ≤ 后辈$max$节点的 $α$ 值时,$β$ 剪枝 603 | 604 | - 一般原则:若玩家是在位于$n$的父节点或更上层出有更好的选择$m$,则在实战中没必要抵达$n$ 605 | 607 | 608 | #### 蒙特卡洛树搜索(Monte-Carlo Tree Search) 609 | 610 | - 通过采样而非穷举方法来实现搜索 611 | - Algorithm of AlphaGo 612 | 613 | - 深度神经网络 Deep Neural Networks 614 | - 价值网络 Value Networks: 评估 615 | - 策略网络 Policy Networks: 移动 616 | - 蒙特卡洛搜索 Monte-Carlo Tree Search (MCTS) 617 | - 结合蒙特卡洛模拟、价值网络与策略网络 618 | - 强化学习 Reinforcement Learning 619 | 620 | - 蒙特卡洛方法:依靠重复随机采样来获得数值结果的计算算法 621 | 622 | - 四个步骤创建决策树 623 | - 选择 $Selection$ 624 | - 扩展 $Expansion$ 625 | - 模拟 $Simulation$ 626 | - 反向传播 $BackPropagation$ 627 | 628 | --- 629 | 630 | ## 机器学习简介 631 | 632 | #### 定义 633 | 634 | - Machine Learning is the study of algorithms that 635 | - 提升表现 P improve their performance P 636 | - 在某些任务 T at some task T 637 | - 通过经验 E with experience E. 638 | - A well-defined learning task is given by . 639 | 640 | #### 机器学习算法分类 641 | 642 | - 有监督学习 Supervised (inductive) learning: **training data $\And$ desired outputs (labels)** 643 | 644 | - 回归 Regression 645 | - 分类 Classification 646 | - 支持向量机 Support Vector Machines & Kernel Methods 647 | - 决策树 Decision Tree Induction 648 | - 贝叶斯学习 Bayesian Learning 649 | - 神经网络&深度学习 Neural Networks & Deep Learning 650 | - 学习理论 Learning Theory 651 | 652 | - 无监督学习 Unsupervised learning: **training data** 653 | 654 | - 聚类 Clustering 655 | - 维度约减 Dimensionality reduction 656 | 657 | - 半监督学习 Semi-supervised learning: **training data $\And$ a few desired outputs** 658 | - 强化学习 Reinforcement learning 659 | - 给定一系列具有(延迟)奖励的状态和动作,输出策略;策略是状态到动作的映射 660 | - 时间差异学习 Temporal Difference Learning 661 | - Q 学习 Q Learning 662 | 663 | #### 机器学习算法组成 664 | 665 | - 表示 Representation 666 | - 数值函数 Numerical functions 667 | - 线性回归 Linear regression 668 | - 神经网络 Neural networks 669 | - 支持向量机 Support vector machines 670 | - 符号函数 Symbolic functions 671 | - 决策树 Decision trees 672 | - 命题逻辑规则 Rules in propositional logic 673 | - 一阶谓词逻辑的规则 Rules in first-order predicate logic 674 | - 基于实例的函数 Instance-based functions 675 | - 最近邻 Nearest-neighbor 676 | - 基于案例 Case-based 677 | - 概率图模型 Probabilistic Graphical Models 678 | - 朴素贝叶斯 Naive Bayes 679 | - 贝叶斯网络 Bayesian networks 680 | - 隐马尔可夫链 Hidden-Markov Models (HMMs) 681 | - 概率上下文无关语法 Probabilistic Context Free Grammars (PCFGs) 682 | - 马尔可夫网络 Markov networks 683 | - 优化 Optimization 684 | - 梯度下降 Gradient descent 685 | - 感知器 Perceptron 686 | - 反向传播 Backpropagation 687 | - 动态变成 Dynamic Programming 688 | - 隐马尔可夫学习 HMM Learning 689 | - 概率上下文无关语法学习 PCFG Learning 690 | - 分而治之 Divide and Conquer 691 | - 决策树归纳 Decision tree induction 692 | - 规则学习 Rule learning 693 | - 进化计算 Evolutionary Computation 694 | - 遗传算法 Genetic Algorithms (GAs) 695 | - 遗传编程 Genetic Programming (GP) 696 | - 神经进化 Neuro-evolution 697 | - 评价 Evaluation 698 | - 精度 Accuracy 699 | - 精确度和召回率 Precision and recall 700 | - 平方误差 Squared error 701 | - 相似性 Likelihood 702 | - 后验概率 Posterior probability 703 | - 成本/效用 Cost/Utility 704 | - 边距 Margin 705 | - 熵 Entropy 706 | - K-L 散度 K-L divergence 707 | 708 | #### 机器学习系统的设计 709 | 710 | - 选择训练经验 711 | - 选择学习对象,如目标函数 712 | - 选择如何表示目标函数 713 | - 选择学习算法从经验推断目标函数 714 | 715 | #### 机器学习实践 716 | 717 | - 了解领域,先验知识和目标 718 | - **数据集成,选择,清洁,预处理** 719 | - 学习模型 720 | - 解释结果 721 | - 巩固和部署发现的知识 722 | 723 | --- 724 | 725 | ## 深度学习 726 | 727 | #### Three Steps for Deep Learning 728 | 729 | 1. Define a set of function 730 | - Network Structure 731 | 2. Goodness of function 732 | - Training Data 733 | - Learning Target 734 | - Total Loss 735 | 3. Pick the best function 736 | - Gradient Descent 737 | 738 | #### Supervised Neural Network 739 | 740 | > _e.g._ Fully Connect Feedforward Network 741 | 742 | - Neuron, Weights, Bias, Activation Function (Sigmoid Function $sigma(z) = \frac{1}{1+e^{-z}}$), Output Layer (Softmax Layer) 743 | 744 | - Convolutional Neural Network (CNN) 745 | 746 | - Convolution 747 | - Stride 748 | - Zero Padding 749 | - MaxPooling 750 | - Flatten 751 | 752 | ```flow 753 | st=>start: Image 754 | e=>end: Output 755 | op2=>operation: MaxPooling: The same patterns appearing different regions 756 | op3=>operation: Flatten 757 | op5=>operation: Fully Connected Feedforward Network 758 | op4=>operation: New Image 759 | sub1=>subroutine: Repeat 760 | cond=>condition: Iterated N times 761 | io=>inputoutput: catch something 762 | op1=>operation: Convolution: Some patterns are much smaller than the whole image 763 | 764 | st->op1->op2->op4->cond 765 | cond(yes)->op3->op5->e 766 | cond(no)->sub1->op1 767 | ``` 768 | 769 | - Recurrent Neural Network (RNN): Neural Network with Memory 770 | 771 | #### Unsupervised Neural Networks 772 | 773 | - Embedding (word2vec) 774 | 775 | --- 776 | 777 | ## 生成模型 Generative Models 778 | 779 | - 给定训练数据,从同一分布生成新样本 780 | - 解决密度估计问题,这是无监督学习中的核心问题 781 | 782 | #### 主要方向 783 | 784 | - 显式密度估计:显式定义并求解$p_{model}(x)$ 785 | - 隐式密度估计:非显示地定义模型,而是学习可从$p_{model}(x)$采样的模型 786 | 787 | #### 应用 Application 788 | 789 | - 用于艺术品,超分辨率,着色的**真实采样** 790 | - **时序数据**的生成模型可用于**仿真和计划**(强化学习应用程序) 791 | - 推断潜在的一般**特征表示** 792 | 793 | #### 变分自动编码器 Variational Autoencoders (VAE) 794 | 795 | - 无监督,用于学习未标注数据的低维特征表示 796 | 797 | #### 生成对抗网络 Generative Adversarial Networks (GAN) 798 | 799 | - 不使用任何显式的密度函数 800 | - 采取博弈论的方法:通过双人游戏,从训练分布中学习并生成 801 | - 组成 802 | - 生成器网络 Generator Network:尝试通过生成逼真的图像来欺骗鉴别器 803 | - 鉴别器网络 Discriminator Network:尝试区分真实图像和伪造图像 804 | 805 | --- 806 | 807 | ## Deep Learning on Graphs 808 | 809 | #### Graph Applications 810 | 811 | - Link Prediction 812 | - Node Classification 813 | - Node Importance 814 | - Graph Classification 815 | 816 | #### 网络嵌入 Network Embedding 817 | 818 | > De-coupling the links 819 | 820 | - **Goal 1⃣️**: Reconstruct the original network 821 | - **Goal 2⃣️**: Support network inference (Community detection, Network distance, Network evolution) 822 | 823 | #### 图神经网络 Graph Neural Networks 824 | 825 | > Design new algorithms that can incorporate links 826 | 827 | - Graph Recurrent Neural Networks: Recursive definition of states, e.g. `PageRank` 828 | 829 | - Most primitive methods 830 | - Unified frameworks with GCN 831 | 832 | - Graph Convolutional Networks: Common local and global patterns 833 | - Convolutions: spectral, spatial 834 | - Readout 835 | - Improvements 836 | -------------------------------------------------------------------------------- /assets/Stack-I.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/assets/Stack-I.png -------------------------------------------------------------------------------- /assets/Stack-II.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/assets/Stack-II.png -------------------------------------------------------------------------------- /assets/eq3,4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/assets/eq3,4.png -------------------------------------------------------------------------------- /assets/eq5,6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/assets/eq5,6.png -------------------------------------------------------------------------------- /cifar.py: -------------------------------------------------------------------------------- 1 | from __future__ import (absolute_import, division, print_function, unicode_literals) 2 | 3 | import pickle 4 | 5 | import matplotlib.pyplot as plt 6 | import numpy as np 7 | import pydot 8 | import tensorflow as tf 9 | import tqdm 10 | from keras.utils import vis_utils 11 | from tensorflow.keras import datasets, layers, models 12 | 13 | vis_utils.pydot = pydot 14 | 15 | 16 | def unpickle(file): 17 | with open(file, 'rb') as fo: 18 | dict = pickle.load(fo, encoding='bytes') 19 | return dict 20 | 21 | 22 | test, cross = unpickle('./test_batch'), unpickle(f'./data_batch_5') 23 | data, labels = [], [] 24 | for i in range(5): 25 | cifar = unpickle(f'./data_batch_{i + 1}') 26 | if i == 0: 27 | data = cifar[b'data'] / 255 28 | labels = np.array(cifar[b'labels']) 29 | else: 30 | data = np.append(data, cifar[b'data'] / 255, axis=0) 31 | labels = np.append(labels, np.array(cifar[b'labels']), axis=0) 32 | 33 | 34 | def network(data, labels, test, cross): 35 | data.resize((data.shape[0], 1, data.shape[-1])) 36 | cross[b'data'].resize((cross[b'data'].shape[0], 1, cross[b'data'].shape[-1])) 37 | test[b'data'].resize((test[b'data'].shape[0], 1, test[b'data'].shape[-1])) 38 | model = models.Sequential([ 39 | layers.Dense(512, activation='relu'), 40 | layers.Dense(256, activation='relu'), 41 | layers.Dense(128, activation='relu'), 42 | layers.Dense(10, activation='softmax') 43 | ]) 44 | model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) 45 | history = model.fit(data, labels, epochs=10, validation_data=(cross[b'data'] / 255, np.array(cross[b'labels']))) 46 | plt.plot(history.history['accuracy'], label='accuracy') 47 | plt.plot(history.history['val_accuracy'], label='val_accuracy') 48 | plt.xlabel('Epoch') 49 | plt.ylabel('Accuracy') 50 | plt.legend(loc='lower right') 51 | plt.savefig('nn_evaluation.png', dpi=600) 52 | cross_loss, cross_acc = model.evaluate(cross[b'data'] / 255, np.array(cross[b'labels']), verbose=2) 53 | model.save(f'nn{cross_acc:.2}.h5') 54 | vis_utils.plot_model(model, to_file='nn.png', show_shapes=True, show_layer_names=True, expand_nested=True, dpi=600) 55 | print(f'Cross Validation Accuracy: {cross_acc}, Cross Validation lost: {cross_loss}') 56 | test_loss, test_acc = model.evaluate(test[b'data'] / 255, np.array(test[b'labels']), verbose=2) 57 | print(f'Test accuracy: {test_acc}, Test lost: {test_loss}') 58 | print(model.summary()) 59 | 60 | 61 | def CNN(data, labels, test, cross): 62 | data = np.array([i.reshape((3, 1024)).T.reshape(32, 32, 3) for i in data]) 63 | cross[b'data'] = np.array([i.reshape((3, 1024)).T.reshape(32, 32, 3) for i in cross[b'data']]) 64 | test[b'data'] = np.array([i.reshape((3, 1024)).T.reshape(32, 32, 3) for i in test[b'data']]) 65 | model = models.Sequential([ 66 | layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), 67 | layers.MaxPooling2D((2, 2)), 68 | layers.Conv2D(64, (3, 3), activation='relu'), 69 | layers.MaxPooling2D((2, 2)), 70 | layers.Conv2D(64, (3, 3), activation='relu'), 71 | layers.Flatten(), 72 | layers.Dense(64, activation='relu'), 73 | layers.Dense(10, activation='softmax') 74 | ]) 75 | model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) 76 | history = model.fit(data, labels, epochs=10, validation_data=(cross[b'data'] / 255, np.array(cross[b'labels']))) 77 | plt.plot(history.history['accuracy'], label='accuracy') 78 | plt.plot(history.history['val_accuracy'], label='val_accuracy') 79 | plt.xlabel('Epoch') 80 | plt.ylabel('Accuracy') 81 | plt.ylim([0.5, 1]) 82 | plt.legend(loc='lower right') 83 | plt.savefig('cnn_evaluation.png', dpi=600) 84 | cross_loss, cross_acc = model.evaluate(cross[b'data'] / 255, np.array(cross[b'labels']), verbose=2) 85 | model.save(f'cnn{cross_acc:.2}.h5') 86 | from tensorflow.keras.utils import plot_model 87 | plot_model(model, to_file='cnn.png', show_shapes=True, show_layer_names=True, expand_nested=True, dpi=600) 88 | print(f'Cross Validation Accuracy: {cross_acc}, Cross Validation lost: {cross_loss}') 89 | test_loss, test_acc = model.evaluate(test[b'data'] / 255, np.array(test[b'labels']), verbose=2) 90 | print(f'Test accuracy: {test_acc}, Test lost: {test_loss}') 91 | print(model.summary()) 92 | 93 | 94 | class NearestNeighbor: 95 | def __init__(self, data, labels, test, cross): 96 | self.test = test 97 | self.data = data 98 | self.labels = labels 99 | self.test[b'data'] = test[b'data'] 100 | self.test[b'labels'] = test[b'labels'] 101 | self.cross = cross 102 | self.train() 103 | 104 | def train(self): 105 | predict = self.predict() 106 | accuracy = np.mean(predict == self.test[b'labels']) 107 | print(f'Accuracy:\t{accuracy}') 108 | 109 | def predict(self, k=7): 110 | predict = np.zeros(self.test[b'data'].shape[0], dtype=self.labels.dtype) 111 | for i in tqdm.tqdm(range(self.test[b'data'].shape[0])): 112 | L1 = np.sum(np.abs(self.data - self.test[b'data'][i, :]), axis=1) 113 | closest = self.labels[np.argsort(L1)[:k]] 114 | unique, indices = np.unique(closest, return_inverse=True) 115 | predict[i] = unique[np.argmax(np.bincount(indices))] 116 | return predict 117 | 118 | 119 | def rnn(data, labels, test, cross, first_exec=True): 120 | import tensorflow.compat.v1 as tf 121 | tf.disable_v2_behavior() 122 | size = 32 # 32 * 32 123 | timesteps = 32 124 | hidden_layer = 256 125 | classes = 10 126 | params = {"learning_rate": 0.001, "training_iters": 10000, "batch_size": 64} 127 | test_data, test_labels = test[b'data'] / 255, test[b'labels'] 128 | # 将RGB值转为灰度值 129 | print('Converting data......') 130 | data_array = np.array([[[item[index], item[index + 1024], item[index + 1024 * 2]] for index in range(1024)] 131 | for item in tqdm.tqdm(data)]) 132 | test_array = np.array([[[item[index], item[index + 1024], item[index + 1024 * 2]] for index in range(1024)] 133 | for item in tqdm.tqdm(test_data)]) 134 | data = np.array([[data_array[i, j].dot([0.299, 0.587, 0.114]) for j in range(data_array.shape[1])] 135 | for i in tqdm.tqdm(range(data_array.shape[0]))]) 136 | test = np.array([[test_array[i, j].dot([0.299, 0.587, 0.114]) for j in range(test_array.shape[1])] 137 | for i in tqdm.tqdm(range(test_array.shape[0]))]) 138 | labels = np.array([[1 if i == row else 0 for i in range(10)] for row in tqdm.tqdm(labels)]) 139 | test_labels = np.array([[1 if i == row else 0 for i in range(10)] for row in tqdm.tqdm(test_labels)]) 140 | # 按照 tutorial 定义 RNN 模型 141 | x = tf.placeholder("float", [None, timesteps, size]) 142 | y = tf.placeholder("float", [None, classes]) 143 | weights = tf.Variable(tf.random_normal([hidden_layer, classes]), name='weights') 144 | biases = tf.Variable(tf.random_normal([classes]), name='biases') 145 | 146 | def rnn_model(x, weights, biases): 147 | x = tf.transpose(x, [1, 0, 2]) 148 | x = tf.reshape(x, [-1, size]) 149 | x = tf.split(x, timesteps, axis=0) 150 | lstm_cell = tf.nn.rnn_cell.LSTMCell(hidden_layer, forget_bias=1.0) 151 | outputs, states = tf.nn.static_rnn(lstm_cell, x, dtype=tf.float32) 152 | return tf.matmul(outputs[-1], weights) + biases 153 | 154 | pred = rnn_model(x, weights, biases) 155 | cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=pred, labels=y)) 156 | optimizer = tf.train.AdamOptimizer(learning_rate=params['learning_rate']).minimize(cost) 157 | correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 158 | accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 159 | # 训练模型 160 | print('Training......') 161 | with tf.Session() as sess: 162 | sess.run(tf.global_variables_initializer()) 163 | # 一轮一轮地训练模型 164 | for step in tqdm.tqdm(range(1, int(params['training_iters'] / params['batch_size']) + 1)): 165 | batch_x = data[(step - 1) * params['batch_size']:step * params['batch_size']].reshape( 166 | (params['batch_size'], timesteps, size)) 167 | batch_y = labels[(step - 1) * params['batch_size']:step * params['batch_size']] 168 | sess.run(optimizer, feed_dict={x: batch_x, y: batch_y}) 169 | # 测试评估模型 170 | print("Accuracy:", 171 | sess.run(accuracy, feed_dict={ 172 | x: test[:128].reshape((-1, timesteps, size)), 173 | y: test_labels[:128] 174 | })) 175 | 176 | 177 | network(data, labels, test, cross) 178 | CNN(data, labels, test, cross) 179 | NearestNeighbor(data, labels, test, cross) 180 | rnn(data, labels, test, cross, 0) 181 | -------------------------------------------------------------------------------- /cnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/cnn.png -------------------------------------------------------------------------------- /cnn0.81.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/cnn0.81.h5 -------------------------------------------------------------------------------- /cnn_evaluation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/cnn_evaluation.png -------------------------------------------------------------------------------- /nn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/nn.png -------------------------------------------------------------------------------- /nn0.52.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/nn0.52.h5 -------------------------------------------------------------------------------- /nn_evaluation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cnarutox/AI/dba49839cddb9033ad68a2a8ff120f3f36325c0b/nn_evaluation.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==3.1.1 2 | tensorflow==2.5.2 3 | tqdm==4.36.1 4 | Keras==2.3.1 5 | numpy==1.17.3 6 | pydot==1.4.1 7 | --------------------------------------------------------------------------------