Python 由于张量id,将numpy数组转换为张量时出现奇怪错误
我编写了一个代码来合成一些人脸图像,我有一个自定义层,它的任务是提取FaceNet嵌入,这样我可以在丢失函数中除了图像本身之外使用这些嵌入,但我得到了以下错误:Python 由于张量id,将numpy数组转换为张量时出现奇怪错误,python,numpy,tensorflow,keras-layer,Python,Numpy,Tensorflow,Keras Layer,我编写了一个代码来合成一些人脸图像,我有一个自定义层,它的任务是提取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/gradie
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。但这对我来说真的很奇怪 正如我提到的,一定有一些东西与张量的id有关。所以我用这种方式编辑了我的函数:
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相同的id,所以它工作了。但是如果y2修改了x的形状,你可以得到(y2-y1)的tf.reducede_平均值!这是保存输出张量id的一种非常不寻常的方法,但是如果您知道如何访问张量id,我将非常感激。例如,您可以使用print([y2])检查您的张量id