#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 варианта:
- используйте 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) ]
- Используйте 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