Tensorflow是一個基於圖的計算系統,其主要應用於機器學習。git
從Tensorflow名字的字面意思能夠拆分紅兩部分來理解:Tensor+flow。github
當咱們想要使用Tensorflow作什麼事情的時候,通常須要三個操做步驟:docker
Tensorflow有個圖的概念,Operations會添加到圖中,做爲圖的節點。在添加某Operation的時候,不會當即執行該Operation。Tensorflow會等待全部Operation添加完畢,而後Tensorflow會優化該計算圖,以便決定如何執行計算。數組
若是想開始實驗一下Tensorflow,能夠經過Docker啓動官方的鏡像tensorflow/tensorflow。瀏覽器
以下所示,網絡
lienhuadeMacBook-Pro:tensorflow lienhua34$ docker run -d -p 8888:8888 --name tensorflow tensorflow/tensorflow 0fc7849b3ef5ac56e8ad372cc201874338c586ed5f47a4205997712efcd35646 lienhuadeMacBook-Pro:tensorflow lienhua34$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0fc7849b3ef5 tensorflow/tensorflow "/run_jupyter.sh" 49 minutes ago Up 2 seconds 6006/tcp, 0.0.0.0:8888->8888/tcp tensorflow
該鏡像啓動一個jupyter,而後咱們在瀏覽器中輸入http://localhost:8888/來訪問,以下圖所示,dom
而後點擊右上角的New -> Python 2,新建的一個Python交互頁面,即可以開始實驗Tensorflow的功能,機器學習
下面咱們經過兩個向量相加的簡單例子來看一下Tensorflow的基本用法。tcp
[1. 1. 1. 1.] + [2. 2. 2. 2.] = [3. 3. 3. 3.]
import tensorflow as tf with tf.Session(): input1 = tf.constant([1.0 1.0 1.0 1.0]) input2 = tf.constant([2.0 2.0 2.0 2.0]) output = tf.add(input1, input2) result = output.eval() print result
Tensorflow的計算必需要在一個Session的上下文中。Session會包含一個計算圖,而這個圖你添加的Tensors和Operations。固然,你在添加Tensor和Operation的時候,它們都不會當即進行計算,而是等到最後須要計算Session的結果的時候。當Tensorflow以後了計算圖中的全部Tensor和Operation以後,其會知道如何去優化和執行圖的計算。學習
兩個tf.constant() 語句向計算圖中建立了兩個Tensor。調用tf.constant()的動做大體能夠說爲,建立兩個指定維度的Tensor,以及兩個constant操做符用於初始化相對應的Tensor(不會當即執行)。
tf.add()語句向計算圖中添加了一個add操做,當不會當即執行,這時候add操做的結果還沒法獲取。此時,計算圖大體以下所示,
result = output.eval() print result
當咱們最後調用output.eval()時,會觸發Tensorflow執行計算圖,從而獲取output計算結點的結果。
咱們上面的例子使用的Tensor是常量(constant),而在咱們實際的機器學習任務中,咱們每每須要變量(variable)來記錄一下可變的狀態(例如神經網絡節點的權重參數等)。下面咱們來看一個簡單的variable例子。
import tensorflow as tf import numpy as np with tf.Session() as sess: # Set up two variables, total and weights, that we'll change repeatedly. total = tf.Variable(tf.zeros([1, 2])) weights = tf.Variable(tf.random_uniform([1,2])) # Initialize the variables we defined above. tf.initialize_all_variables().run() # This only adds the operators to the graph right now. The assignment # and addition operations are not performed yet. update_weights = tf.assign(weights, tf.random_uniform([1, 2], -1.0, 1.0)) update_total = tf.assign(total, tf.add(total, weights)) for _ in range(5): # Actually run the operation graph, so randomly generate weights and then # add them into the total. Order does matter here. We need to update # the weights before updating the total. sess.run(update_weights) sess.run(update_total) print weights.eval(), total.eval()
歸納了說,上面的代碼就是建立了兩個變量total和weights(都是1維的tensor),total全部元素初始化爲0,而weights的元素則用-1到1之間的隨機數進行初始化。而後在某個迭代中,使用-1到1之間的隨機數來更新變量weights的元素,而後添加到變量total中。
在調用tf.Variable()的時候,只是定了變量以及變量的初始化操做(實際上並未執行)。全部變量都須要在開始執行圖計算以前進行初始化。調用tf.initialize_all_variables().run()來對全部變量進行初始化。
在for循環中,
sess.run(update_weights)
觸發執行更新weights變量的計算。
sess.run(update_total)
則處理了將變量total和變量weights進行相加,並將結果賦值到變量total。