TensorFlow_Fold TensorFlow_Fold in Jupyter Notebook
效果預覽如上圖,環境為 CentOS7 + Python with TensorFlow1.0(Fold include) How to add kernel for Jupyter
jupyter裡一般是沒有我們自己設定的env下的python的,比如我包含tensorflow_fold庫的python就是在source activate tensorflow1.0後才能擷取到,所以在為notebook添加這個環境下的python才可以在notebook裡擷取到。
sudo pip install -U ipykernel# source activate tensorflow1.0python -m ipykernel install --user
簡要的解釋一下,如果是Linux環境,有一個叫做ipykernel的包可以輕易的添加kernel,不過需要注意的是,一定要確認當前python是不是想加進去的那個python哦,可以用which python來check一下。
匯入成功之後,就可以在New的時候看到這個kernel啦。 關於GPU的選擇使用
假如你們的機器上,有多個GPU,鑒於tensorflow會擅自把所有GPU都拿來用,你想要只用裡面的某一個來跑就足夠了(比如我們組的四路泰坦,我就跑點小程式請不動這麼多尊大神)
那麼,在代碼前(請注意,是在import前。)加入如下代碼即可,比如下面我用的是序號為0的GPU:
import osos.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"os.environ["CUDA_VISIBLE_DEVICES"]="0"
Tips:import tensorflow和import tensorflow_fold都會在import的時候就決定了使用哪些GPU,所以一定要先設定好environ,再import這倆兄弟。 About TensorFlow_Fold 封裝在靜態架構上的動態介面 Dynamic Batching的演算法很繁瑣,但不用當心,這個過程是由架構自動完成的,作為架構的使用者,我們只要知道怎麼調用官方給出來的介面就可以了。 新推出的TensorFlow Fold就是一個TensorFlow的封裝,設計參考了函數式編程的一些思想,目的就是方便使用者快速地構建動態計算圖。下面我們來簡單地瀏覽一下,要進一步瞭解可以去看官方的教學文檔。Documents TensorFlow Fold提供了一些函數專門用來處理序列(x1,…,xn):
Map(f):計算[f(x1) ,…,f(xn)]將函數f應用到每一個序列的元素,比如將句子中的每一個詞轉化為詞向量; Fold(g, z):計算g(…,g(z, x1), x2), …,xn ),比如說展開一個RNN(迴圈神經網路); Reduce (g):計算g(Reduce(g)[x1 ,…,xn/2],Reduce(g)[xn/2 ,…,xn],將函數g應用到一顆平衡二叉樹上,比如對序列中的元素作max或sum-pooling。 由於TensorFlow原本的基本單元Tensor不適合用於構建動態圖,所以Fold引入新的基本組件Block。Block有明確的一個輸入類型和一個輸出類型,包括:
Input:來著程式設計語言如Python中元素,比如字典等; Tensor:擁有資料類型和形狀的TensorFlow基本模組; Tuple (t1 ,…,tn ):括弧中的每一個t表示對應位置的類型; Sequence (t):一個不定長的擁有類型為t的元素的序列; Void:單元類型。這些基本類型可以相互嵌套,比如一個Block的輸入類型可以是Input類型的Tuple。 用來建立Block的基本函數有:
Scalar:將Python標量轉化為Tensor;Tensor:將Numpy數組轉化為Tensor;Function (h ):建立一個Operation; InputTransform (h):用於預先處理Python類型。 用來組合Block的基本函數有:
b1>>b2,流水線(pipeline):將b1 的輸出作為b2 的輸入; Record({l1:b1,…, ln:bn}): 接受一個Python字典為輸入,對字典中key值為li 的value應用; OneOf (b1,…,bn):根據輸入條件應用b1,…bn中的一個; Optional (b):OneOf的特例,如果輸入不為None,應用b; AllOf (b1,…,bn):輸入應用中的每一個。 用來組合Block的進階函數有:
Composition():流水線的升級版,流水線只能處理串列的流程,Composition()建立一個Scope對象,在這個Scope的縮排範圍內,採用b.reads(b1,…,bn )來讀取多個資料流,可以用於構建多分支結構; ForwardDeclaration():用來建立遞迴結構,這個函數可以先定義一個預先佔位的運算式expr,等這個運算式定義完再用expr.resolve_to(expr_def),將運算式遞迴地代入,這是用來建立樹結構計算圖必不可少的工具。 Coding Logs
敲幾個試試手……
"""td.InputTransform(fn):Python Function to Blocks"""def func(alist): return (alist[3], alist[0]+alist[1])b = td.InputTransform(func)b.eval([1,2,3,4]) # => (4,3)
"""tf.split(value, num_or_size_splits, axis=0, num=None, name='split'):Splits a tensor into sub tensors."""# 'value' is a tensor with shape [5, 30]# Split 'value' into 3 tensors with sizes [4, 15, 11] along dimension 1split0, split1, split2 = tf.split(value, [4, 15, 11], 1)tf.shape(split0) ==> [5, 4]tf.shape(split1) ==> [5, 15]tf.shape(split2) ==> [5, 11]# Split 'value' into 3 tensors along dimension 1split0, split1, split2 = tf.split(value, num_or_size_splits=3, axis=1)tf.shape(split0) ==> [5, 10]