Тензорный поток модели генератора

#python #tensorflow #keras

#питон #тензорный поток #keras

Вопрос:

Я пытаюсь использовать этот код для создания функции генератора , он работает с shape =(256,256,3), Но я пытаюсь использовать его с shape=(112,112,3), но он выдает эту ошибку

Ошибка:

 A Concatenate layer requires inputs with matching shapes except for the concatenation axis.  Received: input_shape=[(None, 2, 2, 512), (None, 1, 1, 512)]  

Вот код

 def Generator():  inputs = tf.keras.layers.Input(shape=[112, 112, 3])   down_stack = [  downsample(64, 4, apply_batchnorm=False), # (batch_size, 128, 128, 64)  downsample(128, 4), # (batch_size, 64, 64, 128)  downsample(256, 4), # (batch_size, 32, 32, 256)  downsample(512, 4), # (batch_size, 16, 16, 512)  downsample(512, 4), # (batch_size, 8, 8, 512)  downsample(512, 4), # (batch_size, 4, 4, 512)  downsample(512, 4), # (batch_size, 2, 2, 512)  downsample(512, 4), # (batch_size, 1, 1, 512)  ]   up_stack = [  upsample(512, 4, apply_dropout=True), # (batch_size, 2, 2, 1024)  upsample(512, 4, apply_dropout=True), # (batch_size, 4, 4, 1024)  upsample(512, 4, apply_dropout=True), # (batch_size, 8, 8, 1024)  upsample(512, 4), # (batch_size, 16, 16, 1024)  upsample(256, 4), # (batch_size, 32, 32, 512)  upsample(128, 4), # (batch_size, 64, 64, 256)  upsample(64, 4), # (batch_size, 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') # (batch_size, 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)  print(x.shape,skip.shape)  x = tf.keras.layers.Concatenate()([x, skip])   x = last(x)   return tf.keras.Model(inputs=inputs, outputs=x)  

Ответ №1:

Проблема в том, что вы каждый раз уменьшаете выборку на 2 и увеличиваете на 2. Это означает, что входные данные должны быть кратны 2, поэтому работает форма ввода 256.

В вашем случае

112 / 2 = 56

56 / 2 = 28

28 / 2 = 14

14/2 = 7 # больше не делится на 2

уменьшение 7 на 2 даст вам форму 3. И когда вы увеличите размер 3 на 2, это даст вам 6, и вы не сможете объединить слой с фигурами 6 и 7.

Я предлагаю 2 варианта:

  1. используйте 128 вместо 112, если это возможно в вашем приложении, и удалите одну пару понижающей и повышающей дискретизации.
 inputs = tf.keras.layers.Input(shape=[128, 128, 3])   down_stack = [  downsample(64, 4, apply_batchnorm=False), # (batch_size, 128, 128, 64)  downsample(128, 4), # (batch_size, 64, 64, 128)  downsample(256, 4), # (batch_size, 32, 32, 256)  downsample(512, 4), # (batch_size, 16, 16, 512)  downsample(512, 4), # (batch_size, 8, 8, 512)  downsample(512, 4), # (batch_size, 4, 4, 512)  downsample(512, 4), # (batch_size, 2, 2, 512) # downsample(512, 4), # (batch_size, 1, 1, 512)  ]   up_stack = [ # upsample(512, 4, apply_dropout=True), # (batch_size, 2, 2, 1024)  upsample(512, 4, apply_dropout=True), # (batch_size, 4, 4, 1024)  upsample(512, 4, apply_dropout=True), # (batch_size, 8, 8, 1024)  upsample(512, 4), # (batch_size, 16, 16, 1024)  upsample(256, 4), # (batch_size, 32, 32, 512)  upsample(128, 4), # (batch_size, 64, 64, 256)  upsample(64, 4), # (batch_size, 128, 128, 128)  ]  
  1. Используйте 112, но прекратите понижающую дискретизацию до того, как входные данные перестанут делиться на 2
 inputs = tf.keras.layers.Input(shape=[112, 112, 3])   down_stack = [  downsample(64, 4, apply_batchnorm=False), # (batch_size, 128, 128, 64)  downsample(128, 4), # (batch_size, 64, 64, 128)  downsample(256, 4), # (batch_size, 32, 32, 256)  downsample(512, 4), # (batch_size, 16, 16, 512) # downsample(512, 4), # (batch_size, 8, 8, 512) # downsample(512, 4), # (batch_size, 4, 4, 512) # downsample(512, 4), # (batch_size, 2, 2, 512) # downsample(512, 4), # (batch_size, 1, 1, 512)  ]   up_stack = [ # upsample(512, 4, apply_dropout=True), # (batch_size, 2, 2, 1024) # upsample(512, 4, apply_dropout=True), # (batch_size, 4, 4, 1024) # upsample(512, 4, apply_dropout=True), # (batch_size, 8, 8, 1024) # upsample(512, 4), # (batch_size, 16, 16, 1024)  upsample(256, 4), # (batch_size, 32, 32, 512)  upsample(128, 4), # (batch_size, 64, 64, 256)  upsample(64, 4), # (batch_size, 128, 128, 128)  ]   

Комментарии:

1. Спасибо , ваш ответ действительно полезен @nick