You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

autograd.ipynb 18 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# 自动求导\n",
  8. "这次课程我们会了解 PyTorch 中的自动求导机制,自动求导是 PyTorch 中非常重要的特性,能够让我们避免手动去计算非常复杂的导数,这能够极大地减少了我们构建模型的时间,这也是其前身 Torch 这个框架所不具备的特性,下面我们通过例子看看 PyTorch 自动求导的独特魅力以及探究自动求导的更多用法。"
  9. ]
  10. },
  11. {
  12. "cell_type": "code",
  13. "execution_count": 1,
  14. "metadata": {
  15. "collapsed": true
  16. },
  17. "outputs": [],
  18. "source": [
  19. "import torch\n",
  20. "from torch.autograd import Variable"
  21. ]
  22. },
  23. {
  24. "cell_type": "markdown",
  25. "metadata": {},
  26. "source": [
  27. "## 简单情况的自动求导\n",
  28. "下面我们显示一些简单情况的自动求导,\"简单\"体现在计算的结果都是标量,也就是一个数,我们对这个标量进行自动求导。"
  29. ]
  30. },
  31. {
  32. "cell_type": "code",
  33. "execution_count": 2,
  34. "metadata": {},
  35. "outputs": [
  36. {
  37. "name": "stdout",
  38. "output_type": "stream",
  39. "text": [
  40. "Variable containing:\n",
  41. " 19\n",
  42. "[torch.FloatTensor of size 1]\n",
  43. "\n"
  44. ]
  45. }
  46. ],
  47. "source": [
  48. "x = Variable(torch.Tensor([2]), requires_grad=True)\n",
  49. "y = x + 2\n",
  50. "z = y ** 2 + 3\n",
  51. "print(z)"
  52. ]
  53. },
  54. {
  55. "cell_type": "markdown",
  56. "metadata": {},
  57. "source": [
  58. "通过上面的一些列操作,我们从 x 得到了最后的结果out,我们可以将其表示为数学公式\n",
  59. "\n",
  60. "$$\n",
  61. "z = (x + 2)^2 + 3\n",
  62. "$$\n",
  63. "\n",
  64. "那么我们从 z 对 x 求导的结果就是 \n",
  65. "\n",
  66. "$$\n",
  67. "\\frac{\\partial z}{\\partial x} = 2 (x + 2) = 2 (2 + 2) = 8\n",
  68. "$$\n",
  69. "如果你对求导不熟悉,可以查看以下[网址进行复习](https://baike.baidu.com/item/%E5%AF%BC%E6%95%B0#1)"
  70. ]
  71. },
  72. {
  73. "cell_type": "code",
  74. "execution_count": 3,
  75. "metadata": {},
  76. "outputs": [
  77. {
  78. "name": "stdout",
  79. "output_type": "stream",
  80. "text": [
  81. "Variable containing:\n",
  82. " 8\n",
  83. "[torch.FloatTensor of size 1]\n",
  84. "\n"
  85. ]
  86. }
  87. ],
  88. "source": [
  89. "# 使用自动求导\n",
  90. "z.backward()\n",
  91. "print(x.grad)"
  92. ]
  93. },
  94. {
  95. "cell_type": "markdown",
  96. "metadata": {},
  97. "source": [
  98. "对于上面这样一个简单的例子,我们验证了自动求导,同时可以发现发现使用自动求导非常方便。如果是一个更加复杂的例子,那么手动求导就会显得非常的麻烦,所以自动求导的机制能够帮助我们省去麻烦的数学计算,下面我们可以看一个更加复杂的例子。"
  99. ]
  100. },
  101. {
  102. "cell_type": "code",
  103. "execution_count": 4,
  104. "metadata": {},
  105. "outputs": [],
  106. "source": [
  107. "x = Variable(torch.randn(10, 20), requires_grad=True)\n",
  108. "y = Variable(torch.randn(10, 5), requires_grad=True)\n",
  109. "w = Variable(torch.randn(20, 5), requires_grad=True)\n",
  110. "\n",
  111. "out = torch.mean(y - torch.matmul(x, w)) # torch.matmul 是做矩阵乘法\n",
  112. "out.backward()"
  113. ]
  114. },
  115. {
  116. "cell_type": "markdown",
  117. "metadata": {},
  118. "source": [
  119. "如果你对矩阵乘法不熟悉,可以查看下面的[网址进行复习](https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95/5446029?fr=aladdin)"
  120. ]
  121. },
  122. {
  123. "cell_type": "code",
  124. "execution_count": 5,
  125. "metadata": {},
  126. "outputs": [
  127. {
  128. "name": "stdout",
  129. "output_type": "stream",
  130. "text": [
  131. "Variable containing:\n",
  132. "\n",
  133. "Columns 0 to 9 \n",
  134. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  135. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  136. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  137. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  138. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  139. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  140. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  141. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  142. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  143. "-0.0600 -0.0242 -0.0514 0.0882 0.0056 -0.0400 -0.0300 -0.0052 -0.0289 -0.0172\n",
  144. "\n",
  145. "Columns 10 to 19 \n",
  146. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  147. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  148. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  149. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  150. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  151. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  152. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  153. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  154. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  155. "-0.0372 0.0144 -0.1074 -0.0363 -0.0189 0.0209 0.0618 0.0435 -0.0591 0.0103\n",
  156. "[torch.FloatTensor of size 10x20]\n",
  157. "\n"
  158. ]
  159. }
  160. ],
  161. "source": [
  162. "# 得到 x 的梯度\n",
  163. "print(x.grad)"
  164. ]
  165. },
  166. {
  167. "cell_type": "code",
  168. "execution_count": 6,
  169. "metadata": {},
  170. "outputs": [
  171. {
  172. "name": "stdout",
  173. "output_type": "stream",
  174. "text": [
  175. "Variable containing:\n",
  176. "1.00000e-02 *\n",
  177. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  178. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  179. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  180. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  181. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  182. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  183. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  184. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  185. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  186. " 2.0000 2.0000 2.0000 2.0000 2.0000\n",
  187. "[torch.FloatTensor of size 10x5]\n",
  188. "\n"
  189. ]
  190. }
  191. ],
  192. "source": [
  193. "# 得到 y 的的梯度\n",
  194. "print(y.grad)"
  195. ]
  196. },
  197. {
  198. "cell_type": "code",
  199. "execution_count": 7,
  200. "metadata": {},
  201. "outputs": [
  202. {
  203. "name": "stdout",
  204. "output_type": "stream",
  205. "text": [
  206. "Variable containing:\n",
  207. " 0.1342 0.1342 0.1342 0.1342 0.1342\n",
  208. " 0.0507 0.0507 0.0507 0.0507 0.0507\n",
  209. " 0.0328 0.0328 0.0328 0.0328 0.0328\n",
  210. "-0.0086 -0.0086 -0.0086 -0.0086 -0.0086\n",
  211. " 0.0734 0.0734 0.0734 0.0734 0.0734\n",
  212. "-0.0042 -0.0042 -0.0042 -0.0042 -0.0042\n",
  213. " 0.0078 0.0078 0.0078 0.0078 0.0078\n",
  214. "-0.0769 -0.0769 -0.0769 -0.0769 -0.0769\n",
  215. " 0.0672 0.0672 0.0672 0.0672 0.0672\n",
  216. " 0.1614 0.1614 0.1614 0.1614 0.1614\n",
  217. "-0.0042 -0.0042 -0.0042 -0.0042 -0.0042\n",
  218. "-0.0970 -0.0970 -0.0970 -0.0970 -0.0970\n",
  219. "-0.0364 -0.0364 -0.0364 -0.0364 -0.0364\n",
  220. "-0.0419 -0.0419 -0.0419 -0.0419 -0.0419\n",
  221. " 0.0134 0.0134 0.0134 0.0134 0.0134\n",
  222. "-0.0251 -0.0251 -0.0251 -0.0251 -0.0251\n",
  223. " 0.0586 0.0586 0.0586 0.0586 0.0586\n",
  224. "-0.0050 -0.0050 -0.0050 -0.0050 -0.0050\n",
  225. " 0.1125 0.1125 0.1125 0.1125 0.1125\n",
  226. "-0.0096 -0.0096 -0.0096 -0.0096 -0.0096\n",
  227. "[torch.FloatTensor of size 20x5]\n",
  228. "\n"
  229. ]
  230. }
  231. ],
  232. "source": [
  233. "# 得到 w 的梯度\n",
  234. "print(w.grad)"
  235. ]
  236. },
  237. {
  238. "cell_type": "markdown",
  239. "metadata": {},
  240. "source": [
  241. "上面数学公式就更加复杂,矩阵乘法之后对两个矩阵对应元素相乘,然后所有元素求平均,有兴趣的同学可以手动去计算一下梯度,使用 PyTorch 的自动求导,我们能够非常容易得到 x, y 和 w 的导数,因为深度学习中充满大量的矩阵运算,所以我们没有办法手动去求这些导数,有了自动求导能够非常方便地解决网络更新的问题。"
  242. ]
  243. },
  244. {
  245. "cell_type": "markdown",
  246. "metadata": {},
  247. "source": [
  248. "\n"
  249. ]
  250. },
  251. {
  252. "cell_type": "markdown",
  253. "metadata": {},
  254. "source": [
  255. "## 复杂情况的自动求导\n",
  256. "上面我们展示了简单情况下的自动求导,都是对标量进行自动求导,可能你会有一个疑问,如何对一个向量或者矩阵自动求导了呢?感兴趣的同学可以自己先去尝试一下,下面我们会介绍对多维数组的自动求导机制。"
  257. ]
  258. },
  259. {
  260. "cell_type": "code",
  261. "execution_count": 8,
  262. "metadata": {},
  263. "outputs": [
  264. {
  265. "name": "stdout",
  266. "output_type": "stream",
  267. "text": [
  268. "Variable containing:\n",
  269. " 2 3\n",
  270. "[torch.FloatTensor of size 1x2]\n",
  271. "\n",
  272. "Variable containing:\n",
  273. " 0 0\n",
  274. "[torch.FloatTensor of size 1x2]\n",
  275. "\n"
  276. ]
  277. }
  278. ],
  279. "source": [
  280. "m = Variable(torch.FloatTensor([[2, 3]]), requires_grad=True) # 构建一个 1 x 2 的矩阵\n",
  281. "n = Variable(torch.zeros(1, 2)) # 构建一个相同大小的 0 矩阵\n",
  282. "print(m)\n",
  283. "print(n)"
  284. ]
  285. },
  286. {
  287. "cell_type": "code",
  288. "execution_count": 9,
  289. "metadata": {},
  290. "outputs": [
  291. {
  292. "name": "stdout",
  293. "output_type": "stream",
  294. "text": [
  295. "Variable containing:\n",
  296. " 4 27\n",
  297. "[torch.FloatTensor of size 1x2]\n",
  298. "\n"
  299. ]
  300. }
  301. ],
  302. "source": [
  303. "# 通过 m 中的值计算新的 n 中的值\n",
  304. "n[0, 0] = m[0, 0] ** 2\n",
  305. "n[0, 1] = m[0, 1] ** 3\n",
  306. "print(n)"
  307. ]
  308. },
  309. {
  310. "cell_type": "markdown",
  311. "metadata": {},
  312. "source": [
  313. "将上面的式子写成数学公式,可以得到 \n",
  314. "$$\n",
  315. "n = (n_0,\\ n_1) = (m_0^2,\\ m_1^3) = (2^2,\\ 3^3) \n",
  316. "$$"
  317. ]
  318. },
  319. {
  320. "cell_type": "markdown",
  321. "metadata": {},
  322. "source": [
  323. "下面我们直接对 n 进行反向传播,也就是求 n 对 m 的导数。\n",
  324. "\n",
  325. "这时我们需要明确这个导数的定义,即如何定义\n",
  326. "\n",
  327. "$$\n",
  328. "\\frac{\\partial n}{\\partial m} = \\frac{\\partial (n_0,\\ n_1)}{\\partial (m_0,\\ m_1)}\n",
  329. "$$\n"
  330. ]
  331. },
  332. {
  333. "cell_type": "markdown",
  334. "metadata": {},
  335. "source": [
  336. "在 PyTorch 中,如果要调用自动求导,需要往`backward()`中传入一个参数,这个参数的形状和 n 一样大,比如是 $(w_0,\\ w_1)$,那么自动求导的结果就是:\n",
  337. "$$\n",
  338. "\\frac{\\partial n}{\\partial m_0} = w_0 \\frac{\\partial n_0}{\\partial m_0} + w_1 \\frac{\\partial n_1}{\\partial m_0}\n",
  339. "$$\n",
  340. "$$\n",
  341. "\\frac{\\partial n}{\\partial m_1} = w_0 \\frac{\\partial n_0}{\\partial m_1} + w_1 \\frac{\\partial n_1}{\\partial m_1}\n",
  342. "$$"
  343. ]
  344. },
  345. {
  346. "cell_type": "code",
  347. "execution_count": 10,
  348. "metadata": {},
  349. "outputs": [],
  350. "source": [
  351. "n.backward(torch.ones_like(n)) # 将 (w0, w1) 取成 (1, 1)"
  352. ]
  353. },
  354. {
  355. "cell_type": "code",
  356. "execution_count": 11,
  357. "metadata": {},
  358. "outputs": [
  359. {
  360. "name": "stdout",
  361. "output_type": "stream",
  362. "text": [
  363. "Variable containing:\n",
  364. " 4 27\n",
  365. "[torch.FloatTensor of size 1x2]\n",
  366. "\n"
  367. ]
  368. }
  369. ],
  370. "source": [
  371. "print(m.grad)"
  372. ]
  373. },
  374. {
  375. "cell_type": "markdown",
  376. "metadata": {},
  377. "source": [
  378. "通过自动求导我们得到了梯度是 4 和 27,我们可以验算一下\n",
  379. "$$\n",
  380. "\\frac{\\partial n}{\\partial m_0} = w_0 \\frac{\\partial n_0}{\\partial m_0} + w_1 \\frac{\\partial n_1}{\\partial m_0} = 2 m_0 + 0 = 2 \\times 2 = 4\n",
  381. "$$\n",
  382. "$$\n",
  383. "\\frac{\\partial n}{\\partial m_1} = w_0 \\frac{\\partial n_0}{\\partial m_1} + w_1 \\frac{\\partial n_1}{\\partial m_1} = 0 + 3 m_1^2 = 3 \\times 3^2 = 27\n",
  384. "$$\n",
  385. "通过验算我们可以得到相同的结果"
  386. ]
  387. },
  388. {
  389. "cell_type": "markdown",
  390. "metadata": {},
  391. "source": [
  392. "\n"
  393. ]
  394. },
  395. {
  396. "cell_type": "markdown",
  397. "metadata": {},
  398. "source": [
  399. "## 多次自动求导\n",
  400. "通过调用 backward 我们可以进行一次自动求导,如果我们再调用一次 backward,会发现程序报错,没有办法再做一次。这是因为 PyTorch 默认做完一次自动求导之后,计算图就被丢弃了,所以两次自动求导需要手动设置一个东西,我们通过下面的小例子来说明。"
  401. ]
  402. },
  403. {
  404. "cell_type": "code",
  405. "execution_count": 12,
  406. "metadata": {},
  407. "outputs": [
  408. {
  409. "name": "stdout",
  410. "output_type": "stream",
  411. "text": [
  412. "Variable containing:\n",
  413. " 18\n",
  414. "[torch.FloatTensor of size 1]\n",
  415. "\n"
  416. ]
  417. }
  418. ],
  419. "source": [
  420. "x = Variable(torch.FloatTensor([3]), requires_grad=True)\n",
  421. "y = x * 2 + x ** 2 + 3\n",
  422. "print(y)"
  423. ]
  424. },
  425. {
  426. "cell_type": "code",
  427. "execution_count": 13,
  428. "metadata": {},
  429. "outputs": [],
  430. "source": [
  431. "y.backward(retain_graph=True) # 设置 retain_graph 为 True 来保留计算图"
  432. ]
  433. },
  434. {
  435. "cell_type": "code",
  436. "execution_count": 14,
  437. "metadata": {},
  438. "outputs": [
  439. {
  440. "name": "stdout",
  441. "output_type": "stream",
  442. "text": [
  443. "Variable containing:\n",
  444. " 8\n",
  445. "[torch.FloatTensor of size 1]\n",
  446. "\n"
  447. ]
  448. }
  449. ],
  450. "source": [
  451. "print(x.grad)"
  452. ]
  453. },
  454. {
  455. "cell_type": "code",
  456. "execution_count": 15,
  457. "metadata": {
  458. "collapsed": true
  459. },
  460. "outputs": [],
  461. "source": [
  462. "y.backward() # 再做一次自动求导,这次不保留计算图"
  463. ]
  464. },
  465. {
  466. "cell_type": "code",
  467. "execution_count": 16,
  468. "metadata": {},
  469. "outputs": [
  470. {
  471. "name": "stdout",
  472. "output_type": "stream",
  473. "text": [
  474. "Variable containing:\n",
  475. " 16\n",
  476. "[torch.FloatTensor of size 1]\n",
  477. "\n"
  478. ]
  479. }
  480. ],
  481. "source": [
  482. "print(x.grad)"
  483. ]
  484. },
  485. {
  486. "cell_type": "markdown",
  487. "metadata": {},
  488. "source": [
  489. "可以发现 x 的梯度变成了 16,因为这里做了两次自动求导,所以讲第一次的梯度 8 和第二次的梯度 8 加起来得到了 16 的结果。"
  490. ]
  491. },
  492. {
  493. "cell_type": "markdown",
  494. "metadata": {},
  495. "source": [
  496. "\n"
  497. ]
  498. },
  499. {
  500. "cell_type": "markdown",
  501. "metadata": {},
  502. "source": [
  503. "**小练习**\n",
  504. "\n",
  505. "定义\n",
  506. "\n",
  507. "$$\n",
  508. "x = \n",
  509. "\\left[\n",
  510. "\\begin{matrix}\n",
  511. "x_0 \\\\\n",
  512. "x_1\n",
  513. "\\end{matrix}\n",
  514. "\\right] = \n",
  515. "\\left[\n",
  516. "\\begin{matrix}\n",
  517. "2 \\\\\n",
  518. "3\n",
  519. "\\end{matrix}\n",
  520. "\\right]\n",
  521. "$$\n",
  522. "\n",
  523. "$$\n",
  524. "k = (k_0,\\ k_1) = (x_0^2 + 3 x_1,\\ 2 x_0 + x_1^2)\n",
  525. "$$\n",
  526. "\n",
  527. "我们希望求得\n",
  528. "\n",
  529. "$$\n",
  530. "j = \\left[\n",
  531. "\\begin{matrix}\n",
  532. "\\frac{\\partial k_0}{\\partial x_0} & \\frac{\\partial k_0}{\\partial x_1} \\\\\n",
  533. "\\frac{\\partial k_1}{\\partial x_0} & \\frac{\\partial k_1}{\\partial x_1}\n",
  534. "\\end{matrix}\n",
  535. "\\right]\n",
  536. "$$\n",
  537. "\n",
  538. "参考答案:\n",
  539. "\n",
  540. "$$\n",
  541. "\\left[\n",
  542. "\\begin{matrix}\n",
  543. "4 & 3 \\\\\n",
  544. "2 & 6 \\\\\n",
  545. "\\end{matrix}\n",
  546. "\\right]\n",
  547. "$$"
  548. ]
  549. },
  550. {
  551. "cell_type": "code",
  552. "execution_count": 6,
  553. "metadata": {
  554. "collapsed": true
  555. },
  556. "outputs": [],
  557. "source": [
  558. "x = Variable(torch.FloatTensor([2, 3]), requires_grad=True)\n",
  559. "k = Variable(torch.zeros(2))\n",
  560. "\n",
  561. "k[0] = x[0] ** 2 + 3 * x[1]\n",
  562. "k[1] = x[1] ** 2 + 2 * x[0]"
  563. ]
  564. },
  565. {
  566. "cell_type": "code",
  567. "execution_count": 7,
  568. "metadata": {},
  569. "outputs": [
  570. {
  571. "name": "stdout",
  572. "output_type": "stream",
  573. "text": [
  574. "Variable containing:\n",
  575. " 13\n",
  576. " 13\n",
  577. "[torch.FloatTensor of size 2]\n",
  578. "\n"
  579. ]
  580. }
  581. ],
  582. "source": [
  583. "print(k)"
  584. ]
  585. },
  586. {
  587. "cell_type": "code",
  588. "execution_count": 8,
  589. "metadata": {},
  590. "outputs": [],
  591. "source": [
  592. "j = torch.zeros(2, 2)\n",
  593. "\n",
  594. "k.backward(torch.FloatTensor([1, 0]), retain_graph=True)\n",
  595. "j[0] = x.grad.data\n",
  596. "\n",
  597. "x.grad.data.zero_() # 归零之前求得的梯度\n",
  598. "\n",
  599. "k.backward(torch.FloatTensor([0, 1]))\n",
  600. "j[1] = x.grad.data"
  601. ]
  602. },
  603. {
  604. "cell_type": "code",
  605. "execution_count": 9,
  606. "metadata": {},
  607. "outputs": [
  608. {
  609. "name": "stdout",
  610. "output_type": "stream",
  611. "text": [
  612. "\n",
  613. " 4 3\n",
  614. " 2 6\n",
  615. "[torch.FloatTensor of size 2x2]\n",
  616. "\n"
  617. ]
  618. }
  619. ],
  620. "source": [
  621. "print(j)"
  622. ]
  623. },
  624. {
  625. "cell_type": "markdown",
  626. "metadata": {},
  627. "source": [
  628. "下一次课我们会介绍两种神经网络的编程方式,动态图编程和静态图编程"
  629. ]
  630. }
  631. ],
  632. "metadata": {
  633. "kernelspec": {
  634. "display_name": "Python 3",
  635. "language": "python",
  636. "name": "python3"
  637. },
  638. "language_info": {
  639. "codemirror_mode": {
  640. "name": "ipython",
  641. "version": 3
  642. },
  643. "file_extension": ".py",
  644. "mimetype": "text/x-python",
  645. "name": "python",
  646. "nbconvert_exporter": "python",
  647. "pygments_lexer": "ipython3",
  648. "version": "3.6.3"
  649. }
  650. },
  651. "nbformat": 4,
  652. "nbformat_minor": 2
  653. }

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。