Обучите сиамскую сеть сравнивать изображения

В этом примере показано, как обучить сиамскую сеть идентифицировать аналогичные изображения рукописных символов.

Сиамская сеть - это тип нейронной сети для глубокого обучения, которая использует две или более идентичных подсетей, которые имеют одинаковую архитектуру и имеют одинаковые параметры и веса. Сиамские сети обычно используются в задачах, которые включают нахождение связи между двумя сопоставимыми вещами. Некоторые распространенные приложения для сиамских сетей включают распознавание лиц, верификацию подписей [1] или идентификацию перефразирования [2]. Сиамские сети хорошо работают в этих задачах, потому что их общие веса означают, что во время обучения меньше параметров, и они могут дать хорошие результаты с относительно небольшим объемом обучающих данных.

Сиамские сети особенно полезны в тех случаях, когда существует большое количество классов с небольшим количеством наблюдений за каждым. В таких случаях недостаточно данных, чтобы обучить глубокую сверточную нейронную сеть классифицировать изображения в эти классы. Вместо этого сиамская сеть может определить, находятся ли два изображения в одном классе.

Этот пример использует набор данных Omniglot [3], чтобы обучить сиамскую сеть сравнивать изображения рукописных символов [4]. Набор данных Omniglot содержит наборы символов для 50 алфавитов, разделенных на 30 используемых для обучения и 20 для проверки. Каждый алфавит содержит несколько символов от 14 для оджибве (канадских аборигенов-саллабиков) до 55 для тифинах. Наконец, каждый символ имеет 20 рукописных наблюдений. Этот пример обучает сеть идентифицировать, являются ли два рукописных наблюдения различными образцами одного и того же символа.

Можно также использовать сиамские сети для идентификации аналогичных изображений с помощью уменьшения размерности. Для получения примера смотрите Обучите сиамскую сеть для уменьшения размерности.

Загрузка и предварительная обработка обучающих данных

Загрузите и извлеките обучающий набор данных Omniglot.

url = "https://github.com/brendenlake/omniglot/raw/master/python/images_background.zip";
downloadFolder = tempdir;
filename = fullfile(downloadFolder,"images_background.zip");

dataFolderTrain = fullfile(downloadFolder,'images_background');
if ~exist(dataFolderTrain,"dir")
    disp("Downloading Omniglot training data (4.5 MB)...")
    websave(filename,url);
    unzip(filename,downloadFolder);
end
disp("Training data downloaded.")
Training data downloaded.

Загрузите обучающие данные как изображение хранилище данных с помощью imageDatastore функция. Задайте метки вручную, извлечя метки из имен файлов и задав Labels свойство.

imdsTrain = imageDatastore(dataFolderTrain, ...
    'IncludeSubfolders',true, ...
    'LabelSource','none');

files = imdsTrain.Files;
parts = split(files,filesep);
labels = join(parts(:,(end-2):(end-1)),'_');
imdsTrain.Labels = categorical(labels);

Обучающий набор данных Omniglot состоит из черно-белых рукописных символов из 30 алфавитов, с 20 наблюдениями за каждым символом. Изображения имеют размер 105 на 105 на 1, и значения каждого пикселя между 0 и 1.

Отобразите случайный выбор изображений.

idxs = randperm(numel(imdsTrain.Files),8);

for i = 1:numel(idxs)
    subplot(4,2,i)
    imshow(readimage(imdsTrain,idxs(i)))
    title(imdsTrain.Labels(idxs(i)), "Interpreter","none");
end

Создайте пары похожих и непохожих изображений

Чтобы обучить сеть, данные должны быть сгруппированы в пары изображений, которые либо похожи, либо отличаются друг от друга. Здесь похожими изображениями являются различные рукописные образцы одного и того же символа, которые имеют одну и ту же метку, в то время как разнородные изображения разных символов имеют разные метки. Функция getSiameseBatch (определено в разделе Support Functions этого примера) создает рандомизированные пары подобных или разнородных изображений, pairImage1 и pairImage2. Функция также возвращает метку pairLabel, который определяет, похожа ли пара изображений или отличается друг от друга. Подобные пары изображений имеют pairLabel = 1, в то время как разнородные пары имеют pairLabel = 0.

