Странная ошибка при преобразовании массива numpy в тензор из-за идентификатора тензора - PullRequest
2 голосов
/ 30 сентября 2019

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

1 Ответ

0 голосов
/ 04 октября 2019

Как я уже упоминал, должно быть что-то, связанное с 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

Итак, так как мы уже установили id для y2 равным x, чтобы он работалНо если y2 изменяет форму x, вы можете иметь tf.reducde_mean из (y2 - y1)! Это очень необычный способ сохранить идентификатор выходного тензора, но если вы знаете, как мы можем получить доступ к идентификатору тензора, я был бы очень благодарен. Вы можете проверить свой тензорный идентификатор, используя print ([y2]), например!

...