一冕广、處理結構
??Tensorflow 首先要定義神經(jīng)網(wǎng)絡的結構, 然后再把數(shù)據(jù)放入結構當中去運算和 training.
??因為TensorFlow是采用數(shù)據(jù)流圖(data flow graphs)來計算, 所以首先我們得創(chuàng)建一個數(shù)據(jù)流圖, 然后再將我們的數(shù)據(jù)(數(shù)據(jù)以張量(tensor)的形式存在)放在數(shù)據(jù)流圖中計算. 節(jié)點(Nodes)在圖中表示數(shù)學操作,圖中的線(edges)則表示在節(jié)點間相互聯(lián)系的多維數(shù)據(jù)數(shù)組, 即張量(tensor). 訓練模型時tensor會不斷的從數(shù)據(jù)流圖中的一個節(jié)點flow到另一節(jié)點, 這就是TensorFlow名字的由來.
張量(Tensor):
??張量有多種. 零階張量為 純量或標量 (scalar) 也就是一個數(shù)值. 比如 [1]
??一階張量為 向量 (vector), 比如 一維的 [1, 2, 3]
??二階張量為 矩陣 (matrix), 比如 二維的 [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
??以此類推, 還有 三階 三維的 …
參考鏈接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-1-structure/
二、例子
- 創(chuàng)建數(shù)據(jù)
??導入tensorflow和numpy偿洁,使用numpy創(chuàng)建 x 和 y 的數(shù)據(jù)。另外沟优,由于tensorflow中大部分的數(shù)據(jù)都是float32類型涕滋,所以這里使用numpy創(chuàng)建float32類型的數(shù)據(jù)。
import tensorflow as tf
import numpy as np
# create data
x_data=np.random.rand(100).astype(np.float32)
y_data=x_data*0.1+0.3
2.搭建模型
??用 tf.Variable 來創(chuàng)建描述 y 的參數(shù). 我們可以把 y_data = x_data*0.1 + 0.3 想象成 y=Weights * x + biases, 然后神經(jīng)網(wǎng)絡也就是學著把 Weights 變成 0.1, biases 變成 0.3.
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases = tf.Variable(tf.zeros([1]))
y = Weights*x_data + biases
3.計算誤差
??將殘差平方的均值作為誤差
loss = tf.reduce_mean(tf.square(y-y_data))
4.傳播誤差
??反向傳遞誤差的工作就交給optimizer了, 我們使用的誤差傳遞方法是梯度下降法: Gradient Descent 讓后我們使用 optimizer 來進行參數(shù)的更新.
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
- 訓練
??到目前為止, 我們只是建立了神經(jīng)網(wǎng)絡的結構, 還沒有使用這個結構. 在使用這個結構之前, 我們必須先初始化所有之前定義的Variable, 所以這一步是很重要的!
# init = tf.initialize_all_variables() # tf 馬上就要廢棄這種寫法
init = tf.global_variables_initializer() # 替換成這樣就好
??接著,我們再創(chuàng)建會話 Session. 我們用 Session 來執(zhí)行 init 初始化步驟. 并且, 用 Session 來 run 每一次 training 的數(shù)據(jù). 逐步提升神經(jīng)網(wǎng)絡的預測準確性.
sess = tf.Session()
sess.run(init) # Very important
for step in range(201):
sess.run(train)
if step % 20 == 0:
print(step, sess.run(Weights), sess.run(biases))
參考鏈接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-2-example2/
三挠阁、Session會話控制
??Session 是 Tensorflow 為了控制,和輸出文件的執(zhí)行的語句. 運行 session.run() 可以獲得你要得知的運算結果, 或者是你所要運算的部分宾肺。
??先建立兩個矩陣m1和m2,計算它們的乘積product侵俗,然后在使用Session來激活product 并得到計算結果. 有兩種形式使用會話控制 Session锨用。
import tensorflow as tf
# create two matrices
m1= tf.constant([[3,3]])
m2= tf.constant([[2],
[2]])
product = tf.matmul(m1,m2)
# method 1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
# output: [[12]]
# method 2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)
# output: [[12]]
參考鏈接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-3-session/
四、Variable變量
??tensorflow中需要使用tensorflow.Variable來定義變量
mport tensorflow as tf
state = tf.Variable(0, name='counter')
# 定義常量 one
one = tf.constant(1)
# 定義加法步驟 (注: 此步并沒有直接計算)
new_value = tf.add(state, one)
# 將 State 更新成 new_value
update = tf.assign(state, new_value)
??如果在 Tensorflow 中設定了變量隘谣,那么初始化變量是最重要的T鲇怠!所以定義了變量以后, 一定要定義tf.global_variables_initializer()寻歧。到這里變量還是沒有被激活掌栅,需要再在 sess 里, sess.run(init) , 激活 init 這一步。
# 如果定義 Variable, 就一定要 initialize
# init = tf.initialize_all_variables() # tf 馬上就要廢棄這種寫法
init = tf.global_variables_initializer() # 替換成這樣就好
# 使用 Session
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
sess.run(update)
print(sess.run(state))
??注意:直接 print(state) 不起作用B敕骸猾封!
??一定要把 sess 的指針指向 state 再進行 print 才能得到想要的結果!
參考鏈接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-4-variable/
五噪珊、Placeholder傳入值
??placeholder 是 Tensorflow 中的占位符晌缘,暫時儲存變量。
??Tensorflow 如果想要從外部傳入data, 那就需要用到 tf.placeholder(), 然后以這種形式傳輸數(shù)據(jù) sess.run(***, feed_dict={input: **})痢站。
import tensorflow as tf
#在 Tensorflow 中需要定義 placeholder 的 type 磷箕,一般為 float32 形式
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
# mul = multiply 是將input1和input2 做乘法運算,并輸出為 output
ouput = tf.multiply(input1, input2)
??接下來, 傳值的工作交給了 sess.run() , 需要傳入的值放在了feed_dict={} 并一一對應每一個 input. placeholder 與 feed_dict={} 是綁定在一起出現(xiàn)的瑟押。
with tf.Session() as sess:
print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
# output: [ 14.]
六搀捷、激勵函數(shù)
??激勵函數(shù)運行時激活神經(jīng)網(wǎng)絡中某一部分神經(jīng)元,將激活信息向后傳入下一層的神經(jīng)系統(tǒng)。激勵函數(shù)的實質(zhì)是非線性方程嫩舟。 Tensorflow 的神經(jīng)網(wǎng)絡 里面處理較為復雜的問題時都會需要運用激勵函數(shù) activation function 氢烘。
參考鏈接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-6-activation/