В качестве примера создайте небольшой репрезентативный набор из пяти пар изображений

batchSize = 10;
[pairImage1,pairImage2,pairLabel] = getSiameseBatch(imdsTrain,batchSize);

Отображение сгенерированных пар изображений.

for i = 1:batchSize    
    if pairLabel(i) == 1
        s = "similar";
    else
        s = "dissimilar";
    end
    subplot(2,5,i)   
    imshow([pairImage1(:,:,:,i) pairImage2(:,:,:,i)]);
    title(s)
end

В этом примере создается новый пакет из 180 парных изображений для каждой итерации цикла обучения. Это гарантирует, что сеть обучена на большом количестве случайных пар изображений с приблизительно равными пропорциями аналогичных и разнородных пар.

Определение сетевой архитектуры

Сиамская сетевая архитектура проиллюстрирована на следующей схеме.

Для сравнения двух изображений каждое изображение передается через одну из двух одинаковых подсетей, которые имеют общие веса. Подсети преобразовывают каждое изображение 105 на 105 на 1 в 4096-мерный вектор функции. Изображения того же класса имеют сходные 4096-мерные представления. Выходы функций из каждой подсети объединяются посредством вычитания, и результат передается через fullyconnect операция с одним выходом. A sigmoid операция преобразует это значение в вероятность между 0 и 1, что указывает на предсказание сети, похожи ли изображения или отличаются друг от друга. Двоичная потеря перекрестной энтропии между предсказанием сети и истинной меткой используется для обновления сети во время обучения.

В этом примере две идентичные подсети определяются как dlnetwork объект. Итоговая fullyconnect и sigmoid операции выполняются как функциональные операции на выходах подсети.

Создайте подсеть как серию слоев, которая принимает изображения 105 на 105 на 1 и производит вектор функции размера 4096.

Для convolution2dLayer объекты, используйте узкое нормальное распределение, чтобы инициализировать веса и смещение.

Для maxPooling2dLayer задайте для объекта stride значение 2.

Для окончательного fullyConnectedLayer задайте размер выхода 4096 и используйте узкое нормальное распределение для инициализации весов и смещения.

layers = [
    imageInputLayer([105 105 1],'Name','input1','Normalization','none')
    convolution2dLayer(10,64,'Name','conv1','WeightsInitializer','narrow-normal','BiasInitializer','narrow-normal')
    reluLayer('Name','relu1')
    maxPooling2dLayer(2,'Stride',2,'Name','maxpool1')
    convolution2dLayer(7,128,'Name','conv2','WeightsInitializer','narrow-normal','BiasInitializer','narrow-normal')
    reluLayer('Name','relu2')
    maxPooling2dLayer(2,'Stride',2,'Name','maxpool2')
    convolution2dLayer(4,128,'Name','conv3','WeightsInitializer','narrow-normal','BiasInitializer','narrow-normal')
    reluLayer('Name','relu3')
    maxPooling2dLayer(2,'Stride',2,'Name','maxpool3')
    convolution2dLayer(5,256,'Name','conv4','WeightsInitializer','narrow-normal','BiasInitializer','narrow-normal')
    reluLayer('Name','relu4')
    fullyConnectedLayer(4096,'Name','fc1','WeightsInitializer','narrow-normal','BiasInitializer','narrow-normal')];

lgraph = layerGraph(layers);

Чтобы обучить сеть с помощью пользовательского цикла обучения и включить автоматическую дифференциацию, преобразуйте график слоев в dlnetwork объект.

dlnet = dlnetwork(lgraph);

Создайте веса для конечных fullyconnect операция. Инициализируйте веса путем выборки случайного выбора из узкого нормального распределения со стандартным отклонением 0,01.

fcWeights = dlarray(0.01*randn(1,4096));
fcBias = dlarray(0.01*randn(1,1));

fcParams = struct(...
    "FcWeights",fcWeights,...
    "FcBias",fcBias);

Чтобы использовать сеть, создайте функцию forwardSiamese (определено в разделе Вспомогательные функции этого примера), который определяет, как две подсети и вычитание, fullyconnect, и sigmoid операции объединяются. Функция forwardSiamese принимает сеть, структуру, содержащую параметры для fullyconnect операция и два обучающих изображения. The forwardSiamese функция выводит предсказание о подобии двух изображений.

Задайте функцию градиентов модели

Создайте функцию modelGradients (определено в разделе Вспомогательные функции этого примера). The modelGradients функция принимает сиамскую подсеть dlnet, структура параметра для fullyconnect операция и мини-пакет входных данных X1 и X2 со своими метками pairLabels. Функция возвращает значения потерь и градиенты потерь относительно настраиваемых параметров сети.

Цель сиамской сети состоит в том, чтобы различать эти два входов X1 и X2. Выход сети является вероятностью между 0 и 1, где значение ближе к 0 указывает предсказание, что изображения отличаются друг от друга, и значение ближе к 1 что изображения похожи. Потеря определяется двоичной перекрестной энтропией между предсказанным счетом и истинным значением метки:

loss=-tlog(y)-(1-t)log(1-y),

где true label t может быть 0 или 1 и y - предсказанная метка.

Настройка опций обучения

Задайте опции, которые будут использоваться во время обучения. Обучите для 10000 итераций.

numIterations = 10000;
miniBatchSize = 180;

Задайте опции для оптимизации ADAM:

  • Установите скорость обучения равной 0.00006.

  • Инициализируйте конечный средний градиент и конечный средний градиент-квадратные скорости распада с [] для обоих dlnet и fcParams.

  • Установите коэффициент градиентного распада равным 0.9 и квадратный коэффициент градиента распада, чтобы 0.99.

learningRate = 6e-5;
trailingAvgSubnet = [];
trailingAvgSqSubnet = [];
trailingAvgParams = [];
trailingAvgSqParams = [];
gradDecay = 0.9;
gradDecaySq = 0.99;

Обучите на графическом процессоре, если он доступен. Для использования графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Чтобы автоматически определить, доступен ли графический процессор, и поместить соответствующие данные на графический процессор, установите значение executionEnvironment на "auto". Если у вас нет графический процессор или вы не хотите использовать его для обучения, задайте значение executionEnvironment на "cpu". Чтобы убедиться, что вы используете графический процессор для обучения, задайте значение executionEnvironment на "gpu".

executionEnvironment = "auto";

Чтобы контролировать процесс обучения, можно построить график потерь обучения после каждой итерации. Создайте переменную plots который содержит "training-progress". Если вы не хотите строить график процесса обучения, задайте это значение "none".

plots = "training-progress";

Инициализируйте параметры графика для графика прогресса потерь обучения.

plotRatio = 16/9;

if plots == "training-progress"
    trainingPlot = figure;
    trainingPlot.Position(3) = plotRatio*trainingPlot.Position(4);
    trainingPlot.Visible = 'on';
    
    trainingPlotAxes = gca;
    
    lineLossTrain = animatedline(trainingPlotAxes);
    xlabel(trainingPlotAxes,"Iteration")
    ylabel(trainingPlotAxes,"Loss")
    title(trainingPlotAxes,"Loss During Training")
end

Обучите модель

Обучите модель с помощью пользовательского цикла обучения. Закольцовывайте обучающие данные и обновляйте сетевые параметры при каждой итерации.

Для каждой итерации:

  • Извлечение пакета пар изображений и меток с помощью getSiameseBatch функция, определенная в разделе «Создание пакетов пар изображений».

  • Преобразуйте данные в dlarray объекты с базовым типом single и задайте метки размерностей 'SSCB' (пространственный, пространственный, канал, пакет) для данных изображения и 'CB' (канал, пакет) для меток.

  • Для обучения графический процессор преобразуйте данные в gpuArray объекты.

  • Оцените градиенты модели с помощью dlfeval и modelGradients функция.

  • Обновляйте параметры сети с помощью adamupdate функция.

