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

分享

tensorflow筆記:流程,概念和簡(jiǎn)單代碼注釋

 Harper666 2017-05-24

tensorflow是google在2015年開(kāi)源的深度學(xué)習(xí)框架,可以很方便的檢驗(yàn)算法效果,。這兩天看了看官方的tutorial,極客學(xué)院的文檔,,以及綜合tensorflow的源碼,,把自己的心得整理了一下,作為自己的備忘錄,。

tensorflow筆記系列: 
(一) tensorflow筆記:流程,,概念和簡(jiǎn)單代碼注釋 
(二) tensorflow筆記:多層CNN代碼分析 
(三) tensorflow筆記:多層LSTM代碼分析 
(四) tensorflow筆記:常用函數(shù)說(shuō)明


1.tensorflow的運(yùn)行流程

tensorflow的運(yùn)行流程主要有2步,分別是構(gòu)造模型和訓(xùn)練,。

在構(gòu)造模型階段,,我們需要構(gòu)建一個(gè)圖(Graph)來(lái)描述我們的模型。所謂圖,,也可以理解為流程圖,就是將數(shù)據(jù)的輸入->中間處理->輸出的過(guò)程表示出來(lái),就像下面這樣,。 

20160601101108139.png-26.2kB

注意此時(shí)是不會(huì)發(fā)生實(shí)際運(yùn)算的,。而在模型構(gòu)建完畢以后,會(huì)進(jìn)入訓(xùn)練步驟,。此時(shí)才會(huì)有實(shí)際的數(shù)據(jù)輸入,,梯度計(jì)算等操作。那么,,如何構(gòu)建抽象的模型呢,?這里就要提到tensorflow中的幾個(gè)概念:Tensor,Variable,placeholder,而在訓(xùn)練階段,則需要介紹Session,。下面先解釋一些上面的幾個(gè)概念

1.1概念描述


1.1.1 Tensor

Tensor的意思是張量,,不過(guò)按我的理解,其實(shí)就是指矩陣,。也可以理解為tensorflow中矩陣的表示形式,。Tensor的生成方式有很多種,,最簡(jiǎn)單的就如

import tensorflow as tf # 在下面所有代碼中,都去掉了這一行,,默認(rèn)已經(jīng)導(dǎo)入
a = tf.zeros(shape=[1,5])
  • 1
  • 2
  • 1
  • 2

不過(guò)要注意,,因?yàn)樵谟?xùn)練開(kāi)始前,所有的數(shù)據(jù)都是抽象的概念,,也就是說(shuō),,此時(shí)a只是表示這應(yīng)該是個(gè)1*5的零矩陣,而沒(méi)有實(shí)際賦值,,也沒(méi)有分配空間,,所以如果此時(shí)print,就會(huì)出現(xiàn)如下情況:

print(a)
#===>Tensor("zeros:0", shape=(1, 2), dtype=float32)
  • 1
  • 2
  • 1
  • 2

只有在訓(xùn)練過(guò)程開(kāi)始后,才能獲得a的實(shí)際值

sess = tf.InteractiveSession()
print(sess.run(a))
#===>[[ 0.  0.]]
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

這邊設(shè)計(jì)到Session概念,,后面會(huì)提到


1.1.2 Variable

故名思議,,是變量的意思。一般用來(lái)表示圖中的各計(jì)算參數(shù),,包括矩陣,,向量等。例如,,我要表示上圖中的模型,,那表達(dá)式就是 

y=Relu(Wx+b)

(relu是一種激活函數(shù),具體可見(jiàn)這里)這里Wb是我要用來(lái)訓(xùn)練的參數(shù),,那么此時(shí)這兩個(gè)值就可以用Variable來(lái)表示,。Variable的初始函數(shù)有很多其他選項(xiàng),這里先不提,,只輸入一個(gè)Tensor也是可以的

W = tf.Variable(tf.zeros(shape=[1,2]))
  • 1
  • 1

注意,,此時(shí)W一樣是一個(gè)抽象的概念,而且與Tensor不同,,Variable必須初始化以后才有具體的值,。

tensor = tf.zeros(shape=[1,2])
variable = tf.Variable(tensor)
sess = tf.InteractiveSession()
# print(sess.run(variable))  # 會(huì)報(bào)錯(cuò)
sess.run(tf.initialize_all_variables()) # 對(duì)variable進(jìn)行初始化
print(sess.run(variable))
#===>[[ 0.  0.]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.1.3 placeholder

又叫占位符,同樣是一個(gè)抽象的概念,。用于表示輸入輸出數(shù)據(jù)的格式,。告訴系統(tǒng):這里有一個(gè)值/向量/矩陣,現(xiàn)在我沒(méi)法給你具體數(shù)值,,不過(guò)我正式運(yùn)行的時(shí)候會(huì)補(bǔ)上的,!例如上式中的x和y。因?yàn)闆](méi)有具體數(shù)值,,所以只要指定尺寸即可

