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