% Loop over mini-batches.
for iteration = 1:numIterations
    
    % Extract mini-batch of image pairs and pair labels
    [X1,X2,pairLabels] = getSiameseBatch(imdsTrain,miniBatchSize);
    
    % Convert mini-batch of data to dlarray. Specify the dimension labels
    % 'SSCB' (spatial, spatial, channel, batch) for image data
    dlX1 = dlarray(single(X1),'SSCB');
    dlX2 = dlarray(single(X2),'SSCB');
    
    % If training on a GPU, then convert data to gpuArray.
    if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
        dlX1 = gpuArray(dlX1);
        dlX2 = gpuArray(dlX2);
    end  
    
    % Evaluate the model gradients and the generator state using
    % dlfeval and the modelGradients function listed at the end of the
    % example.
    [gradientsSubnet, gradientsParams,loss] = dlfeval(@modelGradients,dlnet,fcParams,dlX1,dlX2,pairLabels);
    lossValue = double(gather(extractdata(loss)));
    
    % Update the Siamese subnetwork parameters.
    [dlnet,trailingAvgSubnet,trailingAvgSqSubnet] = ...
        adamupdate(dlnet,gradientsSubnet, ...
        trailingAvgSubnet,trailingAvgSqSubnet,iteration,learningRate,gradDecay,gradDecaySq);
    
    % Update the fullyconnect parameters.
    [fcParams,trailingAvgParams,trailingAvgSqParams] = ...
        adamupdate(fcParams,gradientsParams, ...
        trailingAvgParams,trailingAvgSqParams,iteration,learningRate,gradDecay,gradDecaySq);
      
    % Update the training loss progress plot.
    if plots == "training-progress"
        addpoints(lineLossTrain,iteration,lossValue);
    end
    drawnow;
end

Оцените точность сети

Загрузите и извлечите тестовый набор данных Omniglot.

url = 'https://github.com/brendenlake/omniglot/raw/master/python/images_evaluation.zip';
downloadFolder = tempdir;
filename = fullfile(downloadFolder,'images_evaluation.zip');

dataFolderTest = fullfile(downloadFolder,'images_evaluation');
if ~exist(dataFolderTest,'dir')
    disp('Downloading Omniglot test data (3.2 MB)...')
    websave(filename,url);
    unzip(filename,downloadFolder);
end
disp("Test data downloaded.")
Test data downloaded.

Загрузите тестовые данные как изображение хранилище данных с помощью imageDatastore функция. Задайте метки вручную, извлечя метки из имен файлов и задав Labels свойство.

imdsTest = imageDatastore(dataFolderTest, ...
    'IncludeSubfolders',true, ...
    'LabelSource','none');    

files = imdsTest.Files;
parts = split(files,filesep);
labels = join(parts(:,(end-2):(end-1)),'_');
imdsTest.Labels = categorical(labels);

Тестовый набор данных содержит 20 алфавитов, которые отличаются от тех, на которых обучалась сеть. Всего в тестовом наборе данных 659 различных классов.

numClasses = numel(unique(imdsTest.Labels))
numClasses = 659

Чтобы вычислить точность сети, создайте набор из пяти случайных мини-пакетов тестовых пар. Используйте predictSiamese функция (определенная в разделе Вспомогательные функции этого примера) для оценки предсказаний и вычисления средней точности по мини-пакетам.

accuracy = zeros(1,5);
accuracyBatchSize = 150;

