91精品国产综合久久四虎久久_国产成人午夜高潮毛片_99er视频精品免费观看_2020亚洲熟女在线观看_日本女优人体写真_国内黄色毛片_年轻的老师中文版在线_丰满女邻居做爰_久久久久久精品成人免费图片

你好,TensorFlow!
從零開始構(gòu)建和訓(xùn)練你的第一個(gè)TensorFlow圖

TensorFlow作為一個(gè)項(xiàng)目比你能想象到的更大。事實(shí)上,它是深度學(xué)習(xí)的一個(gè)庫(kù)。這個(gè)項(xiàng)目與谷歌之間的關(guān)系幫助它獲得了很多的關(guān)注。但是在這些喧嘩的表面下,這個(gè)項(xiàng)目還是有些獨(dú)特的元素值得仔細(xì)的關(guān)注,包括:

  • TensorFlow的核心庫(kù)不僅僅只用于深度學(xué)習(xí),它也適用于更廣范圍的機(jī)器學(xué)習(xí)技術(shù)。
  • 線性代數(shù)和其他內(nèi)部核心也明確地開放出來(lái)
  • 除了核心的機(jī)器學(xué)習(xí)功能,TensorFlow還包括它自己的日志系統(tǒng),自己的交互式日志可視化工具,甚至是它自己深度工程化的服務(wù)架構(gòu)
  • TensorFlow的執(zhí)行模式和Python的scikit-learn包以及大部分R語(yǔ)言的工具都不一樣

這些都是很酷的東西。但是特別是對(duì)于那些第一次接觸機(jī)器學(xué)習(xí)的人,TensorFlow有更多可以學(xué)習(xí)使用的東西。

TensorFlow是如何工作的?讓我們把它拆開,來(lái)仔細(xì)看看并理解它的內(nèi)部情況。我們會(huì)探索數(shù)據(jù)流圖(這些圖定義了你的數(shù)據(jù)會(huì)經(jīng)歷的計(jì)算),了解如何使用TensorFlow的梯度下降法訓(xùn)練模型,以及如何用TensorBoard可視化你的TensorFlow工作。后面的例子不會(huì)解決工業(yè)級(jí)的機(jī)器學(xué)習(xí)問(wèn)題,但是它會(huì)幫助你理解構(gòu)成TensorFlow的所有基礎(chǔ)組成部分,包括今后你想要構(gòu)建的。

Python和TensorFlow里的命名和執(zhí)行

TensorFlow管理計(jì)算的方法和Python通常的管理方法并不是完全不同。借用哈德利·威科姆的話,對(duì)于兩者,需要謹(jǐn)記是對(duì)象并沒(méi)有名字(參見(jiàn)圖1)。為了理解Python和TensorFlow的工作的異同點(diǎn),讓我們先看看他們是怎么引用對(duì)象和處理運(yùn)行的。

1400px-image01-04b58810411f87b7bc561dee09b220f8

圖1:名字對(duì)應(yīng)著對(duì)象,但反之則不是。哈德利·威科姆授權(quán)使用

變量名在Python代碼里并不是它們所指代的東西;它們僅僅是對(duì)象的指針。因此當(dāng)你在Python里面寫下foo = []和bar = foo時(shí),這并不僅僅表明foo等于bar,實(shí)際上foo就是bar,它們都是對(duì)于同一個(gè)列表對(duì)象的指針。

>>> foo = []
>>> bar = foo
>>> foo == bar
## True
>>> foo is bar
## True

如果你執(zhí)行id(foo)和id(bar),就會(huì)看到結(jié)果是一樣的。如果沒(méi)有正確地理解這種一致性就可能會(huì)導(dǎo)致出人意料的程序漏洞,特別是對(duì)于像列表這樣的可變數(shù)據(jù)結(jié)構(gòu)。

Python內(nèi)部會(huì)管理所有的對(duì)象,并跟蹤所有的變量名以及他們所指代的對(duì)象。TensorFlow的圖則是代表了這種管理的另一層。如我們將看到的,

當(dāng)你在交互式解釋器內(nèi)或Shell環(huán)境內(nèi)輸入了一段Python表達(dá)式,它就立刻被執(zhí)行了。Python總是立刻去做你要它做的事。所以如果我告訴Python運(yùn)行foo.append(bar),Python就立刻append了,即便我永遠(yuǎn)也不會(huì)再用foo。

