Размеры входов должны соответствовать тензорным циклам - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь построить цикл GAN, используя Tensorflow, похожий на этот учебник , который опирается на код из Pix2Pix учебник .

Я получаю следующее сообщение об ошибке:

WARNING:tensorflow:Model was constructed with shape Tensor("input_1:0", shape=(None, 256, 256, 3), dtype=float32) for input (None, 256, 256, 3), but it was re-called on a Tensor with incompatible shape (1, 1024, 730, 3).

Traceback (most recent call last):
  File "/Users/skyler/Desktop/catcrop/trainer.py", line 246, in <module>
    gen_output = generator(inp[None])
  File "/Users/skyler/Desktop/catcrop/environment/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 822, in __call__
    outputs = self.call(cast_inputs, *args, **kwargs)

  ...

  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError: ConcatOp : Dimensions of inputs should match: shape[0] = [1,32,24,512] vs. shape[1] = [1,32,23,512] [Op:ConcatV2] name: concat

Когда я запускаю генератор с разными файлами, я получаю разные числа для значений формы, но 3-е значение всегда отключено на 1. Я видел другие потоки StackOverflow, показывающие формы с двумя задержаниями, но я не могу понять, что означают эти четыре задержания.

Вот генератор (взятый непосредственно из учебника):

def Generator():
  inputs = tf.keras.layers.Input(shape=[256,256,3])
  down_stack = [
    downsample(64, 4, apply_batchnorm=False),   # (bs, 128, 128, 64)
    downsample(128, 4), # (bs, 64, 64, 128)
    downsample(256, 4), # (bs, 32, 32, 256)
    downsample(512, 4), # (bs, 16, 16, 512)
    downsample(512, 4), # (bs, 8, 8, 512)
    downsample(512, 4), # (bs, 4, 4, 512)
    downsample(512, 4), # (bs, 2, 2, 512)
    downsample(512, 4), # (bs, 1, 1, 512)
  ]

  up_stack = [
    upsample(512, 4, apply_dropout=True),   # (bs, 2, 2, 1024)
    upsample(512, 4, apply_dropout=True),   # (bs, 4, 4, 1024)
    upsample(512, 4, apply_dropout=True),   # (bs, 8, 8, 1024)
    upsample(512, 4),   # (bs, 16, 16, 1024)
    upsample(256, 4),   # (bs, 32, 32, 512)
    upsample(128, 4),   # (bs, 64, 64, 256)
    upsample(64, 4),    # (bs, 128, 128, 128)
  ]

  initializer = tf.random_normal_initializer(0., 0.02)
  last = tf.keras.layers.Conv2DTranspose(OUTPUT_CHANNELS, 4,
                                         strides=2,
                                         padding='same',
                                         kernel_initializer=initializer,
                                         activation='tanh') # (bs, 256, 256, 3)

  x = inputs

  # Downsampling through the model
  skips = []
  for down in down_stack:
    x = down(x)
    skips.append(x)

  skips = reversed(skips[:-1])

  # Upsampling and establishing the skip connections
  for up, skip in zip(up_stack, skips):
    x = up(x)
    x = tf.keras.layers.Concatenate()([x, skip])

  x = last(x)

  return tf.keras.Model(inputs=inputs, outputs=x)

Вот строка, вызывающая его (строка 246):

gen_output = generator(inp[None])

inp [Нет] - тензор с формой (1, x, y, 3). x и y изменяются в зависимости от того, какое изображение выбрано.

def load(image_file):
    image = tf.io.read_file(image_file)
    image = tf.image.decode_jpeg(image)

    w = tf.shape(image)[1]

    w = w // 2
    real_image = image[:, :w, :]
    input_image = image[:, w:, :]

    input_image = tf.cast(input_image, tf.float32)
    real_image = tf.cast(real_image, tf.float32)

    return input_image, real_image


inp, re = load(PATH+'train/{}.jpg'.format(random.randint(0,100)))

Кто-нибудь имеет представление о том, как редактировать эти ограничения, или, по крайней мере, что они означают? К сожалению, учебники по тензорному потоку не очень хорошо объясняют, что делает каждая строка. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...