Contenido principal

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

dlfeval

Evaluar modelos de deep learning para bucles de entrenamiento personalizados

Descripción

La función dlfeval evalúa modelos y funciones de deep learning con la diferenciación automática habilitada. Para calcular los gradientes, utilice la función dlgradient.

Sugerencia

Para la mayor parte de las tareas de deep learning, puede utilizar una red neuronal preentrenada y adaptarla a sus propios datos. Para ver un ejemplo de cómo usar la transferencia del aprendizaje para volver a entrenar una red neuronal convolucional para clasificar un nuevo conjunto de imágenes, consulte Retrain Neural Network to Classify New Images. Como alternativa, puede crear y entrenar redes neuronales desde cero usando las funciones trainnet y trainingOptions.

Si la función trainingOptions no proporciona las opciones de entrenamiento que necesita para la tarea, puede crear un bucle de entrenamiento personalizado mediante diferenciación automática. Para obtener más información, consulte Entrenar una red con un bucle de entrenamiento personalizado.

Si la función trainnet no proporciona la función de pérdida que necesita para la tarea, puede especificar una función de pérdida personalizada para trainnet como identificador de función. Para las funciones de pérdida que requieren más entradas que las predicciones y los objetivos (por ejemplo, funciones de pérdida que requieren acceso a la red neuronal o entradas adicionales), entrene el modelo usando un bucle de entrenamiento personalizado. Para obtener más información, consulte Entrenar una red con un bucle de entrenamiento personalizado.

Si Deep Learning Toolbox™ no proporciona las capas que necesita para la tarea, puede crear una capa personalizada. Para obtener más información, consulte Definir capas de deep learning personalizadas. Para los modelos que no se pueden especificar como redes de capas, puede definir el modelo como una función. Para obtener más información, consulte Train Network Using Model Function.

Para obtener más información sobre qué método de entrenamiento usar para cada tarea, consulte Train Deep Learning Model in MATLAB.

[y1,...,yk] = dlfeval(fun,x1,...,xn) evalúa la función de arreglos de deep learning fun en los argumentos de entrada x1,...,xn. Las funciones pasadas a dlfeval pueden contener llamadas a dlgradient, que calculan los gradientes de las entradas x1,...,xn con diferenciación automática.

ejemplo

Ejemplos

contraer todo

La función de Rosenbrock es una función de prueba estándar para optimización. La función de ayuda rosenbrock.m calcula el valor de la función y usa la diferenciación automática para calcular su gradiente.

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

Para evaluar la función de Rosenbrock y su gradiente en el punto [–1,2], cree un objeto dlarray del punto y, después, llame a dlfeval en el identificador de función @rosenbrock.

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

   104

gradval = 
  1x2 dlarray

   396   200

De manera alternativa, defina la función de Rosenbrock como una función de dos entradas, x1 y 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

Llame a dlfeval para evaluar rosenbrock2 en dos argumentos de dlarray que representan las entradas –1 y 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

Represente el gradiente de la función de Rosenbrock para varios puntos en el cuadrado de la unidad. Primero, inicialice los arreglos que representan los puntos de evaluación y la salida de la función.

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

Evalúe la función en un bucle. Represente el resultado utilizando 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 with xlabel x1, ylabel x2 contains an object of type quiver.

Use dlgradient y dlfeval para calcular el valor y el gradiente de una función que implica números complejos. Puede calcular gradientes complejos o restringir los gradientes a solo números reales.

Defina la función complexFun, que se enumera al final de este ejemplo. Esta función implementa la siguiente fórmula compleja:

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

Defina la función gradFun, que se enumera al final de este ejemplo. Esta función llama a complexFun y usa dlgradient para calcular el gradiente del resultado con respecto a la entrada. Para la diferenciación automática, el valor para diferenciar, es decir, el valor de la función calculado a partir de la entrada, debe ser un escalar real, por lo que la función toma la suma de la parte real del resultado antes de calcular el gradiente. La función devuelve la parte real del valor de la función y del gradiente, que puede ser complejo.

Defina los puntos de muestra sobre el plano complejo entre -2 y 2 y -2i y 2i y conviértalos a dlarray.

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

Calcule el valor de la función y del gradiente en cada punto de muestra.

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

Defina los puntos de muestra en los que mostrar el gradiente.

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

Extraiga los valores del gradiente en esos puntos de muestra.

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

Represente los resultados. Use imagesc para mostrar el valor de la función sobre el plano complejo. Use quiver para mostrar la dirección y la magnitud del gradiente.

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")

El gradiente de la función es el mismo en todo el plano complejo. Extraiga el valor del gradiente calculado mediante diferenciación automática.

grad(1,1)
ans = 
  1×1 dlarray

   2.0000 - 3.0000i

Si la examina, la derivada compleja de la función tiene el valor

df(x)dx=2+3i

Sin embargo, la función Re(f(x)) no es analítica y, por lo tanto, no se define ninguna derivada compleja. Para la diferenciación automática en MATLAB, el valor que se desea diferenciar debe ser siempre real y, por lo tanto, la función nunca puede ser analítica compleja. En su lugar, la derivada se calcula de modo que el gradiente devuelto apunte en la dirección del ascenso más pronunciado, tal como se ve en la gráfica. Esto se hace interpretando la función Re(f(x)): C R como una función Re(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

Argumentos de entrada

contraer todo

Función que se desea evaluar, especificada como identificador de función. Si fun incluye una llamada a dlgradient, dlfeval evalúa el gradiente usando la diferenciación automática. En esta evaluación del gradiente, cada argumento de la llamada a dlgradient debe ser un objeto dlarray o un arreglo de celdas, estructura o tabla que contenga un dlarray. El número de argumentos de entrada para dlfeval debe ser el mismo que el número de argumentos de entrada para fun.

Ejemplo: @rosenbrock

Tipos de datos: function_handle

Argumentos de funciones, especificados como cualquier tipo de datos de MATLAB o un objeto dlnetwork. Los objetos dlnetwork cuantificados no son compatibles.

Un argumento de entrada xj, que es una variable de diferenciación en una llamada a dlgradient, debe ser un objeto dlarray rastreado o un arreglo de celdas, estructura o tabla que contenga un dlarray rastreado. Una variable adicional, como un hiperparámetro o un arreglo de datos constante, no tiene que ser necesariamente un objeto dlarray.

Para evaluar gradientes para deep learning, puede proporcionar un objeto dlnetwork como un argumento de funciones y evaluar el pase hacia delante de la red dentro de fun.

Ejemplo: dlarray([1 2;3 4])

Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
Soporte de números complejos:

Argumentos de salida

contraer todo

Salidas de funciones, devueltas como cualquier tipo de datos. Si la salida se genera a partir de una llamada a dlgradient, la salida es un objeto dlarray.

Sugerencias

Algoritmos

contraer todo

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2019b