Siameseネットワークの導入と実装

Siameseネットワークの導入と実装' (Introduction and Implementation of Siamese Network)

イントロダクション

シャムネットワークは、たった1つの例に基づいて正確な画像分類を可能にする興味深いアプローチを提供します。これらのネットワークは、データセット内の画像のペアの類似性を測定するためにコントラスティブロスと呼ばれる概念を使用します。画像の内容を解読する従来の方法とは異なり、シャムネットワークは画像間の変動と類似点に集中しています。この独特な学習方法は、限られたデータのシナリオにおいても強さを発揮し、ドメイン固有の知識なしでも性能を向上させます。

この記事では、シャムネットワークのレンズを通して署名の検証の魅力的な領域に深く入り込みます。PyTorchを使用して機能的なモデルを作成する方法について、洞察と実装手順を提供します。

学習目標

  • シャムネットワークの概念と双子のサブネットワークを含むユニークなアーキテクチャの理解
  • シャムネットワークで使用されるロス関数(バイナリクロスエントロピー、コントラスティブロス、トリプレットロス)の違いを理解する
  • シャムネットワークが効果的に使用できる実世界のアプリケーション(顔認識、指紋認識、テキストの類似性評価など)を特定し説明する
  • シャムネットワークの1ショット学習、汎用性、ドメインに依存しないパフォーマンスに関する利点と欠点をまとめる

この記事はデータサイエンスブログマラソンの一部として公開されました。

シャムネットワークとは何ですか?

シャムネットワークは、ワンショット分類のために2つの同じ構造のサブネットワークを使用するネットワークのカテゴリに属しています。これらのサブネットワークは、異なる入力を受け入れながら、同じセットアップ、パラメータ、重みを共有します。シャムネットワークは、複数のクラスを予測するために豊富なデータで訓練される従来のCNNとは異なり、類似性関数を学習します。この関数により、少ないデータを使用してクラスを識別することができるため、ワンショット分類に非常に効果的です。このユニークな能力により、これらのネットワークは多くの場合、1つの例で正確に画像を分類することができます。

シャムネットワークの実世界の応用例として、顔認識や署名の検証のタスクがあります。例えば、会社が自動顔認識に基づいた出席システムを導入するとします。従来のCNNでは、各従業員の1枚の画像しか利用できないため、正確に何千人もの従業員を分類するのは困難です。そこでシャムネットワークが登場し、このようなシナリオで優れた性能を発揮します。

フューショットラーニングの探求

フューショットラーニングでは、モデルは限られた数の例に基づいて予測を行うためのトレーニングを行います。これは、従来のアプローチとは対照的で、トレーニングには大量のラベル付きデータが必要です。フューショットモデルのアーキテクチャは、わずかな数のサンプル間の微妙な違いを活用し、わずかな数やたった1つの例に基づいて予測を行うことができます。シャムネットワーク、メタラーニングなどのさまざまな設計フレームワークが、この機能を可能にします。これらのフレームワークは、モデルが意味のあるデータ表現を抽出し、それを新しい、未知のサンプルに使用することができるようにします。

フューショットラーニングが活躍する実用例には、以下のものがあります:

  1. 監視カメラにおける物体検出: フューショットラーニングは、物体の検出において、それらの物体の例がわずかしかない場合でも効果的に識別することができます。わずかなラベル付きの例を使ってモデルをトレーニングした後、それらの物体を新しい映像で検出することができます。

2. 個別のヘルスケア: 個別のヘルスケアでは、医療専門家は患者の医療記録の限られたセットを持っている場合があります。これにはCTスキャンや血液検査の少数の例が含まれます。フューショットラーニングモデルを使用すると、トレーニング用のわずかな例から、患者の将来の健康状態を予測することができます。これには、特定の疾患の発症の予測や特定の治療法への反応の予測などが含まれます。

シャムネットワークのアーキテクチャ

Siameseネットワークの設計には、2つの同一のサブネットワークが含まれており、それぞれが入力の1つを処理します。最初に、入力は畳み込みニューラルネットワーク(CNN)を介して処理されます。このCNNは、提供された画像から有意な特徴を抽出します。その後、これらのサブネットワークはエンコードされた出力を生成し、通常は完全に接続された層を介して、入力データの縮約表現を生成します。

