tf.py_func函数用来扩展tensorflow的灵活性

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的代码,这样就可以正常读取数据了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值