【TensorFlow_Fold】配置在Jupyter Notebook下的Fold代码环境

本文介绍如何在 Jupyter Notebook 中配置 TensorFlow 1.0 环境,并利用 TensorFlow Fold 库构建动态计算图。具体涵盖动态 batching 算法、GPU 选择、Fold 库提供的接口及函数,以及示例代码。

TensorFlow_Fold

TensorFlow_Fold in Jupyter Notebook

Jupyter on CentOS7
效果预览如上图,环境为 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.0
python -m ipykernel install --user

简要的解释一下,如果是Linux环境,有一个叫做ipykernel的包可以轻易的添加kernel,不过需要注意的是,一定要确认当前python是不是想加进去的那个python哦,可以用which python来check一下。

KernelList
导入成功之后,就可以在New的时候看到这个kernel啦。

关于GPU的选择使用

假如你们的机器上,有多个GPU,鉴于tensorflow会擅自把所有GPU都拿来用,你想要只用里面的某一个来跑就足够了(比如我们组的四路泰坦,我就跑点小程序请不动这么多尊大神)

GPU

那么,在代码前(请注意,是在import前!)加入如下代码即可,比如下面我用的是序号为0的GPU:

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0"

Tips:import tensorflowimport 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 1
split0, 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 1
split0, split1, split2 = tf.split(value, num_or_size_splits=3, axis=1)
tf.shape(split0) ==> [5, 10]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果天王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值