首页 > 解决方案 > 由于张量 ID,将 numpy 数组转换为张量时出现奇怪的错误

问题描述

我编写了一个代码来合成一些人脸图像,并且我有一个自定义层,它的任务是提取 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。但这对我来说真的很奇怪!

标签: pythonnumpytensorflowkeras-layer

解决方案


正如我所提到的,肯定有一些与张量的 id 相关的东西。所以我以这种方式编辑了 my_func :

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

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


推荐阅读