for i = 1:5
    
    % Extract mini-batch of image pairs and pair labels
    [XAcc1,XAcc2,pairLabelsAcc] = getSiameseBatch(imdsTest,accuracyBatchSize);
    
    % Convert mini-batch of data to dlarray. Specify the dimension labels
    % 'SSCB' (spatial, spatial, channel, batch) for image data.
    dlXAcc1 = dlarray(single(XAcc1),'SSCB');
    dlXAcc2 = dlarray(single(XAcc2),'SSCB');
    
    % If using a GPU, then convert data to gpuArray.
    if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
       dlXAcc1 = gpuArray(dlXAcc1);
       dlXAcc2 = gpuArray(dlXAcc2);
    end    
    
    % Evaluate predictions using trained network
    dlY = predictSiamese(dlnet,fcParams,dlXAcc1,dlXAcc2);
   
    % Convert predictions to binary 0 or 1
    Y = gather(extractdata(dlY));
    Y = round(Y);
    
    % Compute average accuracy for the minibatch
    accuracy(i) = sum(Y == pairLabelsAcc)/accuracyBatchSize;
end

% Compute accuracy over all minibatches
averageAccuracy = mean(accuracy)*100
averageAccuracy = 88.6667

Отобразите тестовый набор изображений с предсказаниями

Чтобы визуально проверить, правильно ли сеть идентифицирует похожие и разнородные пары, создайте небольшой пакет пар изображений для тестирования. Используйте функцию predictSiamese, чтобы получить предсказание для каждой тестовой пары. Отобразите пару изображений с предсказанием, счетом вероятности и меткой, указывающей, было ли предсказание правильным или неправильным.

testBatchSize = 10;

[XTest1,XTest2,pairLabelsTest] = getSiameseBatch(imdsTest,testBatchSize);
    
% Convert test batch of data to dlarray. Specify the dimension labels
% 'SSCB' (spatial, spatial, channel, batch) for image data and 'CB' 
% (channel, batch) for labels
dlXTest1 = dlarray(single(XTest1),'SSCB');
dlXTest2 = dlarray(single(XTest2),'SSCB');

% If using a GPU, then convert data to gpuArray
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
   dlXTest1 = gpuArray(dlXTest1);
   dlXTest2 = gpuArray(dlXTest2);
end

% Calculate the predicted probability
dlYScore = predictSiamese(dlnet,fcParams,dlXTest1,dlXTest2);
YScore = gather(extractdata(dlYScore));

% Convert predictions to binary 0 or 1
YPred = round(YScore);    

% Extract data to plot
XTest1 = extractdata(dlXTest1);
XTest2 = extractdata(dlXTest2);

% Plot images with predicted label and predicted score
testingPlot = figure;
testingPlot.Position(3) = plotRatio*testingPlot.Position(4);
testingPlot.Visible = 'on';
    
for i = 1:numel(pairLabelsTest)
     
    if YPred(i) == 1
        predLabel = "similar";
    else
        predLabel = "dissimilar" ;
    end
    
    if pairLabelsTest(i) == YPred(i)
        testStr = "\bf\color{darkgreen}Correct\rm\newline";
        
    else
        testStr = "\bf\color{red}Incorrect\rm\newline";
    end
    
    subplot(2,5,i)        
    imshow([XTest1(:,:,:,i) XTest2(:,:,:,i)]);        
    
    title(testStr + "\color{black}Predicted: " + predLabel + "\newlineScore: " + YScore(i)); 
end

Сеть может сравнить тестовые изображения, чтобы определить их сходство, хотя ни одно из этих изображений не было в обучающем наборе данных.

Вспомогательные функции

Моделируйте функции для обучения и предсказания

Функция forwardSiamese используется во время сетевого обучения. Функция определяет, как подсети и fullyconnect и sigmoid операции объединяются, чтобы сформировать полную сиамскую сеть. forwardSiamese принимает структуру сети и два обучающих изображения и выводит предсказание о сходстве двух изображений. В этом примере функция forwardSiamese приведено в разделе «Определение сетевой архитектуры».

