久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TensorFlow極速入門

 好吃好看分子 2017-03-31

雷鋒網(wǎng)按:本文原載于Qunar技術(shù)沙龍,原作者已授權(quán)雷鋒網(wǎng)發(fā)布,。作者孟曉龍,2016年加入Qunar,,目前在去哪兒網(wǎng)機(jī)票事業(yè)部擔(dān)任算法工程師,。熱衷于深度學(xué)習(xí)技術(shù)的探索,對(duì)新事物有著強(qiáng)烈的好奇心,。

一,、前言

目前,深度學(xué)習(xí)已經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域,,比如圖像識(shí)別,,圖形定位與檢測(cè),語(yǔ)音識(shí)別,,機(jī)器翻譯等等,,對(duì)于這個(gè)神奇的領(lǐng)域,很多童鞋想要一探究竟,,這里拋磚引玉的簡(jiǎn)單介紹下最火的深度學(xué)習(xí)開(kāi)源框架 tensorflow,。本教程不是 cookbook,所以不會(huì)將所有的東西都事無(wú)巨細(xì)的講到,,所有的示例都將使用 python,。

那么本篇教程會(huì)講到什么?首先是一些基礎(chǔ)概念,,包括計(jì)算圖,,graph 與 session,,基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),Variable,,placeholder 與 feed_dict 以及使用它們時(shí)需要注意的點(diǎn),。最后給出了在 tensorflow 中建立一個(gè)機(jī)器學(xué)習(xí)模型步驟,并用一個(gè)手寫(xiě)數(shù)字識(shí)別的例子進(jìn)行演示,。

1,、tensorflow是什么?

tensorflow 是 google 開(kāi)源的機(jī)器學(xué)習(xí)工具,,在2015年11月其實(shí)現(xiàn)正式開(kāi)源,,開(kāi)源協(xié)議Apache 2.0。

下圖是 query 詞頻時(shí)序圖,,從中可以看出 tensorflow 的火爆程度,。

TensorFlow極速入門

2、 why tensorflow?

Tensorflow 擁有易用的 python 接口,,而且可以部署在一臺(tái)或多臺(tái) cpu , gpu 上,,兼容多個(gè)平臺(tái),包括但不限于 安卓/windows/linux 等等平臺(tái)上,,而且擁有 tensorboard這種可視化工具,,可以使用 checkpoint 進(jìn)行實(shí)驗(yàn)管理,得益于圖計(jì)算,,它可以進(jìn)行自動(dòng)微分計(jì)算,,擁有龐大的社區(qū),而且很多優(yōu)秀的項(xiàng)目已經(jīng)使用 tensorflow 進(jìn)行開(kāi)發(fā)了,。

3,、 易用的tensorflow工具

如果不想去研究 tensorflow 繁雜的API,僅想快速的實(shí)現(xiàn)些什么,可以使用其他高層工具,。比如 tf.contrib.learn,,tf.contrib.slim,Keras 等,,它們都提供了高層封裝,。這里是 tflearn 的樣例集(github鏈接 https://github.com/tflearn/tflearn/tree/master/examples)。

4,、 tensorflow安裝

目前 tensorflow 的安裝已經(jīng)十分方便,,有興趣可以參考官方文檔 (https://www./get_started/os_setup)。

二,、 tensorflow基礎(chǔ)

實(shí)際上編寫(xiě)tensorflow可以總結(jié)為兩步.

(1)組裝一個(gè)graph;

(2)使用session去執(zhí)行g(shù)raph中的operation,。

因此我們從 graph 與 session 說(shuō)起。

1,、 graph與session

(1)計(jì)算圖

Tensorflow 是基于計(jì)算圖的框架,,因此理解 graph 與 session 顯得尤為重要,。不過(guò)在講解 graph 與 session 之前首先介紹下什么是計(jì)算圖。假設(shè)我們有這樣一個(gè)需要計(jì)算的表達(dá)式,。該表達(dá)式包括了兩個(gè)加法與一個(gè)乘法,,為了更好講述引入中間變量c與d。由此該表達(dá)式可以表示為:

TensorFlow極速入門

當(dāng)需要計(jì)算e時(shí)就需要計(jì)算c與d,,而計(jì)算c就需要計(jì)算a與b,,計(jì)算d需要計(jì)算b。這樣就形成了依賴關(guān)系,。這種有向無(wú)環(huán)圖就叫做計(jì)算圖,,因?yàn)閷?duì)于圖中的每一個(gè)節(jié)點(diǎn)其微分都很容易得出,因此應(yīng)用鏈?zhǔn)椒▌t求得一個(gè)復(fù)雜的表達(dá)式的導(dǎo)數(shù)就成為可能,,所以它會(huì)應(yīng)用在類似tensorflow這種需要應(yīng)用反向傳播算法的框架中,。

