Я написал код для синтеза некоторых изображений лица, и у меня есть специальный слой, задача которого - извлечь вложения 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, все будетбудь умницей. Это действительно странно, что если вы возвращаете входной тензор, ошибки не возникает, но если вы преобразуете его в массив с нулевыми значениями, а затем конвертируете его обратно в тензор, это выдает мне эту ошибку. Я думаю, что-то будет пропущено, когда я преобразую входной тензор в массив. Я проверил id входного тензора и создал тензор y2. Они были разные. Может быть, это из-за этого, но я не знаю, как изменить идентификатор тензора. Но мне это кажется странным!