這篇文章主要講解了“Tensorflow怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Tensorflow怎么使用”吧!
創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)十年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:水泥攪拌車等企業(yè),備受客戶好評。
Tensorflow是基于graph的并行計(jì)算模型。關(guān)于graph的理解可以參考官方文檔。舉個(gè)例子,計(jì)算a=(b+c)?(c+2)a=(b + c) * (c + 2)a=(b+c)?(c+2),我們可以將算式拆分成一下:
d = b + c e = c + 2 a = d * e
轉(zhuǎn)換成graph后的形式為:
> 講一個(gè)簡單的算式搞成這樣確實(shí)大材小用,但是我們可以通過這個(gè)例子發(fā)現(xiàn):$d = b + c$和$e = c + 2$是不相關(guān)的,也就是可以**并行計(jì)算**。對于更復(fù)雜的CNN和RNN,graph的并行計(jì)算的能力將得到更好的展現(xiàn)。
實(shí)際中,基于Tensorflow構(gòu)建的三層(單隱層)神經(jīng)網(wǎng)絡(luò)如下圖所示:
![這里寫圖片描述](http://adventuresinmachinelearning.com/wp-content/uploads/2017/03/TensorFlow-data-flow-graph.gif) **Tensorflow data flow graph**
上圖中,圓形或方形的節(jié)點(diǎn)被稱為node,在node中流動(dòng)的數(shù)據(jù)流被稱為張量(tensor)。更多關(guān)于tensor的描述見官方文檔。
0階張量 == 標(biāo)量
1階張量 == 向量(一維數(shù)組)
2階張量 == 二維數(shù)組
…
n階張量 == n維數(shù)組
tensor與node之間的關(guān)系:
??如果輸入tensor的維度是5000×645000 \times 645000×64,表示有5000個(gè)訓(xùn)練樣本,每個(gè)樣本有64個(gè)特征,則輸入層必須有64個(gè)node來接受這些特征。
上圖表示的三層網(wǎng)絡(luò)包括:輸入層(圖中的input)、隱藏層(這里取名為ReLU layer表示它的激活函數(shù)是ReLU)、輸出層(圖中的Logit Layer)。
可以看到,每一層中都有相關(guān)tensor流入Gradient節(jié)點(diǎn)計(jì)算梯度,然后這些梯度tensor進(jìn)入SGD Trainer節(jié)點(diǎn)進(jìn)行網(wǎng)絡(luò)優(yōu)化(也就是update網(wǎng)絡(luò)參數(shù))。
Tensorflow正是通過graph表示神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)網(wǎng)絡(luò)的并行計(jì)算,提高效率。下面我們將通過一個(gè)簡單的例子來介紹TensorFlow的基礎(chǔ)語法。
用Tensorflow計(jì)算a=(b+c)?(c+2)a = (b + c) * (c + 2)a=(b+c)?(c+2), 1. 定義數(shù)據(jù):
import tensorflow as tf # 首先,創(chuàng)建一個(gè)TensorFlow常量=>2 const = tf.constant(2.0, name='const') # 創(chuàng)建TensorFlow變量b和c b = tf.Variable(2.0, name='b') c = tf.Variable(1.0, dtype=tf.float32, name='c')
如上,TensorFlow中,使用tf.constant()
定義常量,使用tf.Variable()
定義變量。Tensorflow可以自動(dòng)進(jìn)行數(shù)據(jù)類型檢測,比如:賦值2.0就默認(rèn)為tf.float32
,但最好還是顯式地定義。更多關(guān)于TensorFlow數(shù)據(jù)類型的介紹查看官方文檔。
2. 定義運(yùn)算(也稱TensorFlow operation):
# 創(chuàng)建operation d = tf.add(b, c, name='d') e = tf.add(c, const, name='e') a = tf.multiply(d, e, name='a')
發(fā)現(xiàn)了沒,在TensorFlow中,+?×÷+-\times \div+?×÷都有其特殊的函數(shù)表示。實(shí)際上,TensorFlow定義了足夠多的函數(shù)來表示所有的數(shù)學(xué)運(yùn)算,當(dāng)然也對部分?jǐn)?shù)學(xué)運(yùn)算進(jìn)行了運(yùn)算符重載,但保險(xiǎn)起見,我還是建議你使用函數(shù)代替運(yùn)算符。
**!!TensorFlow中所有的變量必須經(jīng)過初始化才能使用,**初始化方式分兩步:
定義初始化operation
運(yùn)行初始化operation
# 1. 定義init operation init_op = tf.global_variables_initializer()
以上已經(jīng)完成TensorFlow graph的搭建,下一步即計(jì)算并輸出。
運(yùn)行g(shù)raph需要先調(diào)用tf.Session()
函數(shù)創(chuàng)建一個(gè)會(huì)話(session)。session就是我們與graph交互的handle。更多關(guān)于session的介紹見官方文檔。
# session with tf.Session() as sess: # 2. 運(yùn)行init operation sess.run(init_op) # 計(jì)算 a_out = sess.run(a) print("Variable a is {}".format(a_out))
值得一提的是,TensorFlow有一個(gè)極好的可視化工具TensorBoard,詳見官方文檔。
對上面例子的改進(jìn):使變量b可以接收任意值。TensorFlow中接收值的方式為占位符(placeholder),通過tf.placeholder()
創(chuàng)建。
# 創(chuàng)建placeholder b = tf.placeholder(tf.float32, [None, 1], name='b')
第二個(gè)參數(shù)值為[None, 1],其中None表示不確定,即不確定第一個(gè)維度的大小,第一維可以是任意大小。特別對應(yīng)tensor數(shù)量(或者樣本數(shù)量),輸入的tensor數(shù)目可以是32、64…
現(xiàn)在,如果得到計(jì)算結(jié)果,需要在運(yùn)行過程中feed占位符b的值,具體為將a_out = sess.run(a)
改為:
np.newaxis: https://www.jianshu.com/p/78e1e281f698
a_out = sess.run(a, feed_dict={b: np.arange(0, 10)[:, np.newaxis]})
輸出:
Variable a is [[ 3.] [ 6.] [ 9.] [ 12.] [ 15.] [ 18.] [ 21.] [ 24.] [ 27.] [ 30.]]
神經(jīng)網(wǎng)絡(luò)的例子,數(shù)據(jù)集為MNIST數(shù)據(jù)集。
1. 加載數(shù)據(jù):
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
one_hot=True
表示對label進(jìn)行one-hot編碼,比如標(biāo)簽4可以表示為[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。這是神經(jīng)網(wǎng)絡(luò)輸出層要求的格式。
2. 定義超參數(shù)和placeholder
# 超參數(shù) learning_rate = 0.5 epochs = 10 batch_size = 100 # placeholder # 輸入圖片為28 x 28 像素 = 784 x = tf.placeholder(tf.float32, [None, 784]) # 輸出為0-9的one-hot編碼 y = tf.placeholder(tf.float32, [None, 10])
再次強(qiáng)調(diào),[None, 784]中的None表示任意值,特別對應(yīng)tensor數(shù)目。
3. 定義參數(shù)w和b
# hidden layer => w, b W1 = tf.Variable(tf.random_normal([784, 300], stddev=0.03), name='W1') b1 = tf.Variable(tf.random_normal([300]), name='b1') # output layer => w, b W2 = tf.Variable(tf.random_normal([300, 10], stddev=0.03), name='W2') b2 = tf.Variable(tf.random_normal([10]), name='b2')
在這里,要了解全連接層的兩個(gè)參數(shù)w和b都是需要隨機(jī)初始化的,tf.random_normal()
生成正態(tài)分布的隨機(jī)數(shù)。
4. 構(gòu)造隱層網(wǎng)絡(luò)
# 計(jì)算輸出 y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2))
上面代碼對應(yīng)于公式:
5. 構(gòu)造輸出(預(yù)測值)
# 計(jì)算輸出
y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2))
對于單標(biāo)簽多分類任務(wù),輸出層的激活函數(shù)都是tf.nn.softmax()
。更多關(guān)于softmax的知識見維基百科。
6. BP部分—定義loss
損失為交叉熵,公式為
公式分為兩步:
對n個(gè)標(biāo)簽計(jì)算交叉熵
對m個(gè)樣本取平均
7. BP部分—定義優(yōu)化算法
# 創(chuàng)建優(yōu)化器,確定優(yōu)化目標(biāo) optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimizer(cross_entropy)
TensorFlow中更多優(yōu)化算法詳見官方文檔。
8. 定義初始化operation和準(zhǔn)確率node
# init operator init_op = tf.global_variables_initializer() # 創(chuàng)建準(zhǔn)確率節(jié)點(diǎn) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
correct_predicion
會(huì)返回一個(gè)m×1m\times 1m×1的tensor,tensor的值為True/False表示是否正確預(yù)測。
9. 開始訓(xùn)練
# 創(chuàng)建session with tf.Session() as sess: # 變量初始化 sess.run(init_op) total_batch = int(len(mnist.train.labels) / batch_size) for epoch in range(epochs): avg_cost = 0 for i in range(total_batch): batch_x, batch_y = mnist.train.next_batch(batch_size=batch_size) _, c = sess.run([optimizer, cross_entropy], feed_dict={x: batch_x, y: batch_y}) avg_cost += c / total_batch print("Epoch:", (epoch + 1), "cost = ", "{:.3f}".format(avg_cost)) print(sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))
輸出:
Epoch: 1 cost = 0.586
Epoch: 2 cost = 0.213
Epoch: 3 cost = 0.150
Epoch: 4 cost = 0.113
Epoch: 5 cost = 0.094
Epoch: 6 cost = 0.073
Epoch: 7 cost = 0.058
Epoch: 8 cost = 0.045
Epoch: 9 cost = 0.036
Epoch: 10 cost = 0.027
Training complete!
0.9787
通過TensorBoard可視化訓(xùn)練過程:
感謝各位的閱讀,以上就是“Tensorflow怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Tensorflow怎么使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!