TensorFlow高阶函数之 tf.foldl()和tf.foldr()
TensorFlow高阶函数之 tf.foldl()和tf.foldr()
在TensorFlow中有着若干高阶函数,如之前已经介绍过了的tf.map_fn()
,见博文TensorFlow中的高阶函数:tf.map_fn(),此外,还有几个常用的高阶函数,分别是tf.foldl()
,tf.foldr()
,我们简要介绍下。
tf.foldl()
类似于python中的reduce()
函数,假设elems
是一个大于等于一阶的张量或者列表,形状如[n,...]
,那么该函数将会重复地调用fn
与这个列表上,从左到右进行处理,这里讲得不清楚,我们看看官方的API手册和一些例子理解一下,地址:https://www.tensorflow.org/api_docs/python/tf/foldl
tf.foldl(
fn,
elems,
initializer=None,
parallel_iterations=10,
back_prop=True,
swap_memory=False,
name=None
)
其中fn
是一个可调用函数,也可以用lambda表达式;elems
是需要处理的列表;initializer
是一个可选参数,可以作为fn
的初始累加值(accumulated value);至于parallel_iterations
是并行数,其他的函数可以查询官网,就不累述了。
最重要的参数无非是fn
,elems
和initializer
,其中fn
是一个具有两个输入参数的函数,需要返回一个值作为累计结果,elems
是一个列表或者张量,用于被fn
累计处理。形象的来说,就是
tf.foldl(fn,elems=[x1,x2,x3,x4]) = fn(fn(fn(x1,x2),x3),x4)
如果给定了initializer
,那么初始的累计参数(也就是fn
的第一个参数)就是他了,如果没有给定,也即是initializer=None
那么elems
中必须至少有一个值,第一个值将会被作为初始值。例子:
import tensorflow as tf
elems = [1, 2, 3, 4, 5, 6]
sum = tf.foldl(lambda a, x: a + x, elems)
with tf.Session() as sess:
print(sess.run(sum))
将会输出21,也即是(((((1+2)+3)+4)+5)+6),如果给定了一个初始化值,就变为:
import tensorflow as tf
elems = [1, 2, 3, 4, 5, 6]
sum = tf.foldl(lambda a, x: a + x, elems,initializer=10)
with tf.Session() as sess:
print(sess.run(sum))
输出变为31。此处的累加是最简单的应用,还可以有更多复杂的应用,就看应用场景了。至于tf.foldr()
和这个函数是基本上一样的,无非就是从右边开始计算到左边而已。