В этом примере показано, как обучить сиамскую сеть идентифицировать аналогичные изображения рукописных символов.
Сиамская сеть - это тип нейронной сети для глубокого обучения, которая использует две или более идентичных подсетей, которые имеют одинаковую архитектуру и имеют одинаковые параметры и веса. Сиамские сети обычно используются в задачах, которые включают нахождение связи между двумя сопоставимыми вещами. Некоторые распространенные приложения для сиамских сетей включают распознавание лиц, верификацию подписей [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
что изображения похожи. Потеря определяется двоичной перекрестной энтропией между предсказанным счетом и истинным значением метки:
где true label может быть 0 или 1 и - предсказанная метка.
Задайте опции, которые будут использоваться во время обучения. Обучите для 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 .
adamupdate
| dlarray
| dlfeval
| dlgradient
| dlnetwork