CNNは、2つのブランチと共有の特徴抽出コンポーネントで構成される、畳み込み、バッチ正規化、ReLU活性化、最大プーリング、およびドロップアウト層のレイヤーからなります。最後のセグメントでは、抽出された特徴を最終的な分類結果にマッピングするFC層が含まれています。関数は、線形層の後にReLU活性化のシーケンスと連続的な操作(畳み込み、バッチ正規化、ReLU活性化、最大プーリング、およびドロップアウト)の系列が続きます。フォワード関数は、入力をネットワークの両方のブランチに案内します。

差分層は、入力の類似性を特定し、異なるペア間の差を増幅するためにユークリッド距離関数を使用します:

Distance(x₁, x₂) = ∥f(x₁) – f(x₂)∥₂

この文脈では、

  • x₁、x₂は2つの入力です。
  • f(x)はエンコーディングの出力を表します。
  • Distanceは距離関数を示します。

この特性により、ネットワークは効果的なデータ表現を獲得し、新鮮で見たことのないサンプルに適用することができます。その結果、ネットワークは類似スコアとして表されるエンコーディングを生成し、クラスの区別に役立ちます。

付属の図にネットワークのアーキテクチャを描画します。特に、このネットワークはワンショット分類器として機能し、クラスごとに多くの例が必要ではありません。

Siameseネットワークで使用される損失関数

損失関数は、特定の入力に対して機械学習モデルの予測と実際の出力の不一致を測定するための数学的ツールです。モデルのトレーニングでは、この損失関数をモデルのパラメータを調整することで最小化することを目指します。

多様な問題タイプに対応するため、さまざまな損失関数があります。たとえば、平均二乗誤差は回帰の課題に適しており、クロスエントロピー損失は分類タスクに適しています。

他の多くのネットワークタイプとは異なり、Siameseネットワークは複数の損失関数を取り入れています。以下で詳しく説明します。

バイナリクロスエントロピー損失

バイナリクロスエントロピー損失は、2つの可能な結果のうち1つを予測するバイナリ分類タスクに有用です。Siameseネットワークの文脈では、画像を「類似」と「非類似」のいずれかに分類することを目的としています。

この関数は、正のクラスの予測確率と実際の結果の間の差異を定量化します。Siameseネットワーク内では、予測された確率は画像の類似性の可能性に関連しており、実際の結果は2値形式で表されます:画像の類似性には1、非類似性には0が使用されます。

この関数の数式は次のようになります:−(ylog(p)+(1−y)log(1−p))

ここで、

  • yは真のラベルを示します。
  • pは予測された確率を示します。

バイナリクロスエントロピー損失を使用してモデルをトレーニングすることで、この関数をパラメータの調整によって最小化しようとします。この最小化により、モデルは正確なクラスの予測に優れた性能を発揮します。

コントラスティブ損失

コントラスティブ損失は、距離を類似性の尺度として使用して画像ペアの差異を探求します。この関数は、クラスごとのトレーニングインスタンスの数が制限されている場合に有利です。コントラスティブ損失は、負のサンプルと正のサンプルのペアが必要となります。この損失の可視化は、付属の図で提供されています。

コントラスティブ損失の式は次のようになります:

(1 – Y) * 0.5 * D^2 + Y * 0.5 * max(0, m – D^2)

以下に詳細を示します:

  • Yは入力パラメータを表します。
  • Dはユークリッド距離を表します。
  • Yが0の場合、入力は同じクラスに属しています。一方、Yの値が1の場合、異なるクラスから来ていることを示します。
  • パラメータ’m’は距離関数に対するマージンを定義し、損失に貢献するペアを特定するのに役立ちます。なお、’m’の値は常に0より大きいです。

トリプレット損失

トリプレット損失は、データのトリプルを使用します。以下の図は、これらのトリプルを示しています。

トリプレット損失関数は、アンカーとネガティブサンプルの間の分離を強化し、アンカーとポジティブサンプルの間のギャップを縮小することを目指しています。

数学的には、トリプレット損失関数はアンカーからポジティブまでの距離(d(a,p))とアンカーからネガティブまでの距離(d(a,n))の最大の差を、マージン値を引いたものと定義されます。この差が正の場合、計算された値が損失となります。それ以外の場合は、ゼロに設定されます。

以下は、各コンポーネントの詳細です:

  • dはユークリッド距離を示します。
  • aはアンカー入力を表します。
  • pはポジティブ入力を示します。
  • nはネガティブ入力を表します。

