本篇內容基於 Python3 TensorFlow 1.4 版本。dom
本節經過最簡單的示例 —— 平面擬合來講明 TensorFlow 的基本用法。函數
TensorFlow 的引入方式是:優化
import tensorflow as tf
接下來咱們構造一些隨機的三維數據,而後用 TensorFlow 找到平面去擬合它,首先咱們用 Numpy 生成隨機三維點,其中變量 x 表明三維點的 (x, y) 座標,是一個 2×100 的矩陣,即 100 個 (x, y),而後變量 y 表明三位點的 z 座標,咱們用 Numpy 來生成這些隨機的點:spa
import numpy as np x_data = np.float32(np.random.rand(2, 100)) y_data = np.dot([0.300, 0.200], x_data) + 0.400 print(x_data) print(y_data)
這裏利用 Numpy 的 random 模塊的 rand() 方法生成了 2×100 的隨機矩陣,這樣就生成了 100 個 (x, y) 座標,而後用了一個 dot() 方法算了矩陣乘法,用了一個長度爲 2 的向量跟此矩陣相乘,獲得一個長度爲 100 的向量,而後再加上一個常量,獲得 z 座標,輸出結果樣例以下:code
[[ 0.97232962 0.08897641 0.54844421 0.5877986 0.5121088 0.64716059 0.22353953 0.18406206 0.16782761 0.97569454 0.65686035 0.75569868 0.35698661 0.43332314 0.41185728 0.24801297 0.50098598 0.12025958 0.40650111 0.51486945 0.19292323 0.03679928 0.56501174 0.5321334 0.71044683 0.00318134 0.76611853 0.42602748 0.33002195 0.04414672 0.73208278 0.62182301 0.49471655 0.8116194 0.86148429 0.48835048 0.69902027 0.14901569 0.18737803 0.66826463 0.43462989 0.35768151 0.79315376 0.0400687 0.76952982 0.12236254 0.61519378 0.92795062 0.84952474 0.16663995 0.13729768 0.50603199 0.38752931 0.39529857 0.29228279 0.09773371 0.43220878 0.2603009 0.14576958 0.21881725 0.64888018 0.41048348 0.27641159 0.61700606 0.49728736 0.75936913 0.04028837 0.88986284 0.84112513 0.34227493 0.69162005 0.89058989 0.39744586 0.85080278 0.37685293 0.80529863 0.31220895 0.50500977 0.95800418 0.43696108 0.04143282 0.05169986 0.33503434 0.1671818 0.10234453 0.31241918 0.23630807 0.37890589 0.63020509 0.78184551 0.87924582 0.99288088 0.30762389 0.43499199 0.53140771 0.43461791 0.23833922 0.08681628 0.74615192 0.25835371] [ 0.8174957 0.26717573 0.23811154 0.02851068 0.9627012 0.36802396 0.50543582 0.29964805 0.44869211 0.23191817 0.77344608 0.36636299 0.56170034 0.37465382 0.00471885 0.19509546 0.49715847 0.15201907 0.5642485 0.70218688 0.6031307 0.4705168 0.98698962 0.865367 0.36558965 0.72073907 0.83386165 0.29963031 0.72276717 0.98171854 0.30932376 0.52615297 0.35522953 0.13186514 0.73437029 0.03887378 0.1208882 0.67004597 0.83422536 0.17487818 0.71460873 0.51926661 0.55297899 0.78169805 0.77547258 0.92139858 0.25020468 0.70916855 0.68722379 0.75378138 0.30182058 0.91982585 0.93160367 0.81539184 0.87977934 0.07394848 0.1004181 0.48765802 0.73601437 0.59894943 0.34601998 0.69065076 0.6768015 0.98533565 0.83803362 0.47194552 0.84103006 0.84892255 0.04474261 0.02038293 0.50802571 0.15178065 0.86116213 0.51097614 0.44155359 0.67713588 0.66439205 0.67885226 0.4243969 0.35731083 0.07878648 0.53950399 0.84162414 0.24412845 0.61285144 0.00316137 0.67407191 0.83218956 0.94473189 0.09813353 0.16728765 0.95433819 0.1416636 0.4220584 0.35413414 0.55999744 0.94829601 0.62568033 0.89808714 0.07021013]] [ 0.85519803 0.48012807 0.61215557 0.58204171 0.74617288 0.66775297 0.56814902 0.51514823 0.5400867 0.739092 0.75174732 0.6999822 0.61943605 0.60492771 0.52450095 0.51342299 0.64972749 0.46648169 0.63480003 0.69489821 0.57850311 0.50514314 0.76690145 0.73271342 0.68625198 0.54510222 0.79660789 0.58773431 0.64356002 0.60958773 0.68148959 0.6917775 0.61946087 0.66985885 0.80531934 0.5542799 0.63388372 0.5787139 0.62305848 0.63545502 0.67331071 0.61115777 0.74854193 0.56836022 0.78595346 0.62098848 0.63459907 0.8202189 0.79230218 0.60074826 0.50155342 0.73577477 0.70257953 0.68166794 0.6636407 0.44410981 0.54974625 0.57562188 0.59093375 0.58543506 0.66386805 0.6612752 0.61828378 0.78216895 0.71679293 0.72219985 0.58029252 0.83674336 0.66128606 0.50675907 0.70909116 0.6975331 0.69146618 0.75743606 0.6013666 0.77701676 0.6265411 0.68727338 0.77228063 0.60255049 0.42818714 0.52341076 0.66883513 0.49898023 0.55327365 0.49435803 0.6057068 0.68010968 0.77800791 0.65418036 0.69723127 0.8887319 0.52061989 0.61490928 0.63024914 0.64238486 0.66116097 0.55118095 0.80346301 0.49154814]
這樣咱們就獲得了一些三維的點。orm
隨後咱們用 TensorFlow 來根據這些數據擬合一個平面,擬合的過程實際上就是尋找 (x, y) 和 z 的關係,即變量 x_data 和變量 y_data 的關係,而它們之間的關係剛纔咱們用了線性變換表示出來了,即 z = w * (x, y) + b,因此擬合的過程實際上就是找 w 和 b 的過程,因此這裏咱們就首先像設變量同樣來設兩個變量 w 和 b,代碼以下:對象
x = tf.placeholder(tf.float32, [2, 100]) y_label = tf.placeholder(tf.float32, [100]) b = tf.Variable(tf.zeros([1])) w = tf.Variable(tf.random_uniform([2], -1.0, 1.0)) y = tf.matmul(tf.reshape(w, [1, 2]), x) + b
在建立模型的時候,咱們首先能夠將現有的變量來表示出來,用 placeholder() 方法聲明便可,一會咱們在運行的時候傳遞給它真實的數據就好,第一個參數是數據類型,第二個參數是形狀,由於 x_data 是 2×100 的矩陣,因此這裏形狀定義爲 [2, 100],而 y_data 是長度爲 100 的向量,因此這裏形狀定義爲 [100],固然此處使用元組定義也能夠,不過要寫成 (100, )。it
隨後咱們用 Variable 初始化了 TensorFlow 中的變量,b 初始化爲一個常量,w 是一個隨機初始化的 1×2 的向量,範圍在 -1 和 1 之間,而後 y 再用 w、x、b 表示出來,其中 matmul() 方法就是 TensorFlow 中提供的矩陣乘法,相似 Numpy 的 dot() 方法。不過不一樣的是 matmul() 不支持向量和矩陣相乘,即不能 BroadCast,因此在這裏作乘法前須要先調用 reshape() 一下轉成 1×2 的標準矩陣,最後將結果表示爲 y。io
這樣咱們就構造出來了一個線性模型。ast
這裏的 y 是咱們模型中輸出的值,而真實的數據倒是咱們輸入的 y_data,即 y_label。
要擬合這個平面的話,咱們須要減少 y_label 和 y 的差距就行了,這個差距越小越好。
因此接下來咱們能夠定義一個損失函數,來表明模型實際輸出值和真實值之間的差距,咱們的目的就是來減少這個損失,代碼實現以下:
loss = tf.reduce_mean(tf.square(y - y_label))
這裏調用了 square() 方法,傳入 y_label 和 y 的差來求得平方和,而後使用 reduce_mean() 方法獲得這個值的平均值,這就是如今模型的損失值,咱們的目的就是減少這個損失值,因此接下來咱們使用梯度降低的方法來減少這個損失值便可,定義以下代碼:
optimizer = tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(loss)
這裏定義了 GradientDescentOptimizer 優化,即便用梯度降低的方法來減少這個損失值,咱們訓練模型就是來模擬這個過程。
最後咱們將模型運行起來便可,運行時必須聲明一個 Session 對象,而後初始化全部的變量,而後執行一步步的訓練便可,實現以下:
with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for step in range(201): sess.run(train, feed_dict={x: x_data, y: y_data}) if step % 10 == 0: print(step, sess.run(w), sess.run(b))
這裏定義了 200 次循環,每一次循環都會執行一次梯度降低優化,每次循環都調用一次 run() 方法,傳入的變量就是剛纔定義個 train 對象,feed_dict 就把 placeholder 類型的變量賦值便可。隨着訓練的進行,損失會愈來愈小,w 和 b 也會被慢慢調整爲擬合的值。
在這裏每 10 次 循環咱們都打印輸出一下擬合的 w 和 b 的值,結果以下:
0 [ 0.31494665 0.33602586] [ 0.84270978] 10 [ 0.19601417 0.17301694] [ 0.47917289] 20 [ 0.23550016 0.18053198] [ 0.44838765] 30 [ 0.26029009 0.18700737] [ 0.43032286] 40 [ 0.27547371 0.19152154] [ 0.41897511] 50 [ 0.28481475 0.19454622] [ 0.41185945] 60 [ 0.29058149 0.19652548] [ 0.40740564] 70 [ 0.2941508 0.19780098] [ 0.40462157] 80 [ 0.29636407 0.1986146 ] [ 0.40288284] 90 [ 0.29773837 0.19913 ] [ 0.40179768] 100 [ 0.29859257 0.19945487] [ 0.40112072] 110 [ 0.29912385 0.199659 ] [ 0.40069857] 120 [ 0.29945445 0.19978693] [ 0.40043539] 130 [ 0.29966027 0.19986697] [ 0.40027133] 140 [ 0.29978839 0.19991697] [ 0.40016907] 150 [ 0.29986817 0.19994824] [ 0.40010536] 160 [ 0.29991791 0.1999677 ] [ 0.40006563] 170 [ 0.29994887 0.19997987] [ 0.40004089] 180 [ 0.29996812 0.19998746] [ 0.40002549] 190 [ 0.29998016 0.19999218] [ 0.40001586] 200 [ 0.29998764 0.19999513] [ 0.40000987]
能夠看到,隨着訓練的進行,w 和 b 也慢慢接近真實的值,擬合愈來愈精確,接近正確的值。
以上即是經過一個最簡單的平面擬合的案例來講明瞭一下 TensorFlow 的用法,是否是很簡單?