dlfeval

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

Описание

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

Совет

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

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

пример

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

Примеры

свернуть все

Функция Розенбрка является стандартной тестовой функцией для оптимизации. The 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 и x 2.

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. The axes contains an object of type quiver.

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

свернуть все

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

Пример: @rosenbrock

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

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

Система входного параметра xj что является переменной дифференциации в 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