Я пытаюсь создать вложения изображений с целью глубокого ранжирования, используя функцию потери триплета. Идея состоит в том, что мы можем взять предварительно обученный CNN (например, resnet50 или vgg16), удалить слои F C и добавить функцию нормализации L2 для извлечения единичных векторов, которые затем можно сравнивать с помощью расстояния metri c (например, косинусное сходство ). Насколько я понимаю, предсказанные векторы, которые приходят из предварительно обученного CNN, не оптимальны, но являются хорошим началом. Добавив функцию потери триплета, мы можем переобучить сеть, чтобы похожие картинки были «близко» друг к другу, а разные картинки - «далеко» друг от друга в пространстве признаков. Вдохновленный этим ноутбуком , я попытался настроить следующий код, но получаю ошибку ValueError: The name "conv1_pad" is used 3 times in the model. All layer names should be unique.
.
# Anchor, Positive and Negative are numpy arrays of size (200, 256, 256, 3), same for the test images
pic_size=256
def shared_dnn(inp):
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(3, pic_size, pic_size),
input_tensor=inp)
x = base_model.output
x = Flatten()(x)
x = Lambda(lambda x: K.l2_normalize(x,axis=1))(x)
for layer in base_model.layers[15:]:
layer.trainable = False
return x
anchor_input = Input((3, pic_size,pic_size ), name='anchor_input')
positive_input = Input((3, pic_size,pic_size ), name='positive_input')
negative_input = Input((3, pic_size,pic_size ), name='negative_input')
encoded_anchor = shared_dnn(anchor_input)
encoded_positive = shared_dnn(positive_input)
encoded_negative = shared_dnn(negative_input)
merged_vector = concatenate([encoded_anchor, encoded_positive, encoded_negative], axis=-1, name='merged_layer')
model = Model(inputs=[anchor_input,positive_input, negative_input], outputs=merged_vector)
#ValueError: The name "conv1_pad" is used 3 times in the model. All layer names should be unique.
model.compile(loss=triplet_loss, optimizer=adam_optim)
model.fit([Anchor,Positive,Negative],
y=Y_dummy,
validation_data=([Anchor_test,Positive_test,Negative_test],Y_dummy2), batch_size=512, epochs=500)
Я новичок в keras, и я не совсем уверен, как решить эту проблему. Автор в ссылке выше создает свой собственный CNN с нуля, но я хотел бы построить его на re snet (или vgg16). Как настроить ResNet50
на использование функции потери триплета (по ссылке выше вы также найдете исходный код функции потери триплета).