一個(gè)相比“懶”點(diǎn)的方法就是,當(dāng)我輸入foo.append(bar)后,Python在未來(lái)的某個(gè)時(shí)間去運(yùn)行,并把bar給添加到foo里面。這種方式就和TensorFlow的運(yùn)行方式差不多。即定義關(guān)系的動(dòng)作和實(shí)際去運(yùn)行產(chǎn)生結(jié)果的動(dòng)作是完全分離的。

TensorFlow更進(jìn)一步地把運(yùn)算的定義和具體的執(zhí)行分離開,并放到不同的地方。用一個(gè)圖定義多個(gè)操作,但這些操作僅僅在一個(gè)會(huì)話里真正運(yùn)行。圖和會(huì)話的建立是相互獨(dú)立的。圖更像一個(gè)藍(lán)圖,而會(huì)話則是建筑工地。

回頭看看里那個(gè)簡(jiǎn)單的Python例子,foo和bar都指向同一個(gè)列表。把bar添加到foo里面,我們把一個(gè)列表放到了它自己里面。你可以把這個(gè)數(shù)據(jù)結(jié)構(gòu)想象成一個(gè)只有一個(gè)節(jié)點(diǎn)的圖,這個(gè)節(jié)點(diǎn)的邊指向了它自己。嵌套列表是一種圖形式的表現(xiàn),這與TensorFlow的運(yùn)算圖類似。

>>> foo.append(bar)
>>> foo
## [[...]]

而真正的TensorFlow的運(yùn)算圖會(huì)比這個(gè)更有趣!

最簡(jiǎn)單的TensorFlow圖

為了能得到實(shí)戰(zhàn)經(jīng)驗(yàn),讓我們先從零開始建一個(gè)最簡(jiǎn)單的TensorFlow圖。相比于一些其他的框架,TensorFlow的安裝是極度簡(jiǎn)單的。這里的例子在Python 2.7版和3.3以上版本都可以運(yùn)行,這用的TensorFlow版本是0.8。

>>> import tensorflow as tf

這句運(yùn)行后,TensorFlow已經(jīng)為我們開始管理了很多的狀態(tài)。例如,已經(jīng)有一個(gè)隱含的默認(rèn)圖存在。TensorFlow內(nèi)部的默認(rèn)圖是存在_default_graph_stack里了,但是我們不能直接使用。我們使用tf.get_default_graph()來(lái)使用它。

>>> graph = tf.get_default_graph()

TensorFlow圖里的節(jié)點(diǎn)被稱為“運(yùn)算”(operation)或“ops”。我們可以通過(guò)graph.get_operations()來(lái)得到圖里的所有的運(yùn)算。

>>> graph.get_operations()
## []

現(xiàn)在圖里什么都沒(méi)有。我們需要往圖里放入一些我們希望TensorFlow的圖里計(jì)算的東西。讓我們從一個(gè)簡(jiǎn)單的常量輸入開始。

>>> input_value = tf.constant(1.0)

現(xiàn)在這個(gè)常量已經(jīng)作為圖里的一個(gè)節(jié)點(diǎn)(一個(gè)運(yùn)算)存在了。這個(gè)Python變量input_value間接地指向了這個(gè)運(yùn)算,但是我們也能在這個(gè)默認(rèn)圖里面找到。

>>> operations = graph.get_operations()
>>> operations
## [<tensorflow.python.framework.ops.Operation at 0x1185005d0>]
>>> operations[0].node_def
## name: "Const"
## op: "Const"
## attr {
##   key: "dtype"
##   value {
##     type: DT_FLOAT
##   }
## }
## attr {
##   key: "value"
##   value {
##     tensor {
##       dtype: DT_FLOAT
##       tensor_shape {
##       }
##       float_val: 1.0
##     }
##   }
## }

TensorFlow內(nèi)部使用protocol buffer(來(lái)存儲(chǔ)數(shù)據(jù))。Protocol buffer是谷歌推廣的類似JSON的東西。上面打印常量運(yùn)算的node_def的結(jié)果顯示出TensorFlow用protocol buffer表示的列表里第一個(gè)常量的內(nèi)容。

剛剛接觸TensorFlow的人有時(shí)會(huì)問(wèn)干嘛要弄這些TensorFlow版本的對(duì)象。為什么不能直接用Python的對(duì)象而非要定義TensorFlow的對(duì)象?TensorFlow的一個(gè)教程是這樣解釋的:

