溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Tensorflow怎么使用

發(fā)布時(shí)間:2021-12-08 13:37:38 來(lái)源:億速云 閱讀:274 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Tensorflow怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Tensorflow怎么使用”吧!

Tensorflow graphs

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è)簡(jiǎn)單的算式搞成這樣確實(shí)大材小用,但是我們可以通過(guò)這個(gè)例子發(fā)現(xiàn):$d = b + c$和$e = c + 2$是不相關(guān)的,也就是可以**并行計(jì)算**。對(duì)于更復(fù)雜的CNN和RNN,graph的并行計(jì)算的能力將得到更好的展現(xiàn)。

實(shí)際中,基于Tensorflow構(gòu)建的三層(單隱層)神經(jīng)網(wǎng)絡(luò)如下圖所示:

![這里寫(xiě)圖片描述](http://adventuresinmachinelearning.com/wp-content/uploads/2017/03/TensorFlow-data-flow-graph.gif) **Tensorflow data flow graph**

上圖中,圓形或方形的節(jié)點(diǎn)被稱(chēng)為node,在node中流動(dòng)的數(shù)據(jù)流被稱(chēng)為張量(tensor)。更多關(guān)于tensor的描述見(jiàn)官方文檔。

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來(lái)接受這些特征。

上圖表示的三層網(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正是通過(guò)graph表示神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)網(wǎng)絡(luò)的并行計(jì)算,提高效率。下面我們將通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)介紹TensorFlow的基礎(chǔ)語(yǔ)法。

A Simple TensorFlow example

用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ù)類(lèi)型檢測(cè),比如:賦值2.0就默認(rèn)為tf.float32,但最好還是顯式地定義。更多關(guān)于TensorFlow數(shù)據(jù)類(lèi)型的介紹查看官方文檔。
2. 定義運(yùn)算(也稱(chēng)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)了沒(méi),在TensorFlow中,+?×÷+-\times \div+?×÷都有其特殊的函數(shù)表示。實(shí)際上,TensorFlow定義了足夠多的函數(shù)來(lái)表示所有的數(shù)學(xué)運(yùn)算,當(dāng)然也對(duì)部分?jǐn)?shù)學(xué)運(yùn)算進(jìn)行了運(yùn)算符重載,但保險(xiǎn)起見(jiàn),我還是建議你使用函數(shù)代替運(yùn)算符。

**??!TensorFlow中所有的變量必須經(jīng)過(guò)初始化才能使用,**初始化方式分兩步:

  1. 定義初始化operation

  2. 運(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的介紹見(jiàn)官方文檔。

# 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,詳見(jiàn)官方文檔。

The TensorFlow placeholder

對(duì)上面例子的改進(jìn):使變量b可以接收任意值。TensorFlow中接收值的方式為占位符(placeholder),通過(guò)tf.placeholder()創(chuàng)建。

# 創(chuàng)建placeholder
b = tf.placeholder(tf.float32, [None, 1], name='b')
  •  

第二個(gè)參數(shù)值為[None, 1],其中None表示不確定,即不確定第一個(gè)維度的大小,第一維可以是任意大小。特別對(duì)應(yīng)tensor數(shù)量(或者樣本數(shù)量),輸入的tensor數(shù)目可以是32、64…

現(xiàn)在,如果得到計(jì)算結(jié)果,需要在運(yùn)行過(guò)程中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.]]

A Neural Network Example

神經(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表示對(duì)label進(jìn)行one-hot編碼,比如標(biāo)簽4可以表示為[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。這是神經(jīng)網(wǎng)絡(luò)輸出層要求的格式。

Setting things up

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表示任意值,特別對(duì)應(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ù)wb都是需要隨機(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))

上面代碼對(duì)應(yīng)于公式:Tensorflow怎么使用

5. 構(gòu)造輸出(預(yù)測(cè)值)

<span ><code># 計(jì)算輸出
y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2))
</code></span>

對(duì)于單標(biāo)簽多分類(lèi)任務(wù),輸出層的激活函數(shù)都是tf.nn.softmax()。更多關(guān)于softmax的知識(shí)見(jiàn)維基百科。

6. BP部分—定義loss
損失為交叉熵,公式為

Tensorflow怎么使用

公式分為兩步:

  1. 對(duì)n個(gè)標(biāo)簽計(jì)算交叉熵

  2. 對(duì)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)化算法詳見(jiàn)官方文檔。

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的值為T(mén)rue/False表示是否正確預(yù)測(cè)。

Setting up the training

9. 開(kāi)始訓(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}))

輸出:

<span ><code>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
</code></span>

通過(guò)TensorBoard可視化訓(xùn)練過(guò)程:
Tensorflow怎么使用

感謝各位的閱讀,以上就是“Tensorflow怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Tensorflow怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI