簡體   English   中英

如何在訓練連體網絡后生成測試三元組數據集的預測

[英]How to generate predictions on testing triplets dataset after training Siamese network

我有一個圖像數據集和兩個 txt 文件,其中每一行包含三張圖片的 id,第一張用於訓練,並告訴我第一張圖片與第二張圖片最相似,而不是第三張圖片。 第二個用於測試:我必須預測第一張圖像是否與每行的第一張或第二張最相似。 為此,我使用本文的指導方針訓練了一個利用三元組損失的連體網絡: https ://keras.io/examples/vision/siamese_network/

訓練網絡后,我不知道如何繼續評估我的測試數據集,准備我所做的數據:

with open('test_triplets.txt') as f:
    lines2 = f.readlines()
lines2 = [line.split('\n', 1)[0] for line in lines2]
anchor2 = [line.split()[0] for line in lines2]
pic1 = [line.split()[1] for line in lines2]
pic2  = [line.split()[2] for line in lines2]

anchor2 = ['food/' + item + '.jpg' for item in anchor2]
pic1 = ['food/' + item + '.jpg' for item in pic1]
pic2 = ['food/' + item + '.jpg' for item in pic2]

anchor2_dataset = tf.data.Dataset.from_tensor_slices(anchor2)
pic1_dataset = tf.data.Dataset.from_tensor_slices(pic1)
pic2_dataset = tf.data.Dataset.from_tensor_slices(pic2)

test_dataset = tf.data.Dataset.zip((anchor2_dataset, pic1_dataset, pic2_dataset))
test_dataset = test_dataset.map(preprocess_triplets)
test_dataset = test_dataset.batch(32, drop_remainder=False)
test_dataset = test_dataset.prefetch(8)

然后我嘗試如下使用 for 循環,但運行時間太長,因為我在 txt 文件中有大約 50000 行。

n_images = len(anchor2)
results  = np.zeros((n_images,2))
for i in range(n_images):
    sample = next(iter(test_dataset))
    anchor, positive, negative = sample
    anchor_embedding, positive_embedding, negative_embedding = (
        embedding(resnet.preprocess_input(anchor)),
        embedding(resnet.preprocess_input(positive)),
        embedding(resnet.preprocess_input(negative)),
    )
    cosine_similarity = metrics.CosineSimilarity()

    positive_similarity = cosine_similarity(anchor_embedding, positive_embedding)
    results[i,0] = positive_similarity.numpy()

    negative_similarity = cosine_similarity(anchor_embedding, negative_embedding)
    results[i,1] = negative_similarity.numpy()

我該如何做才能對我的測試三胞胎產生預測? 我的目標是有一個向量 [n_testing_triplets x 1] 如果第一張圖片與錨點最相似,則每行為 1,否則為 0。

您可以先堆疊圖像,然后像這樣並行計算所有嵌入

import numpy as np
stack = np.stack([anchor0, positive0, negative0, ..., anchor999, positive999, negative999])

# then you calculate all embeding at the same time like this 
embeddings = list(embedding(resnet.preprocess_input(stack)).numpy())

然后,您可以在循環中根據需要比較嵌入:

cosine_similarity = metrics.CosineSimilarity()

positive_similarity = cosine_similarity(embeddings [0] , embeddings [1])
whatever_storage = positive_similarity.numpy()

negative_similarity = cosine_similarity(embeddings [0] , embeddings [2])
whatever_storage  = negative_similarity.numpy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM