Вылазит ошибка разности форм тензоров после 100 шагов обучения нейросети
всю основу кода сети для сегментации объектов взял из интернета и захотел повторить ее, но на другом датасете исключительно с людьми. Но по ходу прогона выскакивает вот такая ошибка, причем появляется после запуска обучения, проходит где то 100 шагов одной эпохи из 120 и выдает такое. Из-за такого поведения я в целом не понимаю как может она возникать если 99 шагов до этого были пройдены отлично
Сама ошибка:
(0) INVALID_ARGUMENT: Cannot batch tensors with different shapes in component 0. First element had shape [256,256,3] and element 4 had shape [256,256,4].
[[{{node IteratorGetNext}}]]
[[gradient_tape/dice_bce_mc_loss/logistic_loss/mul/Shape_1/_10]]
(1) INVALID_ARGUMENT: Cannot batch tensors with different shapes in component 0. First element had shape [256,256,3] and element 4 had shape [256,256,4].
[[{{node IteratorGetNext}}]]
0 successful operations.
0 derived errors ignored. [Op:__inference_train_function_9322]
Слои и архитектура модели:
return tf.keras.layers.Input(shape=SAMPLE_SIZE + (3,))
def downsample_block(filters, size, batch_norm=True):
initializer = tf.keras.initializers.GlorotNormal()
result = tf.keras.Sequential()
result.add(
tf.keras.layers.Conv2D(filters, size, strides=2, padding='same',
kernel_initializer=initializer, use_bias=False))
if batch_norm:
result.add(tf.keras.layers.BatchNormalization())
result.add(tf.keras.layers.LeakyReLU())
return result
def upsample_block(filters, size, dropout=False):
initializer = tf.keras.initializers.GlorotNormal()
result = tf.keras.Sequential()
result.add(
tf.keras.layers.Conv2DTranspose(filters, size, strides=2, padding='same',
kernel_initializer=initializer, use_bias=False))
result.add(tf.keras.layers.BatchNormalization())
if dropout:
result.add(tf.keras.layers.Dropout(0.25))
result.add(tf.keras.layers.ReLU())
return result
def output_layer(size):
initializer = tf.keras.initializers.GlorotNormal()
return tf.keras.layers.Conv2DTranspose(CLASSES, size, strides=2, padding='same',
kernel_initializer=initializer, activation='sigmoid')
inp_layer = input_layer()
downsample_stack = [
downsample_block(64, 4, batch_norm=False),
downsample_block(128, 4),
downsample_block(256, 4),
downsample_block(512, 4),
downsample_block(512, 4),
downsample_block(512, 4),
downsample_block(512, 4),
]
upsample_stack = [
upsample_block(512, 4, dropout=True),
upsample_block(512, 4, dropout=True),
upsample_block(512, 4, dropout=True),
upsample_block(256, 4),
upsample_block(128, 4),
upsample_block(64, 4)
]
out_layer = output_layer(4)
# Реализуем skip connections
x = inp_layer
downsample_skips = []
for block in downsample_stack:
x = block(x)
downsample_skips.append(x)
downsample_skips = reversed(downsample_skips[:-1])
for up_block, down_block in zip(upsample_stack, downsample_skips):
x = up_block(x)
x = tf.keras.layers.Concatenate()([x, down_block])
out_layer = out_layer(x)
unet_like = tf.keras.Model(inputs=inp_layer, outputs=out_layer)
tf.keras.utils.plot_model(unet_like, show_shapes=True, dpi=72)
Ссылка на гугл колаб со всем проектом: Google Colab