Я пытаюсь изучить вложение для изображений Paris6k, сочетающих VGG и потеря триплета Адриана Унга . Проблема в том, что после небольшого количества итераций, в первую эпоху, потеря становится наном, а затем точность и точность проверки возрастают до 1.
Я уже пытался снизить скорость обучения, увеличивая размер пакета (только до 16 из-за объема памяти), изменение оптимизатора (Adam и RMSprop), проверка наличия в моем наборе данных значений None, изменение формата данных с «float32» на «float64», добавление к ним небольшого смещения и упрощение модель.
Вот мой код:
base_model = VGG16(include_top = False, input_shape = (512, 384, 3))
input_images = base_model.input
input_labels = Input(shape=(1,), name='input_label')
embeddings = Flatten()(base_model.output)
labels_plus_embeddings = concatenate([input_labels, embeddings])
model = Model(inputs=[input_images, input_labels], outputs=labels_plus_embeddings)
batch_size = 16
epochs = 2
embedding_size = 64
opt = Adam(lr=0.0001)
model.compile(loss=tl.triplet_loss_adapted_from_tf, optimizer=opt, metrics=['accuracy'])
label_list = np.vstack(label_list)
x_train = image_list[:2500]
x_val = image_list[2500:]
y_train = label_list[:2500]
y_val = label_list[2500:]
dummy_gt_train = np.zeros((len(x_train), embedding_size + 1))
dummy_gt_val = np.zeros((len(x_val), embedding_size + 1))
H = model.fit(
x=[x_train,y_train],
y=dummy_gt_train,
batch_size=batch_size,
epochs=epochs,
validation_data=([x_val, y_val], dummy_gt_val),callbacks=callbacks_list)
Изображения 3366 со значениями, масштабированными в диапазоне [0, 1]. Сеть принимает фиктивные значения, потому что она пытается изучить вложения из изображений таким образом, чтобы изображения одного и того же класса имели небольшое расстояние, в то время как изображения разных классов должны иметь большие расстояния, а реальный класс является частью обучения.
Я заметил, что ранее делал неправильное деление классов (и сохранял изображения, которые должны быть отброшены), и у меня не было проблемы с потерями в нан.
Что я должен попытаться сделать?
Заранее спасибо и извините за мой английский sh.