Странное поведение потерь при использовании пользовательского генератора (img, csv)

#python #tensorflow #keras #loss-function #loss

#питон #тензорный поток #keras #функция потери #потеря

Вопрос:

Я работаю над задачей RNSA, которая заключается в прогнозировании зависимости от рентгеновского сканирования детей в возрасте от 1 до 19 лет. Нам также указан пол для каждого ребенка, поэтому я хотел включить его в модель. Изображение подается через InceptionV3, затем выходные данные объединяются (после максимального объединения) с информацией о поле (которая вставляется в виде массива всех 1 (мальчики) или всех 0 (девочки) с размером, выбранным пользователем). Поэтому модель принимает (изображение, пол) в качестве входных данных. Для этого я использую следующий генератор:

 def myCustomGen(data_gen = None,dff = None,train = True,batch_size=None,img_size=None,embeddings=32):
      flow = train_data_gen.flow_from_dataframe(
                                      dataframe=dff,
                                      # directory = 'train-dataset/boneage-training-dataset',
                                      directory = '/content/train-dataset-compress/boneage-training-dataset',
                                      x_col = 'id',
                                      y_col = 'boneage',
                                      batch_size=BATCH_SIZE,
                                      shuffle=True,
                                      class_mode='raw',
                                      target_size=(IMG_SIZE,IMG_SIZE),
                                      color_mode = 'grayscale',
                                    )

    for x, y in flow:
        indices, filenames = get_indices_from_keras_generator(flow,batch_size)
        genders = reduce(pd.DataFrame.append, map(lambda i: dff[dff.id == i], filenames)).gender_01.values
        genders = create_embeddings2(genders,embedding) #this just creates an array of 0s or 1s with embedding dimension

        if len(x) != len(genders):
          yield [x,genders[-len(y):]],y
        else:
          yield [x,genders],y
 

Где функция get_indices_from_keras_generator() служит для получения идентификаторов из неупорядоченных пакетов, которые используются для извлечения из каждого пакета пол:

 def get_indices_from_keras_generator(gen, batch_size):
    idx_left = (gen.batch_index - 1) * batch_size
    idx_right = idx_left   gen.batch_size if idx_left >= 0 else None
    indices = gen.index_array[idx_left:idx_right]
    filenames = [gen.filenames[i] for i in indices]
    return indices, filenames
 

Теперь вот в чем дело: потери уменьшаются (как в обучающем, так и в проверочном наборе), но у них есть странная закономерность: в начале каждой эпохи потери немного увеличиваются, а затем после нескольких итераций в ту же эпоху они снова уменьшаются, чтобы завершить эпоху на более низкое значение, с которого оно начиналось (как правило). Вот сюжет только для того, чтобы указать на это пилообразное поведение:
схема потерь
Пожалуйста, обратите внимание, что приведенный выше график не является фактическим убытком, а просто для того, чтобы читатель понял тенденцию потерь для каждой эпохи.
Почему это происходит? Ожидается ли это? Если это необычно, может ли это быть вызвано какой-то неправильной перетасовкой обучающих данных? (Хотя, что касается этого последнего пункта, перетасовка должна работать нормально, поскольку я использую keras shuffle по умолчанию в flow_from_dataframe).
Любая помощь будет высоко оценена. Если вы считаете, что генератор работает неправильно, пожалуйста, предложите мне лучший вариант.

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

1. Я НЕ понимаю последний абзац, можете ли вы опубликовать график?

2. Здравствуйте, я добавил сюжет, надеюсь, теперь он более понятен! Ps: Мне пришлось поставить ссылку, потому что переполнение стека пока не позволяет мне публиковать фотографии из-за отсутствия высокой репутации (я никогда не публиковал на этом сайте).