function Y = forwardSiamese(dlnet,fcParams,dlX1,dlX2)
% forwardSiamese accepts the network and pair of training images, and returns a
% prediction of the probability of the pair being similar (closer to 1) or 
% dissimilar (closer to 0). Use forwardSiamese during training.

    % Pass the first image through the twin subnetwork
    F1 = forward(dlnet,dlX1);
    F1 = sigmoid(F1);
    
    % Pass the second image through the twin subnetwork
    F2 = forward(dlnet,dlX2);
    F2 = sigmoid(F2);
    
    % Subtract the feature vectors
    Y = abs(F1 - F2);
    
    % Pass the result through a fullyconnect operation
    Y = fullyconnect(Y,fcParams.FcWeights,fcParams.FcBias);
    
    % Convert to probability between 0 and 1.
    Y = sigmoid(Y);
end

Функция predictSiamese использует обученную сеть, чтобы делать предсказания о сходстве двух изображений. Функция похожа на функцию forwardSiamese, заданный ранее. Однако predictSiamese использует predict функция с сетью вместо forward функция, потому что некоторые слои глубокого обучения ведут себя по-разному во время обучения и предсказания. В этом примере функция predictSiamese введено в раздел «Оценка точности сети».

function Y = predictSiamese(dlnet,fcParams,dlX1,dlX2)
% predictSiamese accepts the network and pair of images, and returns a
% prediction of the probability of the pair being similar (closer to 1)
% or dissimilar (closer to 0). Use predictSiamese during prediction.

    % Pass the first image through the twin subnetwork
    F1 = predict(dlnet,dlX1);
    F1 = sigmoid(F1);
    
    % Pass the second image through the twin subnetwork
    F2 = predict(dlnet,dlX2);
    F2 = sigmoid(F2);
    
    % Subtract the feature vectors
    Y = abs(F1 - F2);
    
    % Pass result through a fullyconnect operation
    Y = fullyconnect(Y,fcParams.FcWeights,fcParams.FcBias);
    
    % Convert to probability between 0 and 1.
    Y = sigmoid(Y);
end

Функция градиентов модели

Функция modelGradients принимает сиамский dlnetwork net объекта, пару мини-пакетных входных данных X1 и X2, и метка, указывающая, похожи ли они или отличаются друг от друга. Функция возвращает градиенты потерь относительно настраиваемых параметров в сети и двоичных потерь перекрестной энтропии между предсказанием и основной истиной. В этом примере функция modelGradients введено в раздел Define Model Gradients Function.

function [gradientsSubnet,gradientsParams,loss] = modelGradients(dlnet,fcParams,dlX1,dlX2,pairLabels)
% The modelGradients function calculates the binary cross-entropy loss between the
% paired images and returns the loss and the gradients of the loss with respect to
% the network learnable parameters

    % Pass the image pair through the network 
    Y = forwardSiamese(dlnet,fcParams,dlX1,dlX2);
    
    % Calculate binary cross-entropy loss
    loss = binarycrossentropy(Y,pairLabels);
       
    % Calculate gradients of the loss with respect to the network learnable
    % parameters
    [gradientsSubnet,gradientsParams] = dlgradient(loss,dlnet.Learnables,fcParams);
end

function loss = binarycrossentropy(Y,pairLabels)
    % binarycrossentropy accepts the network's prediction Y, the true
    % label, and pairLabels, and returns the binary cross-entropy loss value.
    
    % Get precision of prediction to prevent errors due to floating
    % point precision    
    precision = underlyingType(Y);
      
    % Convert values less than floating point precision to eps.
    Y(Y < eps(precision)) = eps(precision);
    %convert values between 1-eps and 1 to 1-eps.
    Y(Y > 1 - eps(precision)) = 1 - eps(precision);
    
    % Calculate binary cross-entropy loss for each pair
    loss = -pairLabels.*log(Y) - (1 - pairLabels).*log(1 - Y);
    
    % Sum over all pairs in minibatch and normalize.
    loss = sum(loss)/numel(pairLabels);
end

Создание пакетов пар изображений

