tf.py_func(func, inp, Tout)
在这里第一个参数是核心,也就是一个用户自定义的函数,输入是numpy array,输出也是numpy array,在该函数中,用户可以自由的使用numpy 操作
第二个参数是inp,是func函数接受的输入,是一个列表。
第三个参数是Tout,指定了func函数返回后的numpy array 转化成的tesnor后的格式,如果是多个值就是列表否则就是一个元组,如果是一个返回值,就是一个单独的dtype的类型
ty.py_func的输出:
输出是一个tensor列表,或者是一个单个的tensor。
今天任然要夸赞一下tf.py_func这个函数,由于很多情况下,tensorflow内置函数解决不是很方便的时候,可以结合tf.py_func和numpy里面的内置函数很方便的解决,因为在tensorflow中基本上都是静态图的情况,所以当你用tensorflow和numpy混合编程的时候,由于在中间过程中的op只有在session的时候才能得出op执行后的值,在静态图中,它是一个Tensor,而此时numpy是无法直接和这样的op进行运算的,于是可以用tf.py_func()函数很好的来解决这个问题.
tf.py_func()的作用主要是,帮助numpy构成一个静态图,tf.py_func这个函数可以接受Tensor, 然后在流图执行的时候在把上一个op中的值放入,numpy函数中(这里也可以是自定义的一些函数)
tf.py_func的用法
tf.py_func(op_defined_by_ourself, [op_Tensor_1,op_Tensor_2,op_Tensor_3], [tf.float32, tf.float32, tf.float32])
其中第一个参数是非tensorflow的内置函数,可以使numpy也可以是自定义函数等等。第二个参数是tensorflow中的前几个operation_Tensor并且把所有的operation放在列表当中, 第三个是经过自定义的op算出来的数据的形式,并且把它们全部放在一个list中,和前面的operation_Tensor相对应。
具体详情请参照链接:
https://blog.csdn.net/jiongnima/article/details/80555387
====================================================================================
今天要记录一个自己在用tf.py_func( )这个函数所放的错误:
之前在用tensorflow的时候,就发现用tf.py_func函数可以很好地结合numpy,拓展tensorflow函数的灵活性,很好啊,于是就写了这样一句代码:
import numpy as np
def load_npy(path):
content=np.load(path)
return content
label=tf.py_func(load_npy, [t_labelname].tf.double)
这样就可以把numpy.load()用到tensorflow的图节点上去,因为我用的数据使用.npy的形式存储的,所以要用到numpy.load( )这个函数去读取处理过得数据集,本来这很完美。
但是,不幸的是,在我把python,tensorflow重装了之后,突然报错了:
AttributeError: 'bytes' object has no attribute read
这个错误也就是说,在用load_npy()处理的时候,里面的path不再是str的格式,而是bytes的格式,可能是python的版本上升之后,他对于数据格式的界定更加清晰了,在用tf.py_func( )函数处理的时候,内部的函数的格式是bytes,那该怎么办呢?
于是我改进了代码:
import numpy as np
def load_npy(path):
path=path.decode("utf-8")
content=np.load(path)
return content
label=tf.py_func(load_npy, [t_labelname],tf.double)
也就是在外部函数里面,加入把path的格式由bytes转换为str的代码,这样就可以正常读取数据了。