dlfeval

Оцените модель глубокого обучения для пользовательских учебных циклов

Описание

Использование dlfeval оценивать пользовательские модели глубокого обучения для пользовательских учебных циклов.

Совет

Для большинства задач глубокого обучения можно использовать предварительно обученную сеть и адаптировать ее к собственным данным. Для примера, показывающего, как использовать передачу обучения, чтобы переобучить сверточную нейронную сеть, чтобы классифицировать новый набор изображений, смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения. В качестве альтернативы можно создать и обучить нейронные сети с нуля с помощью layerGraph объекты с trainNetwork и trainingOptions функции.

Если trainingOptions функция не обеспечивает опции обучения, в которых вы нуждаетесь для своей задачи, затем можно создать пользовательский учебный цикл с помощью автоматического дифференцирования. Чтобы узнать больше, смотрите, Задают Нейронную сеть для глубокого обучения для Пользовательских Учебных Циклов.

пример

[y1,...,yk] = dlfeval(fun,x1,...,xn) оценивает функцию массива глубокого обучения fun во входных параметрах x1,...,xn. Функции передали dlfeval может содержать вызовы dlgradient, которые вычисляют градиенты из входных параметров x1,...,xn при помощи автоматического дифференцирования.

Примеры

свернуть все

Функция Розенброка является стандартной тестовой функцией для оптимизации. rosenbrock.m функция помощника вычисляет значение функции и использует автоматическое дифференцирование, чтобы вычислить его градиент.

type rosenbrock.m
function [y,dydx] = rosenbrock(x)

y = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2;
dydx = dlgradient(y,x);

end

Выполнять функцию Розенброка и ее градиент в точке [–1,2], создайте dlarray из точки и затем вызывают dlfeval на указателе на функцию @rosenbrock.

x0 = dlarray([-1,2]);
[fval,gradval] = dlfeval(@rosenbrock,x0)
fval = 
  1x1 dlarray

   104

gradval = 
  1x2 dlarray

   396   200

В качестве альтернативы задайте функцию Розенброка в зависимости от двух входных параметров, x1 и x2.

type rosenbrock2.m
function [y,dydx1,dydx2] = rosenbrock2(x1,x2)

y = 100*(x2 - x1.^2).^2 + (1 - x1).^2;
[dydx1,dydx2] = dlgradient(y,x1,x2);

end

Вызовите dlfeval оценивать rosenbrock2 на двух dlarray аргументы, представляющие входные параметры –1 и 2.

x1 = dlarray(-1);
x2 = dlarray(2);
[fval,dydx1,dydx2] = dlfeval(@rosenbrock2,x1,x2)
fval = 
  1x1 dlarray

   104

dydx1 = 
  1x1 dlarray

   396

dydx2 = 
  1x1 dlarray

   200

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

[X1 X2] = meshgrid(linspace(0,1,10));
X1 = dlarray(X1(:));
X2 = dlarray(X2(:));
Y = dlarray(zeros(size(X1)));
DYDX1 = Y;
DYDX2 = Y;

Выполните функцию в цикле. Постройте результат с помощью quiver.

for i = 1:length(X1)
    [Y(i),DYDX1(i),DYDX2(i)] = dlfeval(@rosenbrock2,X1(i),X2(i));
end
quiver(extractdata(X1),extractdata(X2),extractdata(DYDX1),extractdata(DYDX2))
xlabel('x1')
ylabel('x2')

Figure contains an axes object. The axes object contains an object of type quiver.

Используйте dlgradient и dlfeval вычислить значение и градиент функции, которая включает комплексные числа. Можно вычислить комплексные градиенты или ограничить градиенты вещественными числами только.

Задайте функциональный complexFun, перечисленный в конце этого примера. Эта функция реализует следующую сложную формулу:

f(x)=(2+3i)x