在Python里,為了更有效地進(jìn)行數(shù)值計(jì)算,我們通常會(huì)使用例如NumPy這樣的包來(lái)進(jìn)行復(fù)雜的計(jì)算,比如矩陣相乘。這些包可能是用非Python的其他語(yǔ)言寫的,從而使得效率更高。不幸的是,每個(gè)計(jì)算轉(zhuǎn)換回Python后都會(huì)帶來(lái)很多的開銷。這些開銷對(duì)于使用GPU計(jì)算或是分布式計(jì)算來(lái)說(shuō)是太糟了,因?yàn)檫@些運(yùn)算模式下的數(shù)據(jù)傳輸?shù)拇鷥r(jià)很高。

TensorFlow也替Python做了一些“臟活”,但是它設(shè)法避免了這些開銷。不是在Python之外獨(dú)立的去運(yùn)行一個(gè)個(gè)復(fù)雜的計(jì)算,TensorFlow讓我們?nèi)ザx一個(gè)圖來(lái)描述這些交互的計(jì)算,并完全在Python之外獨(dú)立地運(yùn)行。這和Theano或Torch的方式比較類似。

如果仔細(xì)看看我們的input_value,就會(huì)發(fā)現(xiàn)這個(gè)是一個(gè)無(wú)維度的32位浮點(diǎn)張量:就是一個(gè)數(shù)字。

>>> input_value
## <tf.Tensor 'Const:0' shape=() dtype=float32>

值得注意的是,這個(gè)結(jié)果并沒(méi)有說(shuō)明這個(gè)數(shù)字是多少?為了執(zhí)行input_value這句話,并給出這個(gè)數(shù)字的值,我們需要?jiǎng)?chuàng)造一個(gè)“會(huì)話”。讓圖里的計(jì)算在其中執(zhí)行并明確地要執(zhí)行input_value并給出結(jié)果(會(huì)話會(huì)默認(rèn)地去找那個(gè)默認(rèn)圖)

>>> sess = tf.Session()
>>> sess.run(input_value)
## 1.0

“執(zhí)行”一個(gè)常量可能會(huì)讓人覺(jué)得有點(diǎn)怪。但是這與在Python里執(zhí)行一個(gè)表達(dá)式并沒(méi)有什么區(qū)別。這就是TensorFlow管理它自己的對(duì)象空間(計(jì)算圖)和它自己的執(zhí)行的方式。

最簡(jiǎn)單的TensorFlow神經(jīng)元

現(xiàn)在已經(jīng)有了一個(gè)會(huì)話,其中有一個(gè)簡(jiǎn)單的圖。下面讓我們構(gòu)建僅有一個(gè)參數(shù)的神經(jīng)元,或者叫權(quán)重。通常即使是簡(jiǎn)單的神經(jīng)元也都會(huì)有偏置項(xiàng)和非一致的啟動(dòng)函數(shù),但我們先不管這些。

神經(jīng)元的權(quán)重不必須是常量,我們會(huì)期望這個(gè)值能改變從而學(xué)習(xí)訓(xùn)練數(shù)據(jù)里的輸入和輸出。這里我們定義權(quán)重是一個(gè)TensorFlow的變量,并給它一個(gè)初值0.8。

>>> weight = tf.Variable(0.8)

你可能會(huì)以為加一個(gè)變量是向圖里加一個(gè)運(yùn)算,但這一行其實(shí)是加入了四個(gè)運(yùn)算。我們可以查看所有的這些運(yùn)算的名字。

>>> for op in graph.get_operations(): print(op.name)
## Const
## Variable/initial_value
## Variable
## Variable/Assign
## Variable/read

我們不會(huì)每個(gè)運(yùn)算都仔細(xì)看看,但很有必要至少看一個(gè)像真正運(yùn)算的例子。

>>> output_value = weight * input_value

現(xiàn)在圖里有六個(gè)運(yùn)算,最后一個(gè)是相乘。

>>> op = graph.get_operations()[-1]
>>> op.name
## 'mul'
>>> for op_input in op.inputs: print(op_input)
## Tensor("Variable/read:0", shape=(), dtype=float32)
## Tensor("Const:0", shape=(), dtype=float32)

上面的代碼展示了乘運(yùn)算以及它的輸入:來(lái)自圖里的其他運(yùn)算。為了更好地理解整個(gè)圖而去查看這些引用很快就會(huì)變的極度繁瑣。用TensorBoard的圖可視化就是可以幫助查看的。

