由于张量ID将numpy数组转换为张量时出现奇怪的错误

时间:2019-09-29 21:03:25

标签: python numpy tensorflow keras-layer id

我写了一段代码来合成一些人脸图像,并且我有一个自定义层,其任务是提取FaceNet嵌入,因此我可以在损失函数中除了图像本身之外使用这些嵌入,但是会出现此错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: transpose expects a vector of size 0. But input(1) is a vector of size 4
     [[{{node training/Adam/gradients/conv2d/Conv2D_grad/Conv2DBackpropInput-2-TransposeNHWCToNCHW-LayoutOptimizer}}]]

为简单起见,让我们以仅返回其输入的方式来定义我的自定义层:

class my_layer(Layer):

  def __init__(self, **kwargs):
    super(my_layer, self).__init__(**kwargs)

  def call(self, x):
    y = tf.py_function(my_func,[x], Tout = tf.float32)
    y.set_shape((None, 160, 160, 3))
    return y

def my_func(x):
    y1 =x
    x = x.numpy()
    y2 = tf.convert_to_tensor(x, dtype=tf.float32)
    return y2

如果我返回y2,我将得到相同的错误,但是如果我返回y1,一切都会好起来的。真的很奇怪,如果返回输入张量没有错误,但是如果将其转换为numpy数组然后将其转换回张量,则会抛出此错误。我估计将输入张量转换为数组时会丢失某些内容。我检查了输入张量的id并创建了张量y2。他们是不同的。也许是因为这个原因,但我不知道如何更改张量的id。但这对我来说真的很奇怪!

1 个答案:

答案 0 :(得分:0)

正如我提到的,必须与张量的id有关。所以我以这种方式编辑了my_func:

go tool pprof

因此,因为我们已经将y2的id设置为x的相同,所以它起作用了。但是,如果y2修改x的形状,则可以具有(y2-y1)的tf.reducde_mean!这是保持输出张量的id的一种非常不寻常的方法,但是如果您知道我们如何访问张量id,我将非常感激。例如,您可以使用print([y2])检查张量ID!