tensorflow基本語法
阿新 • • 發佈:2018-12-03
tensorflow基本語法
內容主要來自tensorflow英文官網1:tensor--張量
3 # a rank 0 tensor; a scalar with shape []
[1., 2., 3.] # a rank 1 tensor; a vector with shape [3]
[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]
熟悉numpy的這一部分應該不會陌生,其實就和numpy的ndarray一致,就是多維陣列。
2:可計算圖(computational graph)
一般的神經網路就如上圖,上面說是最簡單的單個計算節點的神經網路。 tensorflow需要使用兩個步驟來完成神經網路的訓練。首先,構建圖。然後,執行圖。 正如上面的神經網路的圖,存在x和1等節點,也存在橙色圓圈代表的節點,代表運算h(x)=f(W^t*x+b)。這些節點都必須通過tensorflow首先構建。比如說node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant (4.0) # also tf.float32 implicitly
print(node1, node2)
output:Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
可以看到這裡輸出的是一些引數資訊,因為這裡沒有執行圖。前面說過,tensorflow分為獨立的兩步,只有執行之後才會出結果
sess = tf.Session()
print(sess.run([node1, node2]))
結果才是[3.0,4.0]。 tensorflow裡面所有的運算也是節點,也需要構建點然後執行才能得到結果。比如說
from __future__ import print_function
node3 = tf.add(node1, node2)
print("node3:", node3)
print("sess.run(node3):", sess.run(node3))
node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3): 7.0
上面的結點都是常量節點以及基於常量節點的運算,根據神經網路的結構圖就可以知道,還存在一些其他節點。比如說x,在構建的時候不知道x的值是多少,需要後來進行填充。
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b # + provides a shortcut for tf.add(a, b)
print(sess.run(adder_node, {a: 3, b: 4.5}))
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
7.5
[ 3. 7.]
還可以進一步的操作,比如說
add_and_triple = adder_node * 3.
print(sess.run(add_and_triple, {a: 3, b: 4.5}))
輸出就是22.5,可以看到,這裡的輸入引數依舊是a和b,其實這裡的引數可以是adder_node
因為整個拓撲圖是確定的,雖然定義的adder_node是一個計算節點,但是本身在節點直接流動的本來就是資料,計算a+b的結果賦值給adder_node和給他賦值效果是一樣的。
因此,計算圖裡面執行節點的時候可以從任意節點當做引數賦值,而不用一定是輸入節點。 除了上面講到的節點之外,還有Variable節點。
Variables allow us to add trainable parameters to a graph. They are constructed with a type and initial value。Variable節點可以更新值,主要用於模型裡面的一些引數,這些引數需要不斷的更新來訓練模型。placehoder其實可不是固定不變的,但是placeholder多用於一些實際的點,什麼輸入輸出之類的,而Variable用於一些引數,另外,placeholder可以在run的時候輸入值,而Variable不可以。Constant只要初始化,那麼久不能進行改變。
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
Constant在使用tf.Constant的時候就進行初始化,而Variable不是,Variable需要使用
init = tf.global_variables_initializer()
sess.run(init)
才能初始化,一般Variable提供型別以及初始值來進行構造。It is important to realize
init
is a handle to the TensorFlow sub-graph that initializes all the global variables. Until we call
sess.run
, the variables are uninitialized. 只有run了init之後才初始化。
print(sess.run(linear_model, {x: [1, 2, 3, 4]}))
[ 0. 0.30000001 0.60000002 0.90000004]
在得到線性模型之後,需要進行優化,一般的優化方法把汗梯度下降,梯度上升,牛頓法等等
y = tf.placeholder(tf.float32)
squared_deltas = tf.square(linear_model - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
其中,reduce_sum就是把所有的元素相加,得到一個標量,但是這僅僅是不加其餘引數的情況下,加了axis引數的話就可以在指定維度上面進行相加。詳情可以檢視https://www.tensorflow.org/api_docs/python/tf/reduce_sum 如果要改變變數的值的話,需要使用assign方法。
fixW = tf.assign(W, [-1.])
fixb = tf.assign(b, [1.])
sess.run([fixW, fixb])
print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
A complete discussion of machine learning is out of the scope of this tutorial. However, TensorFlow provides optimizers that slowly change each variable in order to minimize the loss function. The simplest optimizer is gradient descent. It modifies each variable according to the magnitude of the derivative of loss with respect to that variable. In general, computing symbolic derivatives manually is tedious and error-prone. Consequently, TensorFlow can automatically produce derivatives given only a description of the model using the function tf.gradients. For simplicity, optimizers typically do this for you. 上面這段講的非常的細緻,就照搬下來了。因為機器學習演算法很多都需要進行優化,因此就涉及很多優化方法,比如上面提到的梯度方法和牛頓方法,梯度方法包含很多,比如說批梯度,隨機梯度等等。因為人為的計算有可能出錯而且很繁瑣,所以tensorflow把這些優化方法給實現了。
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init) # reset values to incorrect defaults.
for i in range(1000):
sess.run(train, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]})
print(sess.run([W, b]))
下面是最簡單的線性迴歸的程式碼:
import tensorflow as tf
# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W*x + b
y = tf.placeholder(tf.float32)
# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares
# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]
# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
sess.run(train, {x: x_train, y: y_train})
# evaluate training accuracy
curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})
print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
上面的程式碼非常的簡單,把tensorflow的流程講的非常的好。 輸出是
W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11
存在一個tf.estimator,它可以說是一個構件,它裡面實現了一些諸如線性迴歸,線性分類等機器學習方法,可以直接使用。具體檢視https://www.tensorflow.org/get_started/get_started
檢視原文: http://www.hahaszj.top/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0/tensorflow%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/189