怎么才能看到乘積是多少?我們必須“運(yùn)行”這個(gè)output_value運(yùn)算。但是這個(gè)運(yùn)算依賴于一個(gè)變量:權(quán)重。我們告訴TensorFlow這個(gè)權(quán)重的初始值是0.8,但在這個(gè)會(huì)話里,這個(gè)值還沒(méi)有被設(shè)置。tf.initialize_all_variables()函數(shù)生成了一個(gè)運(yùn)算,來(lái)初始化所有的變量(我們的情況是只有一個(gè)變量)。隨后我們就可以運(yùn)行這個(gè)運(yùn)算了。

>>> init = tf.initialize_all_variables()
>>> sess.run(init)

tf.initialize_all_variables()的結(jié)果會(huì)包括現(xiàn)在圖里所有變量的初始化器。所以如果你后續(xù)加入了新的變量,你就需要再次使用tf.initialize_all_variables()。一個(gè)舊的init是不會(huì)包括新的變量的。

現(xiàn)在我們已經(jīng)準(zhǔn)備好運(yùn)行output_value運(yùn)算了。

>>> sess.run(output_value)
## 0.80000001

0.8 * 1.0是一個(gè)32位的浮點(diǎn)數(shù),而32位浮點(diǎn)數(shù)一般不會(huì)是0.8。0.80000001是系統(tǒng)可以獲得的一個(gè)近似值。

在TensorBoard里查看你的圖

到目前為止,我們的圖是很簡(jiǎn)單的,但是能看到她的圖形表現(xiàn)形式也是很好的。我們用TensorBoard來(lái)生成這個(gè)圖形。TensorBoard讀取存在每個(gè)運(yùn)算里面的名字字段,這和Python里的變量名是很不一樣的。我們可以使用這些TensorFlow的名字,并轉(zhuǎn)成更方便的Python變量名。這里tf.mul和我前面使用*來(lái)做乘運(yùn)算是等價(jià)的,但這個(gè)操作可以讓我們?cè)O(shè)置運(yùn)算的名字。

>>> x = tf.constant(1.0, name='input')
>>> w = tf.Variable(0.8, name='weight')
>>> y = tf.mul(w, x, name='output')

TensorBoard是通過(guò)查看一個(gè)TensorFlow會(huì)話創(chuàng)建的輸出的目錄來(lái)工作的。我們可以先用一個(gè)SummaryWriter來(lái)寫這個(gè)輸出。如果我們只是創(chuàng)建一個(gè)圖的輸出,它就將圖寫出來(lái)。

構(gòu)建SummaryWriter的第一個(gè)參數(shù)是一個(gè)輸出目錄的名字。如果此目錄不存在,則在構(gòu)建SummaryWriter時(shí)會(huì)被建出來(lái)。

>>> summary_writer = tf.train.SummaryWriter('log_simple_graph', sess.graph)

現(xiàn)在我們可以通過(guò)命令行來(lái)啟動(dòng)TensorBoard了。

$ tensorboard –logdir=log_simple_graph

TensorBoard會(huì)運(yùn)行一個(gè)本地的Web應(yīng)用,端口6006(6006是goog這個(gè)次倒過(guò)的對(duì)應(yīng))。在你本機(jī)的瀏覽器里登陸localhost:6006/#graphs,你就可以看到在TensorFlow里面創(chuàng)建的圖,類似于圖2。

1400px-image02-af763e31293cb5456a6959f372191168

圖2. 在TensorBoard里可視化的一個(gè)最簡(jiǎn)單的TensorFlow的神經(jīng)元

讓神經(jīng)元進(jìn)行學(xué)習(xí)

我們已經(jīng)有了一個(gè)神經(jīng)元,但如何才能讓它學(xué)習(xí)?假定我們讓輸入為1,而正確的輸出應(yīng)該是0。也就是說(shuō)我們有了一個(gè)僅有一條記錄且記錄只有一個(gè)特征(值為1)和一個(gè)結(jié)果(值為0)的訓(xùn)練數(shù)據(jù)集。我們現(xiàn)在希望這個(gè)神經(jīng)元能學(xué)習(xí)這個(gè)1->0的函數(shù)。