(2)概念說(shuō)明

下面是 graph , session , operation , tensor 四個(gè)概念的簡(jiǎn)介。

Tensor:類型化的多維數(shù)組,,圖的邊,;

Operation:執(zhí)行計(jì)算的單元,圖的節(jié)點(diǎn),;

Graph:一張有邊與點(diǎn)的圖,,其表示了需要進(jìn)行計(jì)算的任務(wù);

Session:稱之為會(huì)話的上下文,,用于執(zhí)行圖,。

Graph僅僅定義了所有 operation 與 tensor 流向,沒(méi)有進(jìn)行任何計(jì)算,。而session根據(jù) graph 的定義分配資源,計(jì)算 operation,,得出結(jié)果,。既然是圖就會(huì)有點(diǎn)與邊,在圖計(jì)算中 operation 就是點(diǎn)而 tensor 就是邊,。Operation 可以是加減乘除等數(shù)學(xué)運(yùn)算,,也可以是各種各樣的優(yōu)化算法。每個(gè) operation 都會(huì)有零個(gè)或多個(gè)輸入,,零個(gè)或多個(gè)輸出,。 tensor 就是其輸入與輸出,其可以表示一維二維多維向量或者常量,。而且除了Variables指向的 tensor 外所有的 tensor 在流入下一個(gè)節(jié)點(diǎn)后都不再保存,。

(3)舉例

下面首先定義一個(gè)圖(其實(shí)沒(méi)有必要,tensorflow會(huì)默認(rèn)定義一個(gè)),,并做一些計(jì)算,。

import tensorflow as tf

graph = tf.Graph

with graph.as_default:

foo = tf.Variable(3,name='foo')

bar = tf.Variable(2,name='bar')

result = foo + bar

initialize = tf.global_variables_initializer

這段代碼,,首先會(huì)載入tensorflow,定義一個(gè)graph類,,并在這張圖上定義了foo與bar的兩個(gè)變量,,最后對(duì)這個(gè)值求和,并初始化所有變量,。其中,,Variable是定義變量并賦予初值。讓我們看下result(下方代碼),。后面是輸出,,可以看到并沒(méi)有輸出實(shí)際的結(jié)果,由此可見(jiàn)在定義圖的時(shí)候其實(shí)沒(méi)有進(jìn)行任何實(shí)際的計(jì)算,。

print(result) #Tensor('add:0', shape=, dtype=int32)

下面定義一個(gè)session,,并進(jìn)行真正的計(jì)算。

with tf.Session(graph=graph) as sess:

sess.run(initialize)

res = sess.run(result)

print(res) # 5

這段代碼中,,定義了session,,并在session中執(zhí)行了真正的初始化,并且求得result的值并打印出來(lái),??梢钥吹剑趕ession中產(chǎn)生了真正的計(jì)算,,得出值為5,。

下圖是該graph在tensorboard中的顯示。這張圖整體是一個(gè)graph,其中foo,bar,add這些節(jié)點(diǎn)都是operation,,而foo和bar與add連接邊的就是tensor,。當(dāng)session運(yùn)行result時(shí),實(shí)際就是求得add這個(gè)operation流出的tensor值,,那么add的所有上游節(jié)點(diǎn)都會(huì)進(jìn)行計(jì)算,,如果圖中有非add上游節(jié)點(diǎn)(本例中沒(méi)有)那么該節(jié)點(diǎn)將不會(huì)進(jìn)行計(jì)算,這也是圖計(jì)算的優(yōu)勢(shì)之一,。

TensorFlow極速入門

2,、數(shù)據(jù)結(jié)構(gòu)

Tensorflow的數(shù)據(jù)結(jié)構(gòu)有著rank,shape,data types的概念,下面來(lái)分別講解,。

(1)rank

Rank一般是指數(shù)據(jù)的維度,,其與線性代數(shù)中的rank不是一個(gè)概念。其常用rank舉例如下,。

TensorFlow極速入門

(2)shape