Следующие функции создают рандомизированные пары изображений, которые похожи или отличаются друг от друга, на основе их меток. В этом примере функция getSiameseBatch введено в раздел «Создание пар похожих и непохожих изображений».

function [X1,X2,pairLabels] = getSiameseBatch(imds,miniBatchSize)
% getSiameseBatch returns a randomly selected batch or paired images. On
% average, this function produces a balanced set of similar and dissimilar
% pairs.

    pairLabels = zeros(1,miniBatchSize);
    imgSize = size(readimage(imds,1));
    X1 = zeros([imgSize 1 miniBatchSize]);
    X2 = zeros([imgSize 1 miniBatchSize]);

    for i = 1:miniBatchSize
        choice = rand(1);
        if choice < 0.5
            [pairIdx1,pairIdx2,pairLabels(i)] = getSimilarPair(imds.Labels);
        else
            [pairIdx1,pairIdx2,pairLabels(i)] = getDissimilarPair(imds.Labels);
        end
        X1(:,:,:,i) = imds.readimage(pairIdx1);
        X2(:,:,:,i) = imds.readimage(pairIdx2);
    end
end

function [pairIdx1,pairIdx2,pairLabel] = getSimilarPair(classLabel)
% getSimilarSiamesePair returns a random pair of indices for images
% that are in the same class and the similar pair label = 1.

    % Find all unique classes.
    classes = unique(classLabel);
    
    % Choose a class randomly which will be used to get a similar pair.
    classChoice = randi(numel(classes));
    
    % Find the indices of all the observations from the chosen class.
    idxs = find(classLabel==classes(classChoice));
    
    % Randomly choose two different images from the chosen class.
    pairIdxChoice = randperm(numel(idxs),2);
    pairIdx1 = idxs(pairIdxChoice(1));
    pairIdx2 = idxs(pairIdxChoice(2));
    pairLabel = 1;
end

function  [pairIdx1,pairIdx2,label] = getDissimilarPair(classLabel)
% getDissimilarSiamesePair returns a random pair of indices for images
% that are in different classes and the dissimilar pair label = 0.

    % Find all unique classes.
    classes = unique(classLabel);
    
    % Choose two different classes randomly which will be used to get a dissimilar pair.
    classesChoice = randperm(numel(classes),2);
    
    % Find the indices of all the observations from the first and second classes.
    idxs1 = find(classLabel==classes(classesChoice(1)));
    idxs2 = find(classLabel==classes(classesChoice(2)));
    
    % Randomly choose one image from each class.
    pairIdx1Choice = randi(numel(idxs1));
    pairIdx2Choice = randi(numel(idxs2));
    pairIdx1 = idxs1(pairIdx1Choice);
    pairIdx2 = idxs2(pairIdx2Choice);
    label = 0;
end

Ссылки

[1] Bromley, J., I. Guyon, Y. LeCunn, E. Säckinger, and R. Shah. «Проверка подписи с использованием» сиамской «нейронной сети с задержкой по времени». В трудах 6-й Международной конференции по нейронным системам обработки информации (NIPS 1993), 1994, pp737-744. Доступно при верификации подписи с помощью «сиамской» нейронной сети задержки на веб-сайте NIPS Processions.

[2] Wenpeg, Y., and H Schütze. Сверточная нейронная сеть для идентификации парафразов. В трудах 2015 года Конференция североамериканского отделения ACL, 2015, pp901-911. Доступно в сверточной нейронной сети для идентификации парафразов на веб-сайте Anthology ACL

[3] Lake, B. M., Salakhutdinov, R., and Tenenbaum, J. B. «Human-level concept learning through probabilistic program induction». Science, 350 (6266), (2015) pp1332-1338.

[4] Кох, Г., Земель, Р., и Салахутдинов, Р. (2015). Сиамские нейронные сети для распознавания изображений с одним снимком. В Трудах 32-й Международной конференции по машинному обучению, 37 (2015). Доступно в Siamese Neural Networks для одноразового распознавания изображений на веб-сайте ICML '15 .

См. также

| | | |

Похожие темы