目前的這個(gè)系統(tǒng)是輸入1而輸出0.8。但不是我們想要的。我們需要一個(gè)方法來(lái)測(cè)量系統(tǒng)錯(cuò)了多少。我們把對(duì)錯(cuò)誤的測(cè)量稱為“損失”,并把損失最小化設(shè)定為系統(tǒng)的目標(biāo)。損失是可以為負(fù)值的,而對(duì)負(fù)值進(jìn)行最小化是毫無(wú)意思的。所以我們用實(shí)際輸出和期望輸出之差的平方來(lái)作為損失的測(cè)量值。

>>> y_ = tf.constant(0.0)
>>> loss = (y - y_)**2

對(duì)此,現(xiàn)有的圖還不能做什么事情。所以我們需要一個(gè)優(yōu)化器。這里我們使用梯度下降優(yōu)化器來(lái)基于損失值的導(dǎo)數(shù)去更新權(quán)重。這個(gè)優(yōu)化器采用一個(gè)學(xué)習(xí)比例來(lái)調(diào)整每一步更新的大小。這里我們?cè)O(shè)為0.025。

>>> optim = tf.train.GradientDescentOptimizer(learning_rate=0.025)

這個(gè)優(yōu)化器很聰明。它自動(dòng)地運(yùn)行,并在整個(gè)網(wǎng)絡(luò)里恰當(dāng)?shù)卦O(shè)定梯度,完成后向的學(xué)習(xí)過(guò)程。

讓我們看看我們的簡(jiǎn)單例子里的梯度是什么樣子的。

>>> grads_and_vars = optim.compute_gradients(loss)
>>> sess.run(tf.initialize_all_variables())
>>> sess.run(grads_and_vars[1][0])
## 1.6

為什么梯度的值是1.6?我們的損失函數(shù)是錯(cuò)誤的平方,因此它的導(dǎo)數(shù)就是這個(gè)錯(cuò)誤乘2?,F(xiàn)在系統(tǒng)的輸出是0.8而不是0,所以這個(gè)錯(cuò)誤就是0.8,乘2就是1.6。優(yōu)化器是對(duì)的!

對(duì)于更復(fù)雜的系統(tǒng),TensorFlow可以自動(dòng)地計(jì)算并應(yīng)用這些梯度值。

讓我們運(yùn)用這個(gè)梯度來(lái)完成反向傳播。

>>> sess.run(optim.apply_gradients(grads_and_vars))
>>> sess.run(w)
## 0.75999999  # about 0.76

現(xiàn)在權(quán)重減少了0.04,這是因?yàn)閮?yōu)化器減去了梯度乘以學(xué)習(xí)比例(1.6*0.025)。權(quán)重向著正確的方向在變化。

其實(shí)我們不必像這樣調(diào)用優(yōu)化器。我們可以形成一個(gè)運(yùn)算,自動(dòng)地計(jì)算和使用梯度:train_step。

>>> train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
>>> for i in range(100):
>>>     sess.run(train_step)
>>> 
>>> sess.run(y)
## 0.0044996012

多次運(yùn)行訓(xùn)練步驟后,權(quán)重和輸出值已經(jīng)非常接近0了。這個(gè)神經(jīng)元已經(jīng)學(xué)會(huì)了!

在TensorBoard里顯示訓(xùn)練過(guò)程的分析

你可能對(duì)訓(xùn)練過(guò)程中發(fā)生了什么感興趣,比如我們想知道每次訓(xùn)練步驟后,系統(tǒng)都是怎么去預(yù)測(cè)輸出的。為此,我們可以在訓(xùn)練循環(huán)里面打印輸出值。

>>> sess.run(tf.initialize_all_variables())
>>> for i in range(100):
>>>     print('before step {}, y is {}'.format(i, sess.run(y)))
>>>     sess.run(train_step)
>>> 
## before step 0, y is 0.800000011921
## before step 1, y is 0.759999990463
## ...
## before step 98, y is 0.00524811353534
## before step 99, y is 0.00498570781201

這種方法可行,但是有些問(wèn)題。看懂一串?dāng)?shù)字是比較難的,能用一個(gè)圖來(lái)展示就好了。僅僅就這一個(gè)需要觀察的值,就有很多輸出要看。而且我們希望能觀察多個(gè)值。如果能用一個(gè)一致統(tǒng)一的方法來(lái)記錄所有值就好了。

幸運(yùn)的是,上面我們用來(lái)可視化圖的工具也有我們需要的這個(gè)功能。

我們通過(guò)加入能總結(jié)圖自己狀態(tài)的運(yùn)算來(lái)提交給計(jì)算圖。這里我們會(huì)創(chuàng)建一個(gè)運(yùn)算,它能報(bào)告y的當(dāng)前值,即神經(jīng)元的輸出。

>>> summary_y = tf.scalar_summary('output', y)

當(dāng)你運(yùn)行一個(gè)總結(jié)運(yùn)算,它會(huì)返回給一個(gè)protocal buffer文本的字符串。用SummaryWriter可以把這個(gè)字符串寫入一個(gè)日志目錄。

>>> summary_writer = tf.train.SummaryWriter('log_simple_stats')
>>> sess.run(tf.initialize_all_variables())
>>> for i in range(100):
>>>     summary_str = sess.run(summary_y)
>>>     summary_writer.add_summary(summary_str, i)
>>>     sess.run(train_step)
>>> 

在運(yùn)行命令 tensorboard –logdir=log_simple_stats后,你就可以在localhost:6006/#events里面看到一個(gè)可交互的圖形(如圖3所示)。

1400px-image00-0aa9ce5979e5e4c310fd765d69c0b627

圖3. TensorBoard里的可視化圖,顯示了一個(gè)神經(jīng)元的輸出和訓(xùn)練循環(huán)次數(shù)的關(guān)系

繼續(xù)向前

下面是代碼的完全版。它相當(dāng)?shù)男 5總€(gè)小部分都顯示了有用且可理解的TensorflowFlow的功能。

import tensorflow as tf

x = tf.constant(1.0, name='input')
w = tf.Variable(0.8, name='weight')
y = tf.mul(w, x, name='output')
y_ = tf.constant(0.0, name='correct_value')
loss = tf.pow(y - y_, 2, name='loss')
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)

for value in [x, w, y, y_, loss]:
    tf.scalar_summary(value.op.name, value)

summaries = tf.merge_all_summaries()

sess = tf.Session()
summary_writer = tf.train.SummaryWriter('log_simple_stats', sess.graph)

sess.run(tf.initialize_all_variables())
for i in range(100):
    summary_writer.add_summary(sess.run(summaries), i)
    sess.run(train_step)

我們這里所演示的例子甚至比催生這篇文章的麥克·尼爾森的這篇《神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)》文章里的例子還要簡(jiǎn)單。對(duì)我自己,能看到這樣具體的例子可以幫助理解,還可以從簡(jiǎn)單的磚頭開始使用并擴(kuò)展構(gòu)建更為復(fù)雜的系統(tǒng)。

如果你想繼續(xù)實(shí)踐TensorFlow,可以從構(gòu)建更有趣的神經(jīng)元開始,或許可以使用不同的激活函數(shù)。你也可以用更有趣的數(shù)據(jù)來(lái)訓(xùn)練。繼續(xù)添加更多的神經(jīng)元,或者更多的層級(jí)。你可以查看更復(fù)雜的預(yù)制的模型,或?qū)W習(xí)TensorFlow的教程如何使用它手冊(cè)。去學(xué)吧!

感謝Paco Nathan,Ben Lorica和Marie Beaugureau 的細(xì)心編輯,從而讓這篇博文真正誕生。感謝深度學(xué)習(xí)分析公司的亨利·陳,丹尼斯·梁和波·古雷,以及華盛頓特區(qū)的機(jī)器學(xué)習(xí)期刊俱樂(lè)部對(duì)本博文的早期版本的意見(jiàn)反饋。再次感謝Marie Beaugureau 和杰娜·韋伯對(duì)本博文的質(zhì)量提升所做的杰出貢獻(xiàn)。

Aaron Schumacher

Aaron Schumacher是深度學(xué)習(xí)分析公司的數(shù)據(jù)科學(xué)家和軟件工程師。他在聯(lián)合國(guó)大會(huì)和麥迪斯數(shù)據(jù)科學(xué)訓(xùn)練營(yíng)里教授Python和R語(yǔ)言。Aaron曾在博思艾倫咨詢公司,紐約大學(xué)和紐約市教育局任職并從事數(shù)據(jù)工作。Aaron生涯最好的霹靂舞成績(jī)是挺近R16韓國(guó)2009大賽個(gè)人街舞的半決賽。他現(xiàn)在很榮幸地被評(píng)為TensorFlow 0.9版的次重要貢獻(xiàn)者。

Braided river. (source: National Park Service, Alaska Region on Flickr).