В этом примере показано, как обучить сиамскую сеть, чтобы идентифицировать подобные изображения рукописных символов.
Сиамская сеть является типом нейронной сети для глубокого обучения, которая использует две или больше идентичных подсети, которые имеют ту же архитектуру и совместно используют те же параметры и веса. Сиамские сети обычно используются в задачах, которые включают нахождение отношения между двумя сопоставимыми вещами. Некоторые распространенные приложения для сиамских сетей включают распознавание лиц, верификацию подписи [1], или перефразируют идентификацию [2]. Сиамские сети выполняют хорошо в этих задачах, потому что их разделяемые веса означают, что существует меньше параметров, чтобы учиться во время обучения, и они могут привести к хорошим результатам с относительно небольшим количеством обучающих данных.
Сиамские сети особенно полезны в случаях, где существуют большие количества классов с небольшими числами наблюдений за каждым. В таких случаях существует недостаточно данных, чтобы обучить глубокую сверточную нейронную сеть классифицировать изображения в эти классы. Вместо этого сиамская сеть может определить, находятся ли два изображения в том же классе.
Это использование в качестве примера набор данных Omniglot [3], чтобы обучить сиамскую сеть, чтобы сравнить изображения рукописных символов [4]. Набор данных Omniglot содержит наборы символов для 50 алфавитов, разделенных на 30 используемых для обучения и 20 для тестирования. Каждый алфавит содержит много символов от 14 для Ojibwe (абориген Canadia Саллэбикс) к 55 для Tifinagh. Наконец, каждый символ имеет 20 рукописных наблюдений. Этот пример обучает сеть, чтобы идентифицировать, являются ли два рукописных наблюдения различными экземплярами того же символа.
Можно также использовать сиамские сети, чтобы идентифицировать подобные изображения с помощью сокращения размерности. Для примера смотрите, Обучают сиамскую Сеть для Сокращения Размерности.
Загрузите и извлеките обучающий набор данных Omniglot.
url = "https://github.com/brendenlake/omniglot/raw/master/python/images_background.zip"; downloadFolder = tempdir; filename = fullfile(downloadFolder,"images_background.zip"); trainingSetFolder = fullfile(downloadFolder,'images_background'); if ~exist(trainingSetFolder,"dir") disp("Downloading Omniglot training data (4.5 MB)...") websave(filename,url); unzip(filename,downloadFolder); end disp("Training data downloaded.")
Training data downloaded.
Используйте функциональный omniglotImageDatastore
(заданный в разделе Supporting Functions этого примера), чтобы загрузить обучающие данные как ImageDatastore
объект и набор метка класса для каждого изображения на основе пути к файлу.
imds = omniglotImageDatastore(trainingSetFolder);
Обучающий набор данных Omniglot состоит из черных и белых рукописных символов от 30 алфавитов с 20 наблюдениями за каждым символом. Изображения имеют размер 105 105 1, и значения каждого пикселя между 0
и 1
.
Отобразите случайный выбор изображений.
idxs = randperm(numel(imds.Files),8); for i = 1:numel(idxs) subplot(4,2,i) imshow(readimage(imds,idxs(i))) title(imds.Labels(idxs(i)), "Interpreter","none"); end
Чтобы обучить сеть, данные должны быть сгруппированы в пары изображений, которые или подобны или отличаются. Здесь, подобные изображения являются различными рукописными экземплярами того же символа, которые имеют ту же метку, в то время как отличающиеся изображения различных символов имеют различные метки. Функциональный getSiameseBatch
(заданный в разделе Supporting Functions этого примера), создает рандомизированные пары подобных или отличающихся изображений, pairImage1
и pairImage2
. Функция также возвращает метку pairLabel
, который идентифицирует, подобна ли пара изображений или отличается друг от друга. Подобные пары изображений имеют pairLabel = 1
, в то время как отличающиеся пары имеют pairLabel = 0
.
Как пример, создайте маленький представительный набор пяти пар изображений
batchSize = 10; [pairImage1,pairImage2,pairLabel] = getSiameseBatch(imds,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 парных изображений создается для каждой итерации учебного цикла. Это гарантирует, что сеть обучена на большом количестве случайных пар изображений приблизительно с равными пропорциями подобных и отличающихся пар.
Сиамская сеть achitecture проиллюстрирована в следующей схеме.
Чтобы сравнить два изображения, каждое изображение передается через одну из двух идентичных подсетей та доля веса. Подсети преобразуют каждого 105 105 1 изображением к 4096-мерному характеристическому вектору. Изображения того же класса имеют подобные 4096-мерные представления.. Выходные характеристические векторы от каждой подсети объединены посредством вычитания, и результат передается через fullyconnect
операция с одним выходом. sigmoid
операция преобразует это значение в вероятность между 0
и 1
, указание на прогноз сети того, подобны ли изображения или отличаются. Бинарная перекрестная энтропийная потеря между сетевым прогнозом и истинной меткой используется, чтобы обновить сеть во время обучения.
В этом примере две идентичных подсети заданы как dlnetwork
объект. Итоговый fullyconnect
и sigmoid
операции выполняются как функциональные операции на подсети выходные параметры.
Создайте подсеть как серию слоев, которая принимает 105 105 1 изображением и выводит характеристический вектор размера 4096.
Для convolution2dLayer
объекты, используйте узкое нормальное распределение, чтобы инициализировать веса и смещение.
Для maxPooling2dLayer
объекты, набор шаг к 2
.
Для итогового fullyConnectedLayer
возразите, задайте выходной размер 4 096 и используйте узкое нормальное распределение, чтобы инициализировать веса и смещение.
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
(заданный в разделе Supporting Functions этого примера), который задает как две подсети и вычитание, fullyconnect,
и sigmoid
операции объединены. Функциональный forwardSiamese
принимает сеть, структура, содержащая параметры для fullyconnect
операция и два учебных изображения. forwardSiamese
функционируйте выводит прогноз о подобии двух изображений.
Создайте функциональный modelGradients
(заданный в разделе Supporting Functions этого примера). modelGradients
функционируйте берет сиамскую подсеть dlnet
, структура параметра для fullyconnect
операция и мини-пакет входных данных X1
и X2
с там маркирует pairLabels
. Функция возвращает значения потерь и градиенты потери относительно learnable параметров сети.
Цель сиамской сети состоит в том, чтобы отличить между двумя входными параметрами X1
и X2
. Выход сети является вероятностью между 0
и 1
, где значение ближе к 0
указывает на прогноз, что изображения отличаются, и значение ближе к 1
то, что изображения подобны. Потеря дана бинарной перекрестной энтропией между предсказанным счетом и истинным значением метки:
где истинная метка может быть 0 или 1 и предсказанная метка.
Задайте опции, чтобы использовать во время обучения. Обучайтесь для 10 000 итераций.
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™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Автоматически обнаружить, если вы имеете графический процессор в наличии и помещаете соответствующие данные по графическому процессору, устанавливаете значение 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
функция, определяемая в разделе Create Batches of Image Pairs.
Преобразуйте данные в 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(imds,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. Используйте функциональный omniglotImageDatastore
загружать тестовые данные как ImageDatastore
объект и набор метка класса для каждого изображения на основе пути к файлу.
url = 'https://github.com/brendenlake/omniglot/raw/master/python/images_evaluation.zip'; downloadFolder = tempdir; filename = fullfile(downloadFolder,'images_evaluation.zip'); testingSetFolder = fullfile(downloadFolder,'images_evaluation'); if ~exist(testingSetFolder,'dir') disp('Downloading Omniglot test data (3.2 MB)...') websave(filename,url); unzip(filename,downloadFolder); end disp("Test data downloaded.")
Test data downloaded.
imdsTest = omniglotImageDatastore(testingSetFolder);
Тестовый набор данных содержит 20 алфавитов, которые отличаются от тех, на которых была обучена сеть. Всего, там 659 различных классов в тестовом наборе данных.
numClasses = numel(unique(imdsTest.Labels))
numClasses = 659
Чтобы вычислить точность сети, создайте набор пяти случайных мини-пакетов тестовых пар. Используйте predictSiamese
функция (заданный в разделе Supporting Functions этого примера), чтобы оценить сетевые прогнозы и вычислить среднюю точность по мини-пакетам.
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 accuracye 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
введен в разделе Define Network Architecture.
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
функция, becasue некоторые слои глубокого обучения ведут себя по-другому во время обучения и прогноза. В этом примере, функциональном predictSiamese
введен в разделе Evaluate the Accuracy Сети.
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 the 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
, и метка, указывающая, подобны ли они или отличаются. Функция возвращает градиенты потери относительно learnable параметров в сети и бинарной перекрестной энтропийной потери между прогнозом и основной истиной. В этом примере, функциональном 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, pairLabels, and returns the binary cross-entropy loss value. % Get the precision of the prediction to prevent errors due to floating % point precision y = extractdata(Y); if(isa(y,'gpuArray')) precision = classUnderlying(y); else precision = class(y); end % 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
введен в разделе Create Pairs of Similar и Dissimilar Images.
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
Следующая функция загружает данные Omniglot из местоположения загрузки в ImageDatastore и устанавливает метки класса, установлены на основе путей к файлам. В этом примере, функциональном omniglotImageDatastore
введен в разделе Load и Preprocess Training Data.
function imds = omniglotImageDatastore(path) % omniglotImageDatastore accepts the folder path to the Omniglot % dataset, loads the data into MATLAB as an ImageDatastore object and % labels the images based on the file paths. % Load the data as an ImageDatastore object imds = imageDatastore(path,'IncludeSubfolders',true,'LabelSource','none'); % Generate labels for each image from the names of the last two % directories for that image location files = string(imds.Files); parts = split(files,filesep); labels = join(parts(:,(end-2):(end-1)),'_'); imds.Labels = categorical(labels); end
[1] Бромли, J. i. Guyon, И. Леканн, Э. Зекингер и Р. Шах. "Верификация подписи с помощью "сиамской" Нейронной сети С временной задержкой". В Продолжениях 6-й Международной конференции по вопросам Нейронных Систем обработки информации (NIPS 1993), 1994, pp737-744. Доступный при Верификации Подписи с помощью "сиамской" Нейронной сети С временной задержкой на веб-сайте Продолжений NIPS.
[2] Wenpeg, Y. и H Schütze. "Сверточная нейронная сеть для Идентификации Пересказа". В Продолжениях 2 015 Конференций североамериканского Cahapter ACL, 2015, pp901-911. Доступный в Сверточной нейронной сети для Идентификации Пересказа на веб-сайте Антологии ACL
[3] Озеро, B. M. Салахутдинов, R. и Tenenbaum, J. B. "Концепция человеческого уровня, учащаяся посредством вероятностной индукции программы". Наука, 350 (6266), (2015) pp1332-1338.
[4] Кох, G., Zemel, R. и Салахутдинов, R. (2015). "Сиамские нейронные сети для распознавания изображений с одним выстрелом". В Продолжениях 32-й Международной конференции по вопросам Машинного обучения, 37 (2015). Доступный в сиамских Нейронных сетях для Распознавания Изображений С одним выстрелом на ICML '15 веб-сайтов.
adamupdate
| dlarray
| dlfeval
| dlgradient
| dlnetwork