Задайте функциональный gradFun, перечисленный в конце этого примера. Это вызовы функции complexFun и использование dlgradient вычислить градиент результата относительно входа. Для автоматического дифференцирования, значение, чтобы дифференцироваться — i.e., значение функции, вычисленной от входа — должно быть действительным скаляром, таким образом, функция берет сумму действительной части результата прежде, чем вычислить градиент. Функция возвращает действительную часть значения функции и градиента, который может быть комплексным.

Задайте точки выборки по комплексной плоскости между-2 и 2 и-2i и 2i и преобразуйте в dlarray.

functionRes = linspace(-2,2,100);
x = functionRes + 1i*functionRes.';
x = dlarray(x);

Вычислите значение функции и градиент в каждой точке выборки.

[y, grad] = dlfeval(@gradFun,x);
y = extractdata(y);

Задайте точки выборки, в которых можно отобразить градиент.

gradientRes = linspace(-2,2,11);
xGrad = gradientRes + 1i*gradientRes.';

Извлеките значения градиента в этих точках выборки.

[~,gradPlot] = dlfeval(@gradFun,dlarray(xGrad));
gradPlot = extractdata(gradPlot);

Постройте график результатов. Используйте imagesc показать значение функции по комплексной плоскости. Используйте quiver показать направление и величину градиента.

imagesc([-2,2],[-2,2],y);
axis xy
colorbar
hold on
quiver(real(xGrad),imag(xGrad),real(gradPlot),imag(gradPlot),"k");
xlabel("Real")
ylabel("Imaginary")
title("Real Value and Gradient","Re$(f(x)) = $ Re$((2+3i)x)$","interpreter","latex")

Figure contains an axes object. The axes object with title Real Value and Gradient contains 2 objects of type image, quiver.

Градиент функции является тем же самым через целую комплексную плоскость. Извлеките значение градиента, вычисленного автоматическим differentation.

grad(1,1)
ans = 
  1x1 dlarray

   2.0000 - 3.0000i

Контролем комплексная производная функции имеет значение

df(x)dx=2+3i

Однако функциональное Ре (f(x)) не аналитично, и поэтому никакая комплексная производная не задана. Для автоматического дифференцирования в MATLAB значение, чтобы дифференцироваться должно всегда быть действительным, и поэтому функция никогда не может быть комплексная аналитичный. Вместо этого производная вычисляется таким образом, что возвращенный градиент указывает в направлении самого крутого подъема, как замечено в графике. Это сделано путем интерпретации функционального Ре(f(x))C R как функциональное Ре(f(xR+ixI))R × R R.

function y = complexFun(x)
    y = (2+3i)*x;    
end

function [y,grad] = gradFun(x)
    y = complexFun(x);
    y = real(y);

    grad = dlgradient(sum(y,"all"),x);
end

Входные параметры

свернуть все

Функция, чтобы оценить в виде указателя на функцию. Если fun включает dlgradient вызовите, затем dlfeval оценивает градиент при помощи автоматического дифференцирования. В этой оценке градиента, каждом аргументе dlgradient вызовом должен быть dlarray или массив ячеек, структура или таблица, содержащая dlarray. Количество входных параметров к dlfeval должен совпасть с количеством входных параметров к fun.

Пример: @rosenbrock

Типы данных: function_handle

Аргументы функции в виде любого типа данных MATLAB или dlnetwork объект.

Входной параметр xj это - переменная дифференцирования в a dlgradient вызовом должен быть прослеженный dlarray или массив ячеек, структура или таблица, содержащая прослеженный dlarray. Дополнительной переменной, такой как гиперпараметр или постоянный массив данных не должен быть dlarray.

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

Пример: dlarray([1 2;3 4])

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
Поддержка комплексного числа: Да

Выходные аргументы

свернуть все

Функциональные выходные параметры, возвращенные как любой тип данных. Если выход следует a dlgradient вызовите, выходом является dlarray.

Советы

Расширенные возможности

Введенный в R2019b