Shape指tensor每個(gè)維度數(shù)據(jù)的個(gè)數(shù),,可以用python的list/tuple表示。下圖表示了rank,shape的關(guān)系。

TensorFlow極速入門

(3)data type

Data type,,是指單個(gè)數(shù)據(jù)的類型,。常用DT_FLOAT,也就是32位的浮點(diǎn)數(shù),。下圖表示了所有的types,。

TensorFlow極速入門

3、 Variables

(1)介紹

當(dāng)訓(xùn)練模型時(shí),,需要使用Variables保存與更新參數(shù),。Variables會(huì)保存在內(nèi)存當(dāng)中,所有tensor一旦擁有Variables的指向就不會(huì)在session中丟失,。其必須明確的初始化而且可以通過(guò)Saver保存到磁盤上,。Variables可以通過(guò)Variables初始化。

weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name='weights')

biases = tf.Variable(tf.zeros([200]), name='biases')

其中,,tf.random_normal是隨機(jī)生成一個(gè)正態(tài)分布的tensor,,其shape是第一個(gè)參數(shù),stddev是其標(biāo)準(zhǔn)差,。tf.zeros是生成一個(gè)全零的tensor,。之后將這個(gè)tensor的值賦值給Variable。

(2)初始化

實(shí)際在其初始化過(guò)程中做了很多的操作,,比如初始化空間,,賦初值(等價(jià)于tf.assign),并把Variable添加到graph中等操作,。注意在計(jì)算前需要初始化所有的Variable,。一般會(huì)在定義graph時(shí)定義global_variables_initializer,其會(huì)在session運(yùn)算時(shí)初始化所有變量,。

直接調(diào)用global_variables_initializer會(huì)初始化所有的Variable,,如果僅想初始化部分Variable可以調(diào)用tf.variables_initializer。

Init_ab = tf.variables_initializer([a,b],name=”init_ab”)

Variables可以通過(guò)eval顯示其值,,也可以通過(guò)assign進(jìn)行賦值,。Variables支持很多數(shù)學(xué)運(yùn)算,具體可以參照官方文檔 (https://www./api_docs/python/math_ops/),。

(3)Variables與constant的區(qū)別

值得注意的是Variables與constant的區(qū)別。Constant一般是常量,,可以被賦值給Variables,,constant保存在graph中,如果graph重復(fù)載入那么constant也會(huì)重復(fù)載入,,其非常浪費(fèi)資源,,如非必要盡量不使用其保存大量數(shù)據(jù)。而Variables在每個(gè)session中都是單獨(dú)保存的,甚至可以單獨(dú)存在一個(gè)參數(shù)服務(wù)器上,??梢酝ㄟ^(guò)代碼觀察到constant實(shí)際是保存在graph中,具體如下,。

const = tf.constant(1.0,name='constant')

print(tf.get_default_graph.as_graph_def)

這里第二行是打印出圖的定義,,其輸出如下。

node {

name: 'constant'

op: 'Const'

attr {

key: 'dtype'

value {

type: DT_FLOAT

}

}

attr {

key: 'value'

value {

tensor {

dtype: DT_FLOAT

tensor_shape {

}

float_val: 1.0

}

}

}

}

versions {

producer: 17

}

(4)命名

另外一個(gè)值得注意的地方是盡量每一個(gè)變量都明確的命名,,這樣易于管理命令空間,,而且在導(dǎo)入模型的時(shí)候不會(huì)造成不同模型之間的命名沖突,這樣就可以在一張graph中容納很多個(gè)模型,。

4,、 placeholders與feed_dict

當(dāng)我們定義一張graph時(shí),有時(shí)候并不知道需要計(jì)算的值,,比如模型的輸入數(shù)據(jù),,其只有在訓(xùn)練與預(yù)測(cè)時(shí)才會(huì)有值。這時(shí)就需要placeholder與feed_dict的幫助,。

定義一個(gè)placeholder,,可以使用tf.placeholder(dtype,shape=None,name=None)函數(shù)。

foo = tf.placeholder(tf.int32,shape=[1],name='foo')

bar = tf.constant(2,name='bar')

result = foo + bar

with tf.Session as sess:

print(sess.run(result))

在上面的代碼中,,會(huì)拋出錯(cuò)誤(InvalidArgumentError),,因?yàn)橛?jì)算result需要foo的具體值,而在代碼中并沒(méi)有給出,。這時(shí)候需要將實(shí)際值賦給foo,。最后一行修改如下:

print(sess.run(result,{foo:[3]}))

其中最后的dict就是一個(gè)feed_dict,一般會(huì)使用python讀入一些值后傳入,,當(dāng)使用minbatch的情況下,,每次輸入的值都不同。

三,、mnist識(shí)別實(shí)例

介紹了一些tensorflow基礎(chǔ)后,,我們用一個(gè)完整的例子將這些串起來(lái)。

首先,,需要下載數(shù)據(jù)集,,mnist數(shù)據(jù)可以在Yann LeCun's website( http://yann./exdb/mnist/ )下載到,也可以通過(guò)如下兩行代碼得到,。

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

該數(shù)據(jù)集中一共有55000個(gè)樣本,,其中50000用于訓(xùn)練,5000用于驗(yàn)證,。每個(gè)樣本分為X與y兩部分,,其中X如下圖所示,,是28*28的圖像,在使用時(shí)需要拉伸成784維的向量,。

TensorFlow極速入門

整體的X可以表示為,。

TensorFlow極速入門

y為X真實(shí)的類別,其數(shù)據(jù)可以看做如下圖的形式,。因此,,問(wèn)題可以看成一個(gè)10分類的問(wèn)題。

TensorFlow極速入門

而本次演示所使用的模型為邏輯回歸,,其可以表示為

TensorFlow極速入門

用圖形可以表示為下圖,,具體原理這里不再闡述,更多細(xì)節(jié)參考 該鏈接 (http://tech.meituan.com/intro_to_logistic_regression.html),。

TensorFlow極速入門

那么 let's coding,。

當(dāng)使用tensorflow進(jìn)行g(shù)raph構(gòu)建時(shí),大體可以分為五部分:

1,、 為 輸入X與 輸出y 定義placeholder,;

2、定義權(quán)重W,;

3,、定義模型結(jié)構(gòu);

4,、定義損失函數(shù),;

5、定義優(yōu)化算法,。

首先導(dǎo)入需要的包,,定義X與y的placeholder以及 W,b 的 Variables。其中None表示任意維度,,一般是min-batch的 batch size,。而 W 定義是 shape 為784,10,rank為2的Variable,,b是shape為10,,rank為1的Variable。

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, 784])

y_ = tf.placeholder(tf.float32, [None, 10])

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

之后是定義模型,。x與W矩陣乘法后與b求和,,經(jīng)過(guò)softmax得到y(tǒng)。

y = tf.nn.softmax(tf.matmul(x, W) + b)

求邏輯回歸的損失函數(shù),,這里使用了cross entropy,,其公式可以表示為:

這里的 cross entropy 取了均值。定義了學(xué)習(xí)步長(zhǎng)為0.5,,使用了梯度下降算法(GradientDescentOptimizer)最小化損失函數(shù)。不要忘記初始化 Variables。

cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

init = tf.global_variables_initializer

最后,,我們的 graph 至此定義完畢,,下面就可以進(jìn)行真正的計(jì)算,包括初始化變量,,輸入數(shù)據(jù),,并計(jì)算損失函數(shù)與利用優(yōu)化算法更新參數(shù)。

with tf.Session as sess:

sess.run(init)

for i in range(1000):

batch_xs, batch_ys = mnist.train.next_batch(100)

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

其中,,迭代了1000次,,每次輸入了100個(gè)樣本。mnist.train.next_batch 就是生成下一個(gè) batch 的數(shù)據(jù),,這里知道它在干什么就可以,。那么訓(xùn)練結(jié)果如何呢,需要進(jìn)行評(píng)估,。這里使用單純的正確率,,正確率是用取最大值索引是否相等的方式,因?yàn)檎_的 label 最大值為1,,而預(yù)測(cè)的 label 最大值為最大概率,。

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

至此,我們開(kāi)發(fā)了一個(gè)簡(jiǎn)單的手寫(xiě)數(shù)字識(shí)別模型,。

總結(jié)

總結(jié)全文,,我們首先介紹了 graph 與 session,并解釋了基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),,講解了一些Variable需要注意的地方并介紹了 placeholders 與 feed_dict ,。最終以一個(gè)手寫(xiě)數(shù)字識(shí)別的實(shí)例將這些點(diǎn)串起來(lái),希望可以給想要入門的你一丟丟的幫助,。雷鋒網(wǎng)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多