成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖像相似度估計 | 結合三元組損失的暹羅網絡

人工智能 機器學習
在本文中我們將探索如何構建和訓練暹羅網絡以估計圖像相似度,并通過一個來自GitHub倉庫的實際示例進行說明。

在機器學習領域,確定圖像之間的相似度在各種應用中至關重要,從檢測重復項到面部識別。解決這個問題的一個強大方法是使用暹羅網絡結合三元組損失函數。在本文中,我們將探索如何構建和訓練暹羅網絡以估計圖像相似度,并通過一個來自GitHub倉庫的實際示例進行說明。

什么是暹羅網絡?

暹羅網絡是一種包含兩個或更多相同子網絡的神經網絡架構。這些子網絡旨在為每個輸入生成特征向量,然后可以比較這些向量以估計相似度。關鍵思想是使用相同的網絡處理每個輸入,確保輸出一致且可比較。

這種架構特別適合于檢測重復項、尋找異常和面部識別等任務。在我們將要探索的實現中,網絡設置有三個相同的子網絡。每個網絡處理三張圖像中的一張:錨點圖像、正樣本(與錨點相似)和負樣本(與錨點無關)。

什么是三元組損失?

為了有效地訓練暹羅網絡,我們使用三元組損失函數。這種損失函數鼓勵網絡在特征空間中拉近錨點和正樣本的距離,同時將錨點和負樣本推得更遠。損失函數定義如下:

L(A, P, N) = max(‖f(A) — f(P)‖2 — ‖f(A) — f(N)‖2 + margin, 0)

這里,A是錨點圖像,P是正圖像,N是負圖像。函數f(x)代表網絡生成的embedding,而margin是一個小的正值,有助于確保網絡不會將所有嵌入壓縮到同一點。

設置暹羅網絡

在這次實現中,我們首先加載Totally Looks Like數據集,其中包含我們用來創建訓練網絡的三元組圖像。

1. 數據準備

使用TensorFlow的tf.data API處理數據集以創建圖像三元組。這涉及到設置一個數據管道,其中每個三元組由錨點、正樣本和負樣本圖像組成。通過調整圖像大小到目標形狀并歸一化像素值來預處理圖像。

def preprocess_image(filename):
    image_string = tf.io.read_file(filename)
    image = tf.image.decode_jpeg(image_string, channels=3)
    image = tf.image.convert_image_dtype(image, tf.float32)
    image = tf.image.resize(image, target_shape)
    return image

def preprocess_triplets(anchor, positive, negative):
    return (
        preprocess_image(anchor),
        preprocess_image(positive),
        preprocess_image(negative),
    )

以下是從數據集中生成的三元組示例,每行的前兩張圖像相似(錨點和正樣本),第三張不同(負樣本):

圖1:在數據準備期間生成的三元組。每行的前兩張圖像相似(錨點和正樣本),第三張不同(負樣本)

2.構建 embedding 生成器

我們暹羅網絡的核心是嵌入生成器,它使用在ImageNet上預訓練的ResNet50模型構建。通過凍結ResNet50中的大部分層的權重,并且僅微調最后幾層,我們可以利用遷移學習來減少訓練時間并提高性能。

base_cnn = resnet.ResNet50(
    weights="imagenet", input_shape=target_shape + (3,), include_top=False
)

flatten = layers.Flatten()(base_cnn.output)
dense1 = layers.Dense(512, activation="relu")(flatten)
dense1 = layers.BatchNormalization()(dense1)
dense2 = layers.Dense(256, activation="relu")(dense1)
dense2 = layers.BatchNormalization()(dense2)
output = layers.Dense(256)(dense2)

embedding = Model(base_cnn.input, output, name="Embedding")

# Freeze all layers until the layer conv5_block1_out
trainable = False
for layer in base_cnn.layers:
    if layer.name == "conv5_block1_out":
        trainable = True
    layer.trainable = trainable

3.構建暹羅網絡

暹羅網絡設置為一次輸入三張圖像(錨點、正樣本和負樣本)。自定義的DistanceLayer計算錨點-正樣本對和錨點-負樣本對之間的距離。然后訓練模型以最小化相似圖像之間的距離,并最大化不相似圖像之間的距離。

class DistanceLayer(layers.Layer):
    def call(self, anchor, positive, negative):
        ap_distance = tf.reduce_sum(tf.square(anchor - positive), -1)
        an_distance = tf.reduce_sum(tf.square(anchor - negative), -1)
        return (ap_distance, an_distance)

anchor_input = layers.Input(name="anchor", shape=target_shape + (3,))
positive_input = layers.Input(name="positive", shape=target_shape + (3,))
negative_input = layers.Input(name="negative", shape=target_shape + (3,))

distances = DistanceLayer()(
    embedding(resnet.preprocess_input(anchor_input)),
    embedding(resnet.preprocess_input(positive_input)),
    embedding(resnet.preprocess_input(negative_input)),
)

siamese_network = Model(
    inputs=[anchor_input, positive_input, negative_input], outputs=distances
)

4.訓練和評估

模型使用自定義訓練循環進行訓練,其中計算三元組損失并用于更新網絡的權重。仔細監控訓練過程,并通過對學習到的嵌入進行檢查來評估模型的性能。

class SiameseModel(Model):
    def __init__(self, siamese_network, margin=0.5):
        super(SiameseModel, self).__init__()
        self.siamese_network = siamese_network
        self.margin = margin
        self.loss_tracker = metrics.Mean(name="loss")

    def train_step(self, data):
        with tf.GradientTape() as tape:
            loss = self._compute_loss(data)
        gradients = tape.gradient(loss, self.siamese_network.trainable_weights)
        self.optimizer.apply_gradients(
            zip(gradients, self.siamese_network.trainable_weights)
        )
        self.loss_tracker.update_state(loss)
        return {"loss": self.loss_tracker.result()}

    def _compute_loss(self, data):
        ap_distance, an_distance = self.siamese_network(data)
        loss = ap_distance - an_distance
        loss = tf.maximum(loss + self.margin, 0.0)
        return loss

5.檢查結果

訓練完成后,我們可以通過比較錨點-正樣本對和錨點-負樣本對的嵌入之間的余弦相似度來評估網絡學習分離相似和不相似圖像的能力。

cosine_similarity = metrics.CosineSimilarity()

positive_similarity = cosine_similarity(anchor_embedding, positive_embedding)
print("Positive similarity:", positive_similarity.numpy())

negative_similarity = cosine_similarity(anchor_embedding, negative_embedding)
print("Negative similarity:", negative_similarity.numpy())

以下是經過訓練的模型評估的三元組示例。網絡成功識別出圖像之間的相似性和差異:

圖2:經過訓練的暹羅網絡的輸出,其中每行的前兩張圖像被模型識別為相似,第三張為不同

結論

本文展示了使用三元組損失的暹羅網絡如何有效地估計圖像相似度。通過使用預訓練的ResNet50模型并微調其層,我們可以創建一個可以應用于需要相似度估計的各種任務。

完整代碼和解釋,參考:https://github.com/elcaiseri/Siamese-Network

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2023-12-10 15:15:18

開源模型工具

2024-06-24 13:06:04

2024-04-02 10:05:28

Siamese神經網絡人工智能

2020-10-14 10:18:05

Python三元表達式代碼

2023-11-21 16:06:04

計算機視覺人工智能

2021-10-19 10:09:21

三角形個數數組

2023-11-30 08:30:12

Python三元表達

2023-09-06 09:40:29

2025-05-06 09:41:06

2015-10-15 10:27:12

文本相似度判定

2018-10-08 08:00:00

前端ReactJavaScript

2023-09-07 08:05:32

三元表達式自動

2009-08-19 17:26:28

C# 操作符

2025-03-11 11:40:00

三元運算符代碼JavaScript

2016-01-12 17:21:54

金稅工程曙光

2017-07-28 11:31:20

交通三要素高德平臺

2025-06-13 01:33:00

2009-05-19 09:57:16

次貸危機運維管理摩卡軟件

2025-01-14 13:51:44

2013-01-10 15:21:09

三元食品辦公自動化IBM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天久久 | aaa精品| 精品日韩一区二区 | 亚洲精品中文在线观看 | 久久91精品久久久久久9鸭 | 久久久爽爽爽美女图片 | 欧美精品一区在线 | 一级毛片免费看 | 亚洲在线免费观看 | 亚洲国产日韩一区 | 天堂久久天堂综合色 | 欧美一级片在线观看 | 一区二区国产在线 | 91成人在线视频 | 99久久久国产精品免费消防器 | 久久久噜噜噜久久中文字幕色伊伊 | 手机在线一区二区三区 | av免费网址 | 91福利在线导航 | 日韩毛片中文字幕 | 99国产在线| 91se在线 | 中文字幕一页二页 | 午夜欧美一区二区三区在线播放 | 在线中文字幕日韩 | 在线91 | 欧美日韩不卡合集视频 | 奇米av| 亚洲精品一区二区三区 | 本道综合精品 | 欧美综合一区二区三区 | 美人の美乳で授乳プレイ | 在线视频日韩 | 日韩中文字幕在线 | 91中文字幕在线 | www日本高清| 国产999精品久久久 午夜天堂精品久久久久 | 99久久婷婷国产综合精品电影 | 国产色片在线 | 亚洲黄色一区二区三区 | 欧美日韩在线不卡 |