java 张量运算,博客 | Tensorflow_01_运算符与张量值
feed_dict 方法
它不止是一個方法,同時還是一個觀念,讓我們可以更加明確的了解到節點創立的時候,并不包含了讓節點執行動作的過程,也因為 Tensorflow 這樣的特性,我們可以讓流程先創立好,最后等到要運算真正開始執行的時候,再放入數字即可,就好比先打造出一個游樂園,等著人進來玩游戲,詳情如下簡單代碼:
import tensorflow astf
m= tf.add(5, 3)
n = tf.multiply(a, 3)
sess = tf.Session()
sess.run(n, feed_dict={a:15})
45
3. Graph and Board 圖表和畫板
如上面 「內容」 章節提及的內容,每當一個節點被創建的時候,有一個默認的 TensorBoard 板上會同樣添加一個對應的節點,但是如果需要手動設置節點到我們喜歡的不同板上, Graph 對象就成了一個關鍵的源頭方法,它可以讓我們自由的創建圖例,下面是對應的操作代碼:
import tensorflow astf
# This addnode isputin the default TensorBoard graph
in_default_graph = tf.add(5, 3)
# We create another graph toload another node
g = tf.Graph()
with g.as_default():
a= tf.add(3, 4)
# If we want tohave nodes created in default graph, here isthe method tohelpus
default_graph = tf.get_default_graph()
大多數情況下,用一個默認的數據流圖表就可以了,如果是要定義多個相互之間彼此獨立的模型,則下面三種代碼的寫法適合參考:
import tensorflow astf
# 1. create anewgraph andignore the default graph
g1 = tf.Graph()
g2 = tf.Graph()
with g1.as_default():
a= tf.add(3, 4, name='add_a')
# define some nodes here tog1 graph
with g2.as_default():
b= tf.subtract(5, 2, name='sub_b')
# define some nodes here tog2 graph
# 2. getthe default graph andappoint the graph toanobject
g11 = tf.get_default_graph()
g12 = tf.Graph()
with g11.as_default():
c= tf.add(3, 4, name='add_c')
# define some nodes here tog11 graph
with g12.as_default():
d = tf.subtract(5, 2, name='sub_d')
# define some nodes here tog21 graph
# 3. the default graph can also beapplied along with the other graph
g21 = tf.Graph()
e= tf.add(3, 4, name='add_e')
# define some nodes here in the default graph
with g21.as_default():
f= tf.subtract(5, 2, name='sub_f')
# define some nodes here tog21 graph
sess = tf.Session()
writer = tf.summary.FileWriter('./my_graph')
writer.add_graph(g21)
# orwe can writethe code in one linebelow
# writer = tf.summary.FileWriter('./my_graph', graph=g11)
# by the way, sess.graph == tf.get_default_graph() isTrue!!
sess.close()
writer.close()
等到我們已經確定添加好所有節點到圖表上之后,如果我們要把設置的結果可視化,開啟 TensorBoard 的方法如上面代碼最后一行,兩個參數位置分別如下解釋:
路徑字符串: 根據我們命名的路徑, tf 會自動創建一個文件夾,里面放著一個圖表的描述檔案,文件夾的路徑則放置在我們代碼啟動的同一個路徑下。
指明一個要被畫上去的物件,可以是繪話里面的一個方法,讓我們指定要被顯示的繪話是什么,也可以后面使用 .add_graph() 方法添加要畫上的物件。
如果一個項目比較大,圖中的節點比較多,我們可能會需要使用一個大框框來涵蓋所有的節點,并在圖里只簡單顯示輸入端和輸出端,使得該大框框成為一個類似黑箱的存在,這時候我們需要使用到下面函數:
tf.name_scope('give_a_name_here')
搭配 with 使用的話,就會變成: with tf.name_scope(): ...indention # the belonged nodes is constructed below.
每個節點參數部分都有一個 name 標簽,是用來為該節點取名字,讓我們能夠更為明了的在 TensorBoard 上面看出哪一個節點對應到的作用是什么,同時如果這些節點是一個占位節點,如 Variable, Constant, placeholder 等,我們還可以直接呼叫該節點的名字得到該占位節點里面值的復用。
等代碼運行完畢后,找到文件夾路徑,然后從命令提示資源開啟該路徑并鍵入:
tensorboard --logdir='./the_name'
我們會得到一個本地網址,復制該網址到瀏覽器里面打開即可。
最后,等到所有事情做完了,如果有一個 .close() 的動作,可以避免一些不必要的錯誤,或是我們使用 with 的方法,也可以順利關閉代碼的行為。
4. Variables 變量
繼上面張量小節提到的內容,我們除了 .Constant() 可以用之外,還有兩個也非常適合拿來描述變量,甚至卡位用的函數:
.placeholder()
.Variable()
有別于直接鍵入數字,使用這些函數的好處是我們可以非常精確的聲明該數值的屬性和各種細節,進而免去所有因為數據類型不同造成的錯誤和麻煩。完整的聲明也有助于我們在構建數學模型的時候提升思路的清晰度。
.placeholder() method
前面示范代碼中我們都使用了單一不變的數值作為輸入,但是這樣造成建構好一個模型后沒辦法重復使用,因為數值是一樣的。這個問題被 placeholder 給解開了,它白話文的意思是: 這邊有一個變量,但我還沒決定好它是什么,不過我可以先對其輪廓給一個定義,例如數據類型,張量大小,該變量在圖表中的名稱等等。
這樣模糊的狀態會持續到即將運行計算環節之前,我們會使用 feed_dict 參數以字典的模式導入數值到該位置,使其最終順利運行,如下面代碼:
importnumpy asnp
importtensorflow astf
''' dtype is a necessity that we should announce in parameter.
shape is optional argument with a default None value on the other hand.'''
a = tf.placeholder(dtype=tf.int32, shape=[2], name='my_input')
b = tf.reduce_prod(a, name='prod_b')
c = tf.reduce_sum(a, name='sum_c')
d = tf.add(b, c, name='add_d')
sess = tf.Session()
the_dict = {a: np.array([5, 3], dtype=np.int32)}
sess.run(d, feed_dict=the_dict)
23
.Variable() method
它可以用來承載任意的數值,數字,向量,矩陣,多維張量等等都囊括其中,而為了讓它更方便的被使用, tf 有許多創建變量的方法,常見使用的方法如下面列舉:
tf.zeros(shape=(None, None, ...), dtype=np.int32)
tf.ones(shape=(None, None, ...), dtype=np.int32)
tf.random_normal(shape=(None, None, ...), mean=0.0, stddev=2.0)
tf.truncated_normal(shape=(None, None, ...), mean=0.0, stddev=1.0)
tf.random_uniform(shape=(None, None, ...), minval=0, maxval=10)
Official website for more details
因為 .Variable() 方法的好用和普遍性,我們在創建好節點后并在執行運算前,需要對它們做初始化,可以是個別的也可以是全部一起的,代碼如下:
individual: tf.initialize_variables([var], name='init_var')
overall: tf.global_variables_initializer()
如果代碼執行過程中希望“取代”該變量原本的值,那么有另一個方法可以使用:
.assign()
下面是上面列舉方法的示范代碼:
import numpy asnp
import tensorflow astf
a= tf.Variable(tf.ones(shape=[1], dtype=np.float32))
b= tf.Variable(tf.random_normal(shape=[1], dtype=np.float32,
mean=0.0, stddev=2.0))
c= a.assign(a*2)
d = tf.add(b, c, name='add_d')
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
fori in range(3):
print(sess.run(d))
sess.run(tf.assign_add(a, np.array([3], dtype=np.float32)))
[2.0879781]
[4.0879784]
[8.087978]
array([11.], dtype=float32)
如果對于某些參數我們不樂見上面示例般一輪一輪的迭代數值,可以在 .Variable() 中添加如下代碼:
tf.Variable(0, trainable=False)
如此一來就可以鎖定變量值。
5. Training 訓練
根據上面我們描述的內容和觀念,接著我們可以開始嘗試編造一個模型,并且用神經網絡原理訓練該模型的結果逼近到我們所預期的答案上,以下是代碼的邏輯步驟:
引入我們需要使用的模塊包,并原地創建需要的數據和方程式
使用神經網絡的線性模型 y = wx + b,并用 tf 創建變量的方法創建需要的節點
計算隨機給出的數字和我們的方程式相差大小
使用 tf 里面的梯度下降其中一個方法,并設置學習效率
開始使用該方法尋找方程式的最小值
初始化完了所有的 tf 的變量后,開啟 100 次循環,表示訓練次數
打印出結果結束
詳細代碼如下展示:
import numpy asnp
import tensorflow astf
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1+ 0.3
weight = tf.Variable(tf.random_uniform(shape=[1], minval=-1.0, maxval=1.0))
bias = tf.Variable(tf.zeros(shape=[1]))
y= weight * x_data + bias
loss = tf.reduce_mean(tf.square(y- y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
training = optimizer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
forstep in range(101):
sess.run(training)
ifstep % 10== 0:
print('Round {}, weight: {}, bias: {}'
.format(step, sess.run(weight[0]), sess.run(bias[0])))
Round 0, weight:-0.02453458309173584, bias:0.49208229780197144
Round 10, weight:0.010933060199022293, bias:0.34626200795173645
Round 20, weight:0.055091626942157745, bias:0.32332566380500793
Round 30, weight:0.07735679298639297, bias:0.3117610216140747
Round 40, weight:0.08858311176300049, bias:0.3059300184249878
Round 50, weight:0.09424349665641785, bias:0.3029899597167969
Round 60, weight:0.09709753841161728, bias:0.3015075623989105
Round 70, weight:0.09853656589984894, bias:0.3007601201534271
Round 80, weight:0.09926214069128036, bias:0.3003832697868347
Round 90, weight:0.09962794929742813, bias:0.30019325017929077
Round 100, weight:0.09981241822242737, bias:0.30009743571281433
PS:首發的原文,歡迎訂閱我的 CSDN:https://blog.csdn.net/Kuo_Jun_Lin/article/details/81536593,
以及我的AI研習社博客:
http://www.gair.link/page/center/myPage/5104751返回搜狐,查看更多
總結
以上是生活随笔為你收集整理的java 张量运算,博客 | Tensorflow_01_运算符与张量值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新股申购的条件和流程是什么
- 下一篇: SpaceX 明早将发射久违的重型猎鹰火