python - 由于张量 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。但这对我来说真的很奇怪!
解决方案
正如我所提到的,肯定有一些与张量的 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!
推荐阅读
- c# - WinForms:动态添加/删除AnchorStyles到/控制
- javascript - 负货币格式的正则表达式 - 2 个小数位 & 可以为负数
- amazon-web-services - 从 S3 存储桶文件填充 Redshift 中的外部模式表
- html - 我们可以在复选框的 [checked] 属性上使用方法将其设置为 true/false
- html - Flex 元素不起作用。我怎样才能修复我的代码来解决这个问题?
- neo4j - neo4j 图算法中的定性搜索
- javascript - 如何加载预选类别选项的页面
- java - 有没有办法用java复制/复制excel文件?
- ios - Swift - 检索数据后显示 UICollectionView
- python - 从字典的键和值中删除字符?