您好,登錄后才能下訂單哦!
這篇文章主要講解了“Tensorflow怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Tensorflow怎么使用”吧!
Tensorflow是基于graph的并行計算模型。關于graph的理解可以參考官方文檔。舉個例子,計算a=(b+c)?(c+2)a=(b + c) * (c + 2)a=(b+c)?(c+2),我們可以將算式拆分成一下:
d = b + c e = c + 2 a = d * e
轉換成graph后的形式為:
> 講一個簡單的算式搞成這樣確實大材小用,但是我們可以通過這個例子發現:$d = b + c$和$e = c + 2$是不相關的,也就是可以**并行計算**。對于更復雜的CNN和RNN,graph的并行計算的能力將得到更好的展現。
實際中,基于Tensorflow構建的三層(單隱層)神經網絡如下圖所示:
![這里寫圖片描述](http://adventuresinmachinelearning.com/wp-content/uploads/2017/03/TensorFlow-data-flow-graph.gif) **Tensorflow data flow graph**
上圖中,圓形或方形的節點被稱為node,在node中流動的數據流被稱為張量(tensor)。更多關于tensor的描述見官方文檔。
0階張量 == 標量
1階張量 == 向量(一維數組)
2階張量 == 二維數組
…
n階張量 == n維數組
tensor與node之間的關系:
??如果輸入tensor的維度是5000×645000 \times 645000×64,表示有5000個訓練樣本,每個樣本有64個特征,則輸入層必須有64個node來接受這些特征。
上圖表示的三層網絡包括:輸入層(圖中的input)、隱藏層(這里取名為ReLU layer表示它的激活函數是ReLU)、輸出層(圖中的Logit Layer)。
可以看到,每一層中都有相關tensor流入Gradient節點計算梯度,然后這些梯度tensor進入SGD Trainer節點進行網絡優化(也就是update網絡參數)。
Tensorflow正是通過graph表示神經網絡,實現網絡的并行計算,提高效率。下面我們將通過一個簡單的例子來介紹TensorFlow的基礎語法。
用Tensorflow計算a=(b+c)?(c+2)a = (b + c) * (c + 2)a=(b+c)?(c+2), 1. 定義數據:
import tensorflow as tf # 首先,創建一個TensorFlow常量=>2 const = tf.constant(2.0, name='const') # 創建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可以自動進行數據類型檢測,比如:賦值2.0就默認為tf.float32
,但最好還是顯式地定義。更多關于TensorFlow數據類型的介紹查看官方文檔。
2. 定義運算(也稱TensorFlow operation):
# 創建operation d = tf.add(b, c, name='d') e = tf.add(c, const, name='e') a = tf.multiply(d, e, name='a')
發現了沒,在TensorFlow中,+?×÷+-\times \div+?×÷都有其特殊的函數表示。實際上,TensorFlow定義了足夠多的函數來表示所有的數學運算,當然也對部分數學運算進行了運算符重載,但保險起見,我還是建議你使用函數代替運算符。
**!!TensorFlow中所有的變量必須經過初始化才能使用,**初始化方式分兩步:
定義初始化operation
運行初始化operation
# 1. 定義init operation init_op = tf.global_variables_initializer()
以上已經完成TensorFlow graph的搭建,下一步即計算并輸出。
運行graph需要先調用tf.Session()
函數創建一個會話(session)。session就是我們與graph交互的handle。更多關于session的介紹見官方文檔。
# session with tf.Session() as sess: # 2. 運行init operation sess.run(init_op) # 計算 a_out = sess.run(a) print("Variable a is {}".format(a_out))
值得一提的是,TensorFlow有一個極好的可視化工具TensorBoard,詳見官方文檔。
對上面例子的改進:使變量b可以接收任意值。TensorFlow中接收值的方式為占位符(placeholder),通過tf.placeholder()
創建。
# 創建placeholder b = tf.placeholder(tf.float32, [None, 1], name='b')
第二個參數值為[None, 1],其中None表示不確定,即不確定第一個維度的大小,第一維可以是任意大小。特別對應tensor數量(或者樣本數量),輸入的tensor數目可以是32、64…
現在,如果得到計算結果,需要在運行過程中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.]]
神經網絡的例子,數據集為MNIST數據集。
1. 加載數據:
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
one_hot=True
表示對label進行one-hot編碼,比如標簽4可以表示為[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。這是神經網絡輸出層要求的格式。
2. 定義超參數和placeholder
# 超參數 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])
再次強調,[None, 784]中的None表示任意值,特別對應tensor數目。
3. 定義參數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')
在這里,要了解全連接層的兩個參數w和b都是需要隨機初始化的,tf.random_normal()
生成正態分布的隨機數。
4. 構造隱層網絡
# 計算輸出 y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2))
上面代碼對應于公式:
5. 構造輸出(預測值)
<span ><code># 計算輸出 y_ = tf.nn.softmax(tf.add(tf.matmul(hidden_out, W2), b2)) </code></span>
對于單標簽多分類任務,輸出層的激活函數都是tf.nn.softmax()
。更多關于softmax的知識見維基百科。
6. BP部分—定義loss
損失為交叉熵,公式為
公式分為兩步:
對n個標簽計算交叉熵
對m個樣本取平均
7. BP部分—定義優化算法
# 創建優化器,確定優化目標 optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimizer(cross_entropy)
TensorFlow中更多優化算法詳見官方文檔。
8. 定義初始化operation和準確率node
# init operator init_op = tf.global_variables_initializer() # 創建準確率節點 correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
correct_predicion
會返回一個m×1m\times 1m×1的tensor,tensor的值為True/False表示是否正確預測。
9. 開始訓練
# 創建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>
通過TensorBoard可視化訓練過程:
感謝各位的閱讀,以上就是“Tensorflow怎么使用”的內容了,經過本文的學習后,相信大家對Tensorflow怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。