主な目標は、ポジティブ入力がアンカー入力よりもネガティブ入力に近くなるようにし、分離のマージンを維持することです。

署名検証のためのシャムネットベースモデルの構築

署名検証は、偽造署名を真正な署名のコレクションから区別することを目的とします。このシナリオでは、モデルは多数の署名の微妙な違いを把握する必要があります。また、真正な署名と偽造署名の区別ができるようにする必要があります。この検証の目標を達成するためには、ステップバイステップのプロセスを確立する必要があります。これには、データの取り込み、画像ペアの作成、およびシャムネットワークを介した処理が含まれます。提供されたデータセットを使用してネットワークをトレーニングした後、予測関数を開発します。

データセット

使用するデータセットは署名の検証に関連しており、ICDAR 2011です。このコレクションには、真正な署名と偽造署名の両方を含むオランダの署名が含まれています。参考のために、データのサンプルがここにあります。データセットのリンク。

問題の説明

この記事では、署名検証の文脈で偽造署名を検出するタスクについて説明します。私たちの目標は、署名のデータセットを活用し、シャムネットワークを使用してテスト署名の真正性を予測し、真正な署名と偽造署名を区別することです。これを達成するためには、ステップバイステップのプロセスを確立する必要があります。これには、データセットからのデータの取り込み、画像ペアの作成、およびシャムネットワークを介した処理が含まれます。提供されたデータセットを使用してネットワークをトレーニングした後、予測関数を開発します。

必要なライブラリのインポート

シャムネットワークの構築には、いくつかの重要なライブラリを含める必要があります。画像の操作のためにPillowライブラリ(PIL)、可視化のためのmatplotlib、数値演算のためのnumpy、進捗バーのユーティリティのためのtqdmなどを導入します。さらに、PyTorchとtorchvisionの力を活用してネットワークのトレーニングと構築を容易にします。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.transforms as transforms
import torchvision.utils as tv_utils
from torch.autograd import Variable
from torch.utils.data import DataLoader, Dataset
import PIL.Image as Image
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import torch.utils.data as custom_data
from tqdm import tqdm

ユーティリティ関数

ネットワークの出力を可視化するために、ユーティリティ関数を作成します。この関数は、画像とそれに対応するラベルを入力として受け取り、便利な可視化のためにそれらをグリッド状に配置します。

import numpy as np
import matplotlib.pyplot as plt

def display_image(img, caption=None, save=False):
    image_array = img.numpy()
    plt.axis("off")
    
    if caption:
        plt.text(
            75,
            8,
            caption,
            style="italic",
            fontweight="bold",
            bbox={"facecolor": "white", "alpha": 0.8, "pad": 10},
        )
    
    plt.imshow(np.transpose(image_array, (1, 2, 0)))
    plt.show()

データの前処理

シャムネットワークで使用されるデータ構造は、従来の画像分類ネットワークとは大きく異なります。単一の画像とラベルのペアを提供するのではなく、シャムネットワークのためのデータセット生成器は画像ペアの提供を必要とします。これらのペアは、白黒への変換、サイズ変更、テンソルへの変換などの変換プロセスを経ます。2つの異なるカテゴリのペアがあります。同じ入力画像を特徴とする正のペアと、異なる画像を特徴とする負のペアです。さらに、関数を呼び出すとデータセットのサイズが提供されます。

import os
import pandas as pd
import torch
import torch.utils.data as data
from PIL import Image
import numpy as np

class PairedDataset(data.Dataset):
    def __init__(self, df_path=None, data_dir=None, transform=None, subset=None):
        self.df = pd.read_csv(df_path)
        if subset is not None:
            self.df = self.df[:subset]
        self.df.columns = ["image1", "image2", "label"]
        self.data_dir = data_dir
        self.transform = transform

    def __getitem__(self, index):
        pair1_path = os.path.join(self.data_dir, self.df.iat[index, 0])
        pair2_path = os.path.join(self.data_dir, self.df.iat[index, 1])

        pair1 = Image.open(pair1_path).convert("L")
        pair2 = Image.open(pair2_path).convert("L")

        if self.transform:
            pair1 = self.transform(pair1)
            pair2 = self.transform(pair2)

        label = torch.tensor([int(self.df.iat[index, 2])], dtype=torch.float32)

        return pair1, pair2, label

    def __len__(self):
        return len(self.df)

機能の簡潔な概要

ネットワークの入力は、正と負のデータのペアからなる画像で構成されています。これらのペアを画像データとして表し、Tensor形式に変換して、基礎となる画像情報を効果的にカプセル化します。Siameseネットワークに関連付けられたラベルはカテゴリです。

特徴の標準化プロセス

重要なステップとして、特徴の標準化と画像の白黒変換があります。さらに、すべての画像を(105×105)の正方形の形式に一様にリサイズし、Siameseネットワークがこの次元を必要とするためです。その後、すべての画像をTensorに変換し、計算効率を向上させ、GPUの利用を可能にします。

data_transform = transforms.Compose([
    transforms.Resize((105, 105)),
    transforms.ToTensor()
])

データセットの分割

モデルのトレーニングとテストを容易にするために、データセットを異なるトレーニングセグメントとテストセグメントに分割します。イラストのために、最初の1000のデータポイントに焦点を当てます。’load_subset’の値をNoneにすると、完全なデータセットを利用することができますが、処理時間が長くなるという費用がかかります。ネットワークの長期的なパフォーマンスを向上させるアプローチとして、データの拡張を考慮してください。

train_dataset = PairedDataset(
    df_train,
    dir_train,
    transform=transforms.Compose([
        transforms.Resize((105, 105)),
        transforms.ToTensor()
    ]),
    subset=1000
)

evaluation_dataset = PairedDataset(
    df_val,
    dir_val,
    transform=transforms.Compose([
        transforms.Resize((105, 105)),
        transforms.ToTensor()
    ]),
    subset=1000
)

ニューラルネットワークのアーキテクチャ

説明されたアーキテクチャを構築するには、一連のステップが必要です。まず、畳み込み、バッチ正規化、およびReLU層のセットを構築する関数を確立し、最後にDropout層を含めるか含めないかの柔軟性を提供します。次に、後続のReLU層によって補完される完全接続(FC)層のシーケンスを生成するための別の関数を考案します。前述の関数を使用してCNNコンポーネントが構築されると、ネットワークのFCセグメントの形状への注意が移ります。特に、ネットワーク全体で異なるパディングとカーネルサイズが実装されています。

FC部分は、ReLU活性化関数に続くLinear層で構成されるブロックで構成されています。アーキテクチャが定義されたら、提供されたデータをネットワークを介して処理するために、forwardパスを実行します。注目すべき重要な側面は、前のブロックの出力を次のブロックによって出力形状を変更する「view」関数です。このメカニズムを確立した後、提供されたデータを使用してSiameseネットワークをトレーニングする準備が整います。

class SiameseNetwork(nn.Module):
    def __init__(self):
        super(SiameseNetwork, self).__init__()

        self.cnn1 = nn.Sequential(
            self.create_conv_block(1, 96, 11, 1, False),
            self.create_conv_block(96, 256, 5, 2, True),
            nn.Conv2d(256, 384, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(384),
            nn.ReLU(inplace=True),
            self.create_conv_block(384, 256, 3, 1, True),
        )

        self.fc1 = nn.Sequential(
            self.create_linear_relu(30976, 1024),
            nn.Dropout2d(p=0.5),
            self.create_linear_relu(1024, 128),
            nn.Linear(128, 2)
        )

    def create_linear_relu(self, input_channels, output_channels):
        return nn.Sequential(nn.Linear(input_channels, output_channels),
        nn.ReLU(inplace=True))

    def create_conv_block(self, input_channels, output_channels, kernel_size,
    padding, dropout=True):
        if dropout:
            return nn.Sequential(
                nn.Conv2d(input_channels, output_channels, kernel_size=kernel_size,
                stride=1, padding=padding),
                nn.BatchNorm2d(output_channels),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(3, stride=2),
                nn.Dropout2d(p=0.3)
            )
        else:
            return nn.Sequential(
                nn.Conv2d(input_channels, output_channels, kernel_size=kernel_size,
                stride=1),
                nn.BatchNorm2d(output_channels),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(3, stride=2)
            )

    def forward_once(self, x):
        output = self.cnn1(x)
        output = output.view(output.size()[0], -1)
        output = self.fc1(output)
        return output

    def forward(self, input1, input2):
        out1 = self.forward_once(input1)
        out2 = self.forward_once(input2)
        return out1, out2

損失関数

コントラスティブ損失は、Siamese Networkの重要な損失関数として機能します。この損失を定義するには、前述の式を利用します。コードの効率を向上させるために、損失を直接的な関数として定義する代わりに、nn.Moduleクラスから継承する代替手法があります。これにより、関数の出力を提供するカスタマイズされたクラスを作成することができます。このようなラッパーにより、PyTorchはコードの実行を最適化し、全体的なランタイムのパフォーマンスを向上させることができます。

class ContrastiveLoss(nn.Module):
    def __init__(self, margin=2.0):
        super(ContrastiveLoss, self).__init__()
        self.margin = margin

    def forward(self, output1, output2, label):
        euclidean_distance = F.pairwise_distance(output1, output2)
        loss_positive = (1 - label) * torch.pow(euclidean_distance, 2)
        loss_negative = label * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2)
        total_loss = torch.mean(loss_positive + loss_negative)
        return total_loss

