#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: Мне пришлось поставить ссылку, потому что переполнение стека пока не позволяет мне публиковать фотографии из-за отсутствия высокой репутации (я никогда не публиковал на этом сайте).