Как справиться с серьезным переоснащением в CNN кодировщика / декодера UNet в задаче, очень похожей на перевод изображений?

Я пытаюсь приспособить UNet CNN к задаче, очень похожей на перевод изображения в изображение. Входом в сеть является двоичная матрица размером (64,256), а на выходе - размером (64,32). Столбцы представляют состояние канала связи, где каждая запись в столбце представляет собой состояние подканала. 1 означает, что подканал занят, а 0 означает, что подканал свободен. Горизонтальная ось представляет течение времени. Итак, первый столбец - это статус канала во временном интервале 1, а второй столбец - это статус во временном интервале и так далее. Задача состоит в том, чтобы предсказать состояние канала в следующих 32 временных интервалах с учетом предыдущих 256 временных интервалов, которые я рассматривал как преобразование изображения в изображение. Точность обучающих данных составляет около 90%, а точность теста - около 50%. По точности здесьЯ имею в виду средний процент правильных записей на каждом изображении. Кроме того, во время обучения потери проверки возрастают, а потери уменьшаются, что является явным признаком переобучения. Я попробовал большинство методов регуляризации, а также попытался уменьшить емкость модели, но это только уменьшило ошибку обучения, но не улучшило ошибку обобщения. Есть совет или идеи? В следующей части я включил кривую обучения для обучения на 1000 выборок, реализацию сети и выборки из обучающего и тестового наборов.Я попробовал большинство методов регуляризации, а также попытался уменьшить емкость модели, но это только уменьшило ошибку обучения, но не улучшило ошибку обобщения. Есть совет или идеи? В следующей части я включил кривую обучения для обучения на 1000 выборок, реализацию сети и выборки из обучающего и тестового наборов.Я попробовал большинство методов регуляризации, а также попытался уменьшить емкость модели, но это только уменьшило ошибку обучения, но не улучшило ошибку обобщения. Есть совет или идеи? В следующей части я включил кривую обучения для обучения на 1000 выборок, реализацию сети и выборки из обучающего и тестового наборов.

Обучающие кривые обучения на 1000 выборках

3 образца из обучающей выборки

3 образца из набора для испытаний

Вот реализация сети:

def define_encoder_block(layer_in, n_filters, batchnorm=True):
    # weight initialization
    init = RandomNormal(stddev=0.02)
    # add downsampling layer
    g = Conv2D(n_filters, (4,4), strides=(2,2), padding='same',
               kernel_initializer=init)(layer_in)
    # conditionally add batch normalization
    if batchnorm:
        g = BatchNormalization()(g, training=True)
    # leaky relu activation
    g = LeakyReLU(alpha=0.2)(g)
    return g
 
# define a decoder block
def decoder_block(layer_in, skip_in, n_filters, filter_strides, dropout=True, skip=True):
  # weight initialization
  init = RandomNormal(stddev=0.02)
    # add upsampling layer
  g = Conv2DTranspose(n_filters, (4,4), strides=filter_strides, padding='same', 
                         kernel_initializer=init)(layer_in)
    # add batch normalization
  g = BatchNormalization()(g, training=True)
    # conditionally add dropout
  if dropout:
    g = Dropout(0.5)(g, training=True)
  if skip:
    g = Concatenate()([g, skip_in])
    # relu activation
  g = Activation('relu')(g)
  return g
 
# define the standalone generator model
def define_generator(image_shape=(64,256,1)):
    # weight initialization
    init = RandomNormal(stddev=0.02)
    # image input
    in_image = Input(shape=image_shape)
    e1 = define_encoder_block(in_image, 64, batchnorm=False)
    e2 = define_encoder_block(e1, 128)
    e3 = define_encoder_block(e2, 256)
    e4 = define_encoder_block(e3, 512)
    e5 = define_encoder_block(e4, 512)
    e6 = define_encoder_block(e5, 512)
    e7 = define_encoder_block(e6, 512)
    # bottleneck, no batch norm and relu
    b = Conv2D(512, (4,4), strides=(2,2), padding='same', kernel_initializer=init)(e7)
    b = Activation('relu')(b)
    # decoder model
    d1 = decoder_block(b, e7, 512, (1,2))
    d2 = decoder_block(d1, e6, 512, (1,2))
    d3 = decoder_block(d2, e5, 512, (2,2))
    d4 = decoder_block(d3, e4, 512, (2,2), dropout=False)
    d5 = decoder_block(d4, e3, 256, (2,2), dropout=False)
    d6 = decoder_block(d5, e2, 128, (2,1), dropout=False, skip= False)
    d7 = decoder_block(d6, e1, 64, (2,1), dropout=False,  skip= False)
    # output
    g = Conv2DTranspose(1, (4,4), strides=(2,1), padding='same', kernel_initializer=init)(d7)
    out_image = Activation('sigmoid')(g)
    # define model
    model = Model(in_image, out_image)
    return model

0 ответов

Другие вопросы по тегам