Voy a suponer por C1
, C2
, etc, que quiere decir capas convolucionales, y por P1
, P2
ustedes capas medias de fondo común, y FC
medios capas totalmente conectadas.
Podemos calcular la memoria requerida para un pase hacia adelante como este:
Una imagen
Si está trabajando con valores float32, siga el enlace proporcionado anteriormente por @Alexandru Burlacu que tiene:
Input
: 50x50x3 = 7,500 = 7.5K
C1
: 50x50x32 = 80,000 = 80K
P1
: 25x25x32 = 20,000 = 20K
C2
: 25x25x64 = 40,000 = 40K
P2
: 12x12x64 = 9,216 = 9.2K <- Esto es un problema (y mi aproximación es una suposición muy ondulada aquí). En lugar de trabajar con 50, 25, '12 .5 ', tendría más sentido trabajar con múltiplos de 32. He oído que trabajar con múltiplos de 32 también es más eficiente desde el punto de vista de la memoria. La razón por la que es una mala idea es que la agrupación de 2x2 no divide el espacio correctamente, por lo que puedo decir. Siéntete libre de corregirme si me equivoco.
FC
: 1x500 = 500 = 0.5K
Output
: 1 x 10 = 10 = 0.01K (casi nada)
Memoria total: 7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 bytes = 628.8 KB
Eso es para una imagen.
Minibatch
Si está trabajando con un tamaño de minibatch de 64, está leyendo 64 de estos en la memoria a la vez y realizando todas las operaciones juntas, ampliando todo de esta manera:
Input
: 64x50x50x3 = 480,000 = 480K = 0.48M
C1
: 64x50x50x32 = 5,120,000 = 5.12M
P1
: 64x25x25x32 = 1,280,000 = 1.28M
C2
: 64x25x25x64 = 2,560,000 = 2.56M
P2
: 64x12x12x64 = 589,824 = 590K = 0.59M
FC
: 64x500 = 32,000 = 32K = 0.032M
Output
: 1x10x64 = 640 = 0.64K = 0.00064M (no nos importa, esto es pequeño)
Memoria total: 10M x 4 bytes ~ 40MB (digo aproximado porque el sitio web también dice un valor aproximado)
EDITAR: leí mal el sitio web, lo siento.
Según el sitio web, un pase hacia atrás requiere aproximadamente el triple, debido a la necesidad de almacenar:
las activaciones y los gradientes asociados para cada neurona: son del mismo tamaño;
los gradientes de los pesos (parámetros) que son del mismo tamaño que los parámetros;
el valor del impulso, si lo estás usando;
algún tipo de memoria miscelánea (no entiendo esta parte)
C1
superior que tiene,50x50x32
pero esos serían solo los valores para los mapas de activación de capa, ¿qué pasa con los valores aprendidos (32x3x3
) dentro del núcleo mismo?