Siamese Networkのトレーニング

データが読み込まれ、前処理が完了したら、Siameseネットワークのトレーニングを開始する準備が整います。このプロセスを開始するには、トレーニングとテスト用のデータローダーを確立します。特に、評価用のデータローダーはバッチサイズ1で設定されており、個別の評価を容易にするように構成されています。その後、モデルはGPUに展開され、コントラスティブ損失関数やAdamオプティマイザなどの重要なコンポーネントが定義されます。

train_loader = DataLoader(train_dataset,
                        shuffle=True,
                        num_workers=8,
                        batch_size=bs) 
eval_loader = DataLoader(evaluation_dataset,
                        shuffle=True,
                        num_workers=8,
                        batch_size=1) 

siamese_net = SiameseNetwork().cuda()
loss_function = ContrastiveLoss()
optimizer = torch.optim.Adam(siamese_net.parameters(), lr=1e-3, weight_decay=0.0005)

その後、トレーニング関数が作成されます。この関数はトレーニングデータローダーを入力として受け取ります。この関数内では、損失を追跡するために持続的な配列と、将来のプロット作業を容易にするためのカウンターが維持されます。以下の反復プロセスでは、データローダー内のデータポイントをナビゲートします。各ポイントでは、画像ペアがGPUに転送され、ネットワーク処理が行われ、コントラスティブ損失が計算されます。その後のステップでは、バックワードパスの実行が行われ、データバッチに関するネット損失が提供されます。

def train(train_loader, model, optimizer, loss_function):
    total_loss = 0.0
    num_batches = len(train_loader)

    model.train()

    for batch_idx, (pair_left, pair_right, label) in
    enumerate(tqdm(train_loader, total=num_batches)):
        pair_left, pair_right, label = pair_left.cuda(),
        pair_right.cuda(), label.cuda()

        optimizer.zero_grad()
        output1, output2 = model(pair_left, pair_right)

        contrastive_loss = loss_function(output1, output2, label)
        contrastive_loss.backward()
        optimizer.step()

        total_loss += contrastive_loss.item()

    mean_loss = total_loss / num_batches

    return mean_loss

モデルは、開発された関数を使用して複数のエポックにわたってトレーニングすることができます。このデモンストレーションでは、限られたエポック数のみをカバーしています。トレーニング中に達成された評価損失がトレーニング期間全体での最良のパフォーマンスを表す場合、その特定のエポックでのモデルは以降の推論のために保存されます。

best_eval_loss = float('inf')

for epoch in tqdm(range(1, num_epoch)):
    train_loss = train(train_loader)
    eval_loss = evaluate(eval_loader)

    print(f"エポック: {epoch}")
    print(f"トレーニング損失: {train_loss}")
    print(f"評価損失: {eval_loss}")

    if eval_loss < best_eval_loss:
        best_eval_loss = eval_loss
        print(f"最良の評価損失: {best_eval_loss}")
        torch.save(siamese_net.state_dict(), "model.pth")
        print("モデルの保存に成功しました")

モデルのテスト

モデルのトレーニング後に評価フェーズが続き、パフォーマンスの評価や個々のデータポイントに対する推論を行うことができます。トレーニング関数と同様に、テストデータローダーを入力として受け取る評価関数が構築されます。データローダーを反復処理し、1つのインスタンスを処理します。その後、テスト用の画像ペアが抽出されます。これらのペアはGPUに送信され、モデルの実行が可能になります。モデルの出力は、コントラスティブ損失の計算に使用され、その後、指定されたリストに格納されます。

def evaluate(eval_loader):
    loss_list = []
    counter_list = []
    iteration_number = 0

    for i, data in tqdm(enumerate(eval_loader, 0), total=len(eval_loader)):
        pair_left, pair_right, label = data
        pair_left, pair_right, label = pair_left.cuda(), pair_right.cuda(), label.cuda()
        
        output1, output2 = siamese_net(pair_left, pair_right)
        contrastive_loss = loss_function(output1, output2, label)
        loss_list.append(contrastive_loss.item())
    
    loss_array = np.array(loss_list)
    mean_loss = loss_array.mean() / len(eval_loader)
    
    return mean_loss

テストデータポイント全体で単一の評価を実行するために、このコードを実行できます。パフォーマンスを視覚的に評価するために、モデルがデータポイント間で特定したペアワイズ距離を示すプロットを生成し、グリッド形式で結果を表示します。

for i, data in enumerate(dl_eval, 0):
    x0, x1, label = data
    concat_images = torch.cat((x0, x1), 0)
    out1, out2 = siamese_net(x0.to('cuda'), x1.to('cuda'))

    euclidean_distance = F.pairwise_distance(out1, out2)
    print(label)
    if label == torch.FloatTensor([[0]]):
        label_text = "オリジナルの署名のペア"
    else:
        label_text = "偽造された署名のペア"

    display_images(torchvision.utils.make_grid(concat_images))
    print("予測されたユークリッド距離:", euclidean_distance.item())
    print("実際のラベル:", label_text)
    if i == 4:
        break

出力

Siameseネットワークの利点と欠点

欠点

  • Siameseネットワークの特徴的な欠点の1つは、類似性スコアを提供する出力であり、確率分布の合計が1になる確率ベースの出力が好ましい場合に課題を提供する可能性がある点です。

利点

  • Siameseネットワークは、異なるクラス内のさまざまな例の数に対処する際に堅牢性を示します。この適応性は、ネットワークの限られたクラス情報で効果的に機能する能力によるものです。
  • ネットワークの分類性能は、ドメイン固有の情報を提供することに依存せず、その汎用性に貢献します。
  • Siameseネットワークは、クラスごとに単一の画像のみで予測を行うことができます。

Siameseネットワークの応用

Siameseネットワークは、以下に示すさまざまなアプリケーションで有用です。

顔認識: Siameseネットワークは、ワンショット顔認識のタスクで有利です。対照的な損失を利用することで、これらのネットワークは類似した顔と異なる顔を区別し、最小限のデータサンプルで効果的な顔の識別を実現します。

指紋認識: Siameseネットワークを指紋認識に活用します。事前処理された指紋のペアをネットワークに提供することで、有効な指紋と無効な指紋を区別することを学習し、指紋に基づく認証の精度を向上させます。

署名検証: この記事では、主にSiameseネットワークを使用した署名検証の実装について説明しました。デモンストレーションのように、ネットワークは署名のペアを処理して署名の真正性を判断し、本物と偽造の署名を区別します。

テキストの類似性: Siameseネットワークは、テキストの類似性評価にも関連性があります。ペア入力により、ネットワークは異なるテキストの類似性を見分けることができます。実際の応用例には、質問バンク内の類似した質問の特定やテキストリポジトリからの類似したドキュメントの検索などがあります。

結論

シャルキンネットワーク(通称SNN)は、2つ以上のサブネットワークが同一の構造を共有するニューラルネットワークの設計の一つです。「同一」とは、設定、パラメータ、重みが一致していることを意味します。これらのサブネットワーク間でのパラメータの更新の同期によって、特徴ベクトルの比較を通じて入力間の類似性が決定されます。

キーポイント

  • シャルキンネットワークは、クラスごとの例が限られたデータセットの分類に優れており、トレーニングデータが少ないシナリオにおいて貴重な存在です。
  • この探求を通じて、シャルキンネットワークの基本原理について理解を深め、アーキテクチャ、使用される損失関数、およびネットワークのトレーニングプロセスについて学びました。
  • 私たちの旅は、ICDAR 2011データセットを利用した署名検証のコンテキストでのシャルキンネットワークの実際の応用を含んでいました。これには、偽造署名を検出できるモデルの作成が含まれていました。
  • シャルキンネットワークのトレーニングおよびテストのパイプラインが明確になり、これらのネットワークがどのように動作するかについて包括的な理解が得られました。ペアデータの表現にも詳しく取り組みました。これは彼らの効果的な活用において重要な要素です。

よくある質問

この記事で表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more