假设我有一个插值函数。
def mymap():
x = np.arange(256)
y = np.random.rand(x.size)*255.0
return interp1d(x, y)
这家伙将[0,255]中的数字映射到x
和y
给出的配置文件后面的数字(现在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)
如何在张量中映射每个数字?有人可以帮忙吗?
答案 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
内部功能。