x = tf.placeholder(tf.float32,[1, 5],name='input')
y = tf.placeholder(tf.float32,[None, 5],name='input')
  • 1
  • 2
  • 1
  • 2

上面有兩種形式,,第一種x,表示輸入是一個(gè)[1,5]的橫向量。 
而第二種形式,,表示輸入是一個(gè)[?,5]的矩陣,。那么什么情況下會(huì)這么用呢?就是需要輸入一批[1,5]的數(shù)據(jù)的時(shí)候。比如我有一批共10個(gè)數(shù)據(jù),,那我可以表示成[10,5]的矩陣,。如果是一批5個(gè),那就是[5,5]的矩陣,。tensorflow會(huì)自動(dòng)進(jìn)行批處理


1.1.4 Session

session,,也就是會(huì)話(huà)。我的理解是,,session是抽象模型的實(shí)現(xiàn)者,。為什么之前的代碼多處要用到session?因?yàn)槟P褪浅橄蟮穆?,只有?shí)現(xiàn)了模型以后,,才能夠得到具體的值。同樣,,具體的參數(shù)訓(xùn)練,,預(yù)測(cè),甚至變量的實(shí)際值查詢(xún),,都要用到session,看后面就知道了


1.2 模型構(gòu)建

這里我們使用官方tutorial中的mnist數(shù)據(jù)集的分類(lèi)代碼,公式可以寫(xiě)作 

z=Wx+ba=softmax(z)

那么該模型的代碼描述為

# 建立抽象模型
x = tf.placeholder(tf.float32, [None, 784]) # 輸入占位符
y = tf.placeholder(tf.float32, [None, 10])  # 輸出占位符(預(yù)期輸出)
W = tf.Variable(tf.zeros([784, 10]))        
b = tf.Variable(tf.zeros([10]))
a = tf.nn.softmax(tf.matmul(x, W) + b)      # a表示模型的實(shí)際輸出

# 定義損失函數(shù)和訓(xùn)練方法
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 損失函數(shù)為交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度下降法,,學(xué)習(xí)速率為0.5
train = optimizer.minimize(cross_entropy)  # 訓(xùn)練目標(biāo):最小化損失函數(shù)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看到這樣以來(lái),,模型中的所有元素(圖結(jié)構(gòu),損失函數(shù),,下降方法和訓(xùn)練目標(biāo))都已經(jīng)包括在train里面,。我們可以把train叫做訓(xùn)練模型。那么我們還需要測(cè)試模型

correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  • 1
  • 2
  • 1
  • 2

上述兩行代碼,,tf.argmax表示找到最大值的位置(也就是預(yù)測(cè)的分類(lèi)和實(shí)際的分類(lèi)),,然后看看他們是否一致,是就返回true,不是就返回false,這樣得到一個(gè)boolean數(shù)組,。tf.cast將boolean數(shù)組轉(zhuǎn)成int數(shù)組,,最后求平均值,得到分類(lèi)的準(zhǔn)確率(怎么樣,,是不是很巧妙)


1.3 實(shí)際訓(xùn)練

有了訓(xùn)練模型和測(cè)試模型以后,,我們就可以開(kāi)始進(jìn)行實(shí)際的訓(xùn)練了

sess = tf.InteractiveSession()      # 建立交互式會(huì)話(huà)
tf.initialize_all_variables().run() # 所有變量初始化
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)    # 獲得一批100個(gè)數(shù)據(jù)
    train.run({x: batch_xs, y: batch_ys})   # 給訓(xùn)練模型提供輸入和輸出
print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

可以看到,在模型搭建完以后,,我們只要為模型提供輸入和輸出,,模型就能夠自己進(jìn)行訓(xùn)練和測(cè)試了。中間的求導(dǎo),,求梯度,,反向傳播等等繁雜的事情,,tensorflow都會(huì)幫你自動(dòng)完成。


2. 實(shí)際代碼

實(shí)際操作中,,還包括了獲取數(shù)據(jù)的代碼

"""A very simple MNIST classifier.
See extensive documentation at
http:///tutorials/mnist/beginners/index.md
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# Import data
from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('data_dir', '/tmp/data/', 'Directory for storing data') # 把數(shù)據(jù)放在/tmp/data文件夾中

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)   # 讀取數(shù)據(jù)集


# 建立抽象模型
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]))
a = tf.nn.softmax(tf.matmul(x, W) + b)

# 定義損失函數(shù)和訓(xùn)練方法
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1]))  # 損失函數(shù)為交叉熵
optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度下降法,,學(xué)習(xí)速率為0.5
train = optimizer.minimize(cross_entropy) # 訓(xùn)練目標(biāo):最小化損失函數(shù)

# Test trained model
correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# Train
sess = tf.InteractiveSession()      # 建立交互式會(huì)話(huà)
tf.initialize_all_variables().run()
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    train.run({x: batch_xs, y: batch_ys})
print(sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}))
  • 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
  • 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

得到的分類(lèi)準(zhǔn)確率在91%左右


轉(zhuǎn)載自:http://blog.csdn.net/u014696921/article/details/53819321

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(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)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多