如何在Tensorflow

时间:2016-07-15 22:17:37

标签: python tensorflow

假设我有一个插值函数。

def mymap():
    x = np.arange(256)
    y = np.random.rand(x.size)*255.0
    return interp1d(x, y)

这家伙将[0,255]中的数字映射到xy给出的配置文件后面的数字(现在y是随机的)。当我执行以下操作时,图像中的每个值都会很好地映射。

x = imread('...')
x_ = mymap()(x)

但是,如何在Tensorflow中执行此操作?我想做像

这样的事情
img = tf.placeholder(tf.float32, [64, 64, 1], name="img")
distorted_image = tf.map_fn(mymap(), img)

但是导致错误说

  

ValueError:使用序列设置数组元素。

有关信息,我检查了功能图是否简单如下,它运作良好

mymap2 = lambda x: x+10
distorted_image = tf.map_fn(mymap2, img)

如何在张量中映射每个数字?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

tf.map_fn的函数输入需要是用Tensorflow操作编写的函数。例如,这个将起作用:

def this_will_work(x):
    return tf.square(x)

img = tf.placeholder(tf.float32, [64, 64, 1])
res = tf.map_fn(this_will_work, img)

这个不起作用:

def this_will_not_work(x):
    return np.sinh(x)

img = tf.placeholder(tf.float32, [64, 64, 1])
res = tf.map_fn(this_will_not_work, img)

因为np.sinh 无法应用到TensorFlow张量(np.sinh(tf.constant(1))会返回错误)。

解决方案

您可以在TensorFlow中编写插值函数,也可以在另一个StackOverflow问题中寻求帮助。

如果您绝对想要使用scipy.interpolate.interp1d,则需要将代码保存在python中。为此,您可以使用tf.py_func,并使用您的scipy  内部功能。