-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
844 lines (528 loc) · 35.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
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
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
<!doctype html>
<html lang="zh" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="Tensorflow总纲,写给初学者们。本页面将简述Tensorflow的基本原理,结构设计以及版本更新。读者亦可在本页找到本教程将提供给读者对Tensorflow怎样的认识。">
<link rel="canonical" href="https://cainmagi.github.io/tensorflow-guide/">
<meta name="author" content="Yuchen Jin (cainmagi)">
<meta name="lang:clipboard.copy" content="复制">
<meta name="lang:clipboard.copied" content="已复制">
<meta name="lang:search.language" content="jp">
<meta name="lang:search.pipeline.stopwords" content="True">
<meta name="lang:search.pipeline.trimmer" content="True">
<meta name="lang:search.result.none" content="没有找到符合条件的结果">
<meta name="lang:search.result.one" content="找到 1 个符合条件的结果">
<meta name="lang:search.result.other" content="# 个符合条件的结果">
<meta name="lang:search.tokenizer" content="[\uff0c\u3002]+">
<link rel="shortcut icon" href="assets/images/icons/favicon.png">
<meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.0.1">
<title>扉页 - Tensorflow手札</title>
<link rel="stylesheet" href="assets/stylesheets/application.982221ab.css">
<link rel="stylesheet" href="assets/stylesheets/application-palette.224b79ff.css">
<meta name="theme-color" content="#ff7043">
<script src="assets/javascripts/modernizr.1f0bcf2b.js"></script>
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Serif+SC:300,400,400i,600,700,900|Roboto+Mono">
<style>body,input{font-family:"Noto Serif SC","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
<link rel="stylesheet" href="assets/fonts/material-icons.css">
<link rel="stylesheet" href="stylesheets/main.css">
<link rel="stylesheet" href="stylesheets/extensions.css">
<link rel="stylesheet" href="stylesheets/simpleLightbox.min.css">
<script>
window.ga = window.ga || function() {
(ga.q = ga.q || []).push(arguments)
}
ga.l = +new Date
/* Setup integration and send page view */
ga("create", "UA-119875813-2", "auto")
ga("set", "anonymizeIp", true)
ga("send", "pageview")
/* Register handler to log search on blur */
document.addEventListener("DOMContentLoaded", () => {
if (document.forms.search) {
var query = document.forms.search.query
query.addEventListener("blur", function() {
if (this.value) {
var path = document.location.pathname;
ga("send", "pageview", path + "?q=" + this.value)
}
})
}
})
</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
</head>
<body dir="ltr" data-md-color-primary="deep-orange" data-md-color-accent="orange">
<svg class="md-svg">
<defs>
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
viewBox="0 0 416 448" id="__github">
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
99.5z" />
</svg>
</defs>
</svg>
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
<a href="#_1" tabindex="1" class="md-skip">
跳转至
</a>
<header class="md-header" data-md-component="header">
<nav class="md-header-nav md-grid">
<div class="md-flex">
<div class="md-flex__cell md-flex__cell--shrink">
<a href="https://cainmagi.github.io/tensorflow-guide/" title="Tensorflow手札" class="md-header-nav__button md-logo">
<img src="assets/images/icons/Tensorflow.svg" width="24" height="24">
</a>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
</div>
<div class="md-flex__cell md-flex__cell--stretch">
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
<span class="md-header-nav__topic">
Tensorflow手札
</span>
<span class="md-header-nav__topic">
扉页
</span>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
<label class="md-icon md-search__icon" for="__search"></label>
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">

</button>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="result">
<div class="md-search-result__meta">
键入以开始搜索
</div>
<ol class="md-search-result__list"></ol>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<div class="md-header-nav__source">
<a href="https://github.com/cainmagi/tensorflow-guide" title="前往 Github 仓库" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
cainmagi/tensorflow-guide
</div>
</a>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container">
<nav class="md-tabs md-tabs--active" data-md-component="tabs">
<div class="md-tabs__inner md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="." title="TF 1.x" class="md-tabs__link md-tabs__link--active">
TF 1.x
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main">
<div class="md-main__inner md-grid" data-md-component="container">
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title md-nav__title--site" for="__drawer">
<a href="https://cainmagi.github.io/tensorflow-guide/" title="Tensorflow手札" class="md-nav__button md-logo">
<img src="assets/images/icons/Tensorflow.svg" width="48" height="48">
</a>
Tensorflow手札
</label>
<div class="md-nav__source">
<a href="https://github.com/cainmagi/tensorflow-guide" title="前往 Github 仓库" class="md-source" data-md-source="github">
<div class="md-source__icon">
<svg viewBox="0 0 24 24" width="24" height="24">
<use xlink:href="#__github" width="24" height="24"></use>
</svg>
</div>
<div class="md-source__repository">
cainmagi/tensorflow-guide
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-1" type="checkbox" id="nav-1" checked>
<label class="md-nav__link" for="nav-1">
TF 1.x
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
<label class="md-nav__title" for="nav-1">
TF 1.x
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
扉页
</label>
<a href="." title="扉页" class="md-nav__link md-nav__link--active">
扉页
</a>
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">目录</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#tensorflow" title="Tensorflow总说" class="md-nav__link">
Tensorflow总说
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tensorflow_1" title="Tensorflow治学" class="md-nav__link">
Tensorflow治学
</a>
</li>
<li class="md-nav__item">
<a href="#tensorflow_2" title="Tensorflow原理" class="md-nav__link">
Tensorflow原理
</a>
</li>
<li class="md-nav__item">
<a href="#tensorflow-api" title="Tensorflow API架构" class="md-nav__link">
Tensorflow API架构
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_2" title="教程导读" class="md-nav__link">
教程导读
</a>
</li>
<li class="md-nav__item">
<a href="#__comments" title="评论" class="md-nav__link md-nav__link--active">
评论
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-1-2" type="checkbox" id="nav-1-2">
<label class="md-nav__link" for="nav-1-2">
从线性问题入门
</label>
<nav class="md-nav" data-md-component="collapsible" data-md-level="2">
<label class="md-nav__title" for="nav-1-2">
从线性问题入门
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="book-1-x/chapter-1/" title="本章总说" class="md-nav__link">
本章总说
</a>
</li>
<li class="md-nav__item">
<a href="book-1-x/chapter-1/hello-world/" title="Hello world!" class="md-nav__link">
Hello world!
</a>
</li>
<li class="md-nav__item">
<a href="book-1-x/chapter-1/linear-classification/" title="线性分类" class="md-nav__link">
线性分类
</a>
</li>
<li class="md-nav__item">
<a href="book-1-x/chapter-1/linear-regression/" title="线性回归" class="md-nav__link">
线性回归
</a>
</li>
<li class="md-nav__item">
<a href="book-1-x/chapter-1/nonlinear-regression/" title="非线性回归" class="md-nav__link">
非线性回归
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="release-notes/" title="更新记录" class="md-nav__link">
更新记录
</a>
</li>
<li class="md-nav__item">
<a href="licenses/" title="协议" class="md-nav__link">
协议
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">目录</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="#tensorflow" title="Tensorflow总说" class="md-nav__link">
Tensorflow总说
</a>
<nav class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#tensorflow_1" title="Tensorflow治学" class="md-nav__link">
Tensorflow治学
</a>
</li>
<li class="md-nav__item">
<a href="#tensorflow_2" title="Tensorflow原理" class="md-nav__link">
Tensorflow原理
</a>
</li>
<li class="md-nav__item">
<a href="#tensorflow-api" title="Tensorflow API架构" class="md-nav__link">
Tensorflow API架构
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_2" title="教程导读" class="md-nav__link">
教程导读
</a>
</li>
<li class="md-nav__item">
<a href="#__comments" title="评论" class="md-nav__link md-nav__link--active">
评论
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content">
<article class="md-content__inner md-typeset">
<h1 id="_1">扉页<a class="headerlink" href="#_1" title="Permanent link">¶</a></h1>
<div class="admonition abstract">
<p class="admonition-title">摘要</p>
<p>Tensorflow总纲,写给初学者们。本页面将简述Tensorflow的基本原理,结构设计以及版本更新。读者亦可在本页找到本教程将提供给读者对Tensorflow怎样的认识。</p>
</div>
<details class="warning"><summary>注意</summary><p>由于技术限制,现在中文搜索功能无法完善,请注意当搜索关键词的时候自行分词,例如:</p>
<div class="codehilite"><pre><span></span>开放源代码软件库
</pre></div>
<p>无法搜到任何内容。但可以搜索</p>
<div class="codehilite"><pre><span></span>开放 源代码 软件 库
</pre></div>
<p>即可确保索引到上述内容。</p>
</details>
<h2 id="tensorflow">Tensorflow总说<a class="headerlink" href="#tensorflow" title="Permanent link">¶</a></h2>
<div class="admonition quote">
<p class="admonition-title">Tensorflow官网</p>
<p>TensorFlow™ 是一个开放源代码软件库,用于进行高性能数值计算。借助其灵活的架构,用户可以轻松地将计算工作部署到多种平台(CPU、GPU、TPU)和设备(桌面设备、服务器集群、移动设备、边缘设备等)。TensorFlow™ 最初是由 Google Brain 团队(隶属于 Google 的 AI 部门)中的研究人员和工程师开发的,可为机器学习和深度学习提供强力支持,并且其灵活的数值计算核心广泛应用于许多其他科学领域。</p>
</div>
<h3 id="tensorflow_1">Tensorflow治学<a class="headerlink" href="#tensorflow_1" title="Permanent link">¶</a></h3>
<p>写在所有内容之前,读者不得不看以下几个页面,本教程所述内容大略来自于对这些资料的研读。</p>
<ul>
<li><strong>Tensorflow官网(中/英文)</strong>: <a href="https://www.tensorflow.org/">https://www.tensorflow.org/</a></li>
<li><strong>Keras中文文档</strong>: <a href="https://keras-zh.readthedocs.io/">https://keras-zh.readthedocs.io/</a></li>
<li><strong>Tensorflow 2.0前瞻(英文)</strong>: <a href="https://medium.com/tensorflow/effective-tensorflow-2-0-best-practices-and-whats-changed-a0ca48767aff">https://medium.com/tensorflow/effective-tensorflow-2-0-best-practices-and-whats-changed-a0ca48767aff</a></li>
<li><strong>Tensorflow 2.0前瞻(中文)</strong>: <a href="https://zhuanlan.zhihu.com/p/50049041">https://zhuanlan.zhihu.com/p/50049041</a></li>
</ul>
<details class="tip" open="open"><summary>提示</summary><p>特别值得注意的是,现在官方文档至少在教程部分,<strong>已经支持中英双语</strong>。相比官方文档,我们的教程更侧重于以搭建工程为导向的设计。然而现在官方文档的翔实可读程度,确实不可错过。另一方面,Keras的<a href="https://keras.io/zh/">官方中文文档</a>似乎已不再更新,上面提供的原官方中文文档译者现在正在更新、维护的版本。</p>
</details>
<p>大略来说,学习Tensorflow主要应当依赖于官方文档的介绍。敝人自r1.4版开始入门Tensorflow,即是通过学习官方文档的教程来快速上手。相比四处蒐集资料,官方文档能提供一个完整、系统、完全贴合时下最新API的例子,帮助用户建立一个与Tensorflow各个功能合宜的使用习惯。若是通过在Github上检索他人的project,固然是一个很好的上手办法,但是往往就会遗漏某些重要的功能而不学。例如,Tensorflow自带的网络存取和Tensorboard API,在时兴的一些project中,经常会因方便之故,以numpy的IO来代替。笔者以为,如此培养起来的使用习惯,可谓走入偏门。当然,从这一点来说,本教程也亦复如是,即使笔者写下这些内容的时候,参照的乃是时下最新的API,时间一久,难免会过时。倘若笔者懒惰一些,不再时时更新本教程,那么本教程也就入不足取之流了。</p>
<p>虽然如此,教程也有并不合宜的地方。最大的问题莫过于Tensorflow本身,它有着日新月异的变化,此时能圆转如意地使用的API,到了彼时也许就成了废案。这就导致Tensorflow的官方教程也不断更新。r1.4时,教程还主要集中在如何使用“底层”API上,到了r1.9.0,就已经变成基本围绕着<code>tf.keras</code>设计的思路了。最新消息显示,即将上线的Tensorflow 2.0,将会彻底抛弃过去的“中层”API以下的全部方法,<code>tf.layers</code>, <code>tf.contrib</code>都将被移除,倘若长期墨守成规,局限在入门时候的一套技术上,迟早会被官方库如此迅速的更新所弃。这也是无可奈何之事。毕竟Tensorflow仍然处于不断改进之中。倘若希望追求一个更加稳定、长期可用的库,keras或许是一个不错的选择。</p>
<p>故而,本教程将基本基于Tensorflow现在的版本(r1.13)展开介绍。本教程既可以看作一个入门教程,也可以看作是本人重新自学新版Tensorflow规范化API的一个手记,故而命名本教程为“手札”。读者不妨跟着笔者的思路,有如与笔者共学一般读下来本教程。</p>
<h3 id="tensorflow_2">Tensorflow原理<a class="headerlink" href="#tensorflow_2" title="Permanent link">¶</a></h3>
<p>一个标准的Tensorflow工作流可以表示成这样:</p>
<div class="mermaid">graph TD
st(开始) --> Sess[启动Session]
Sess --> ConNet[构建网络]
subgraph 构造流程
ioNet>读取网络参数] --> ConNet
end
subgraph 执行流程
ioDat>导入数据] --> Run
ConNet --> Run[执行网络]
Run --> ioNetS>保存网络参数]
Run --> ioRes>导出结果]
end
ioRes --> SessCl[关闭Session]
SessCl --> ed(结束)
classDef styStart fill:#FAE6A9,stroke:#BA9132;
classDef styIO fill:#cde498,stroke:#13540c;
class st,ed styStart
class ioNet,ioNetS,ioDat,ioRes styIO</div>
<p>与一般的计算库不同,Tensorflow的执行流程大体可以分为两步:</p>
<ol>
<li><strong>构造流程</strong>: 在这一步,Tensorflow根据用户代码构造一个<a href="https://www.tensorflow.org/guide/graphs">数据流图(dataflow graph)</a>。所谓数据流图,指的是由一系列<a href="https://www.tensorflow.org/guide/tensors">张量(Tensor)</a>构成的符号运算集合。就如同一张流程图一样,在这一阶段,尽管用户定义了每一步的运算(从简单的加减乘除到复杂的网络单元),但是没有任何运算被执行。就像一个程序员撰写代码一样,Tensorflow在这一步,将用户的代码转换成它的“机器语言”,但是网络还没有进入被使用的阶段。</li>
<li><strong>执行流程</strong>: 在这一步,Tensorflow将计算用户指定的某个<span></span><strong>Tensor</strong><span></span>的输出结果。要得到一个Tensor的输出,则必须得计算它一系列的依赖变量。例如,我们已知<span><span class="MathJax_Preview">y = x_1 + x_2</span><script type="math/tex">y = x_1 + x_2</script></span>, <span><span class="MathJax_Preview">x_2 = z_1 \times z_2</span><script type="math/tex">x_2 = z_1 \times z_2</script></span>。那么,如果Tensorflow要得到<span><span class="MathJax_Preview">y</span><script type="math/tex">y</script></span>的结果,它就必须先计算<span><span class="MathJax_Preview">x_2</span><script type="math/tex">x_2</script></span>。这个过程被完全地封装起来,从用户看来,我们只需要调用<span><span class="MathJax_Preview">y</span><script type="math/tex">y</script></span>的输出即可,不需要关心Tensorflow是怎样按照流图完成计算的。</li>
</ol>
<p>因此,典型的Tensorflow式的语言风格也可以这样划分:</p>
<ol>
<li><strong>构造流程</strong>: 用户定义整个网络的符号运算,指定网络各个节点的属性、输入和输出。这些代码往往被写成一个函数(例如<code class="codehilite"><span class="k">def</span> <span class="nf">construct</span><span class="p">():</span></code>)</li>
<li><strong>执行流程</strong>: 创建一个Session,在Session内调用构造函数,然后输入数据,得到并保存输出结果。必要情况下,还需要导入导出网络参数。</li>
</ol>
<p>这里提到<a href="https://www.tensorflow.org/guide/graphs#executing_a_graph_in_a_tfsession">会话(Session)</a>。Session如同一个Tensorflow虚拟机,在一个Session打开的时候,设备的计算资源(GPU, CPU, 带宽等)才被加载。Session又如同一个工人,用户撰写的网络构造代码如同车间,输入的数据如同商品,“工人(Session)”利用预定义好的“车间(流图)”将可以快速、批量地生产这些“商品(数据)”。这样地设计保证了一些外围的代码,例如指定网络参数的名称、函数的属性等操作,不需要重复进行,从而确保处理数据的时候,总是执行必要的代码,加快运算速度。</p>
<p>另一方面,构造-执行的结构还封装了许多提高运算效率的特性,例如多线程。尽管用户定义网络构造的时候,所写的代码是按照逻辑顺序的、线性的。但实际运行的时候,Tensorflow可以自行发现网络的哪些部分可以被同时运行,从而利用多核系统的计算资源。这些过程也是被完全封装起来的,用户并不需要花费心思去专门进行这些调整。</p>
<details class="info" open="open"><summary>须知</summary><p>在Tensorflow已经转变为Keras导向的现在,Session的调用被Keras API封装了起来,从用户的角度来看,现在已经不再需要手动调用Session。</p>
</details>
<h3 id="tensorflow-api">Tensorflow API架构<a class="headerlink" href="#tensorflow-api" title="Permanent link">¶</a></h3>
<p>下图显示了当前Tensorflow-API的组织形式</p>
<p><img alt="Tensorflow APIs" class="img-fluid" src="assets/images/cov/apis.svg" tag="1" title="Tensorflow APIs" /></p>
<p>Tensorflow在多个平台上均有部署,包括Python, C++, Java, Javascript, Go等,未来还可能支持更多的语言。然而,不同平台上,API的使用方式和代码风格是大不相同的。例如,Python的语言风格目前已经朝向Keras转变,而Javascript仍倾向于使用中层API;C++和Java偏向于使用底层API编写程序。本教程只针对时兴Python的API编写,除非涉及到特定的专题,不会讨论其他语言上Tensorflow的用法。</p>
<p>一般而言,Tensorflow将API面向划分为三个层次:</p>
<ol>
<li><strong>高层API (High level)</strong>: 包括Estimators和Keras;</li>
<li><strong>中层API (Mid level)</strong>: 包括layers, datasets, loss和metrics等具有功能性的函数,例如网络层的定义,Loss Function,对结果的测量函数等;</li>
<li><strong>底层API (Low level)</strong>: 包括具体的加减乘除、具有解析式的数学函数、卷积、对Tensor属性的测量等。</li>
</ol>
<p>从r1.4入门的用户,所接受的训练往往是从底层API开始,使用自己的代码风格构建对应中层API的函数,然后再用自己定义好的中层API构建网络。在这种代码风格的驱使下,用户除了需要定义各个网络层具体的表达式,还需要设计输入输出的接口,用来调用<a href="https://www.tensorflow.org/api_docs/python/tf/train/Optimizer">优化器(optimizer)</a>的接口等操作。</p>
<p>另一种使用方式,是从中层API开始,直接使用预定义好的网络层构建网络,这样的代码风格会节省一部分时间,相当于几乎不再需要接触底层API,但是在输入输出、网络训练和测试等更高层的模块设计上,和底层API用户的代码风格相似。</p>
<p>Estimators是从r1.4就已经存在的API了,它可以被看成是已经集成在Tensorflow里的完整的网络。因此,Estimators往往适合分发、需求不高的应用,但是并不适合使用Tensorflow的研究者。尽管至今为止,Tensorflow仍然对Estimators倍加推崇,但本教程将完全不涉及这方面的内容。</p>
<p>另一个高层API是<a href="https://www.tensorflow.org/guide/eager">Eager Execution</a>,从r1.9起,Tensorflow就加入了这种新的使用模式,并且在Tensorflow 2.0中,它仍然将会被保留。Eager摈弃了上述的构造-执行流程,任何对Tensor的定义会被立时计算、并可得到结果。对于需要进行小规模的调试、检查API功能的用户而言更加方便。但是,据一些用户的反响,现在Eager还没有做到和之前API的完全兼容,本教程将基本不涉及Eager的用法。</p>
<p>因此,Keras API将是本教程的重中之重。使用本教程的用户,可以对照目前的官方文档,跟进本教程的思路,自己逐步实现各个project的设计。使用Keras风格的设计,代码量会明显少于前面提到的各种风格(Estimators除外)。事实上,<code>tf.keras</code>和底层API之间具有一定的兼容,这样的编写风格能让我们在满足自己设计的派生功能的基础上,尽可能使用规范化、预定义的API单元,从而减少代码出错的可能性。通过对本教程TF 1.x版的学习,对未来2.0版的上手也会带来莫大帮助。</p>
<p style="text-align:right">金宇琛(<a class="magiclink magiclink-github magiclink-mention" href="https://github.com/cainmagi" title="GitHub User: cainmagi">@cainmagi</a>),2019年3月2日</p>
<p style="text-align:right">Yuchen Jin(<a class="magiclink magiclink-github magiclink-mention" href="https://github.com/cainmagi" title="GitHub User: cainmagi">@cainmagi</a>), Mar. 2, 2019</p>
<h2 id="_2">教程导读<a class="headerlink" href="#_2" title="Permanent link">¶</a></h2>
<p>接下来,本教程将会涉及</p>
<ul>
<li><strong>从线性问题入门</strong>: 如何使用Tensorflow完成一个简单的线性分类设计,我们将从Hello World开始,逐步过渡到一个具有核函数的非线性问题project。<ul>
<li>Hello world: 第一个Tensorflow程序。</li>
<li>线性分类: 一个简单的二分类问题。</li>
<li>线性回归: 一个同样简单的,线性拟合问题。</li>
<li>非线性回归: 拟合一个简单的,可以表达出解析式的非线性函数。</li>
<li>非线性分类: 使用线性分类器对非线性分布的数据进行分类。</li>
</ul>
</li>
<li><strong>训练与测试分立</strong>: 从这一章开始,并试图解决几个更加复杂的实际问题。这里涉及到的project相对更大、更完整,训练往往需要一定时间才能完成。因此,在本章,所有项目的训练、测试环节都会分开,我们将从这里开始,使用TensorBoard跟踪我们的训练情况,并介绍如何存取神经网络。<ul>
<li>Super Resolution: 使用神经网络进行图像像素插值。</li>
<li>Sparse Coding: 使用线性的词典学习(dictionary learning)来进行图像像素插值。</li>
<li>Generitive Model: 使用时兴的生成模型(Generitive Model)来完成图像风格的转换。</li>
</ul>
</li>
<li><strong>原生的数据管理</strong>: 从这一章开始,我们将纳入Tensorflow自带的数据管理API。实际上,很多用户并不习惯使用这些API,往往倾向于自己完成数据的导入导出。虽然这并非一个复杂的工作,但据Tensorflow的文档,原生的数据管理内部实现了多线程,本身更适合用于提高数据IO的效率。读者可以酌情选择是否需要阅读本章。<ul>
<li>使用MINIST数据集: 使用原生的数据管理来IO一个现成的MINIST数据集,这一节改自<a href="https://www.tensorflow.org/tutorials/keras/basic_classification">官方文档教程</a>。</li>
<li>使用RNN处理文章: 通过LSTM模型来进行文本分类,并使用原生的数据管理来IO一个现成的IMDB数据集,这一节改自<a href="https://www.tensorflow.org/tutorials/keras/basic_text_classification">官方文档教程</a>。</li>
<li>使用RBM生成音频: 通过限制玻尔兹曼机(RBM)来编写一个简单的音乐生成器,这一节改自<a class="magiclink magiclink-github magiclink-repository" href="https://github.com/llSourcell/Music_Generator_Demo" title="GitHub Repository: llSourcell/Music_Generator_Demo">llSourcell/Music_Generator_Demo</a>。</li>
</ul>
</li>
<li><strong>其他的高级技巧</strong>: 本章将介绍一些特殊的、利用底层API技巧,使得用户能更灵活地定制Tensorflow-keras,从而实现一些仅依靠原生库不能实现的功能。</li>
</ul>
<h2 id="__comments">评论</h2>
<div id="disqus_thread"></div>
<script>
var disqus_config = function () {
this.page.url = "https://cainmagi.github.io/tensorflow-guide/";
this.page.identifier =
"";
};
(function() {
var d = document, s = d.createElement("script");
s.src = "//tensorflow-guide.disqus.com/embed.js";
s.setAttribute("data-timestamp", +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="book-1-x/chapter-1/" title="本章总说" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
前进
</span>
本章总说
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright © 2019 Yuchen Jin
</div>
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
</div>
<div class="md-footer-social">
<link rel="stylesheet" href="assets/fonts/font-awesome.css">
<a href="https://cainmagi.github.io/" class="md-footer-social__link fa fa-globe"></a>
<a href="mailto:[email protected]" class="md-footer-social__link fa fa-envelope"></a>
<a href="https://github.com/cainmagi" class="md-footer-social__link fa fa-github-alt"></a>
<a href="https://twitter.com/squidfunk" class="md-footer-social__link fa fa-steam"></a>
<a href="https://weibo.com/u/5885093621" class="md-footer-social__link fa fa-weibo"></a>
<a href="https://www.youtube.com/channel/UCzqpNK5qFMy5_cI1i0Z1nQw" class="md-footer-social__link fa fa-youtube-play"></a>
<a href="https://music.163.com/#/user/home?id=276304206" class="md-footer-social__link fa fa-music"></a>
</div>
</div>
</div>
</footer>
</div>
<script src="assets/javascripts/application.43ad2ac2.js"></script>
<script src="assets/javascripts/lunr/lunr.stemmer.support.js"></script>
<script src="assets/javascripts/lunr/tinyseg.js"></script>
<script src="assets/javascripts/lunr/lunr.jp.js"></script>
<script>app.initialize({version:"1.0.4",url:{base:"."}})</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/8.0.0/mermaid.min.js"></script>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="javascripts/simpleLightbox.min.js"></script>
<script src="javascripts/extensions.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML"></script>
</body>
</html>