Assumirei por C1
, C2
etc, você quer dizer camadas convolucionais e por P1
, P2
você quer dizer camadas de pool e FC
significa camadas totalmente conectadas.
Podemos calcular a memória necessária para um encaminhamento como este:
Uma imagem
Se você estiver trabalhando com valores float32, siga o link fornecido acima por @Alexandru Burlacu:
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 <- Esse é um problema (e minha aproximação é um palpite bastante ondulado aqui). Em vez de trabalhar com 50, 25, '12 .5 ', faria mais sentido trabalhar com múltiplos de 32. Ouvi dizer que trabalhar com múltiplos de 32 também é mais eficiente do ponto de vista da memória. A razão pela qual essa é uma má idéia é que o pool 2x2 não divide o espaço adequadamente, tanto quanto eu posso dizer. Sinta-se livre para me corrigir se eu estiver errado.
FC
: 1x500 = 500 = 0,5K
Output
: 1 x 10 = 10 = 0,01K (quase nada)
Memória total: 7,5K + 80K + 20K + 40K + 0,5K = 157,2K * 4 bytes = 628,8 KB
Isso é para uma imagem.
Minibatch
Se você estiver trabalhando com um tamanho de minibatch de 64, estará lendo 64 deles na memória de uma só vez e executando as operações juntas, dimensionando tudo da seguinte maneira:
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 (não nos importamos, isso é minúsculo)
Memória total: 10M x 4 bytes ~ 40MB (estou dizendo aproximado porque o site também indica um valor aproximado)
EDIT: Eu li mal o site, desculpe.
Segundo o site, um passe para trás exige aproximadamente o triplo disso, devido à necessidade de armazenar:
as ativações e gradientes associados a cada neurônio - são de tamanho igual;
os gradientes dos pesos (parâmetros) que são do mesmo tamanho que os parâmetros;
o valor do momento, se você estiver usando;
algum tipo de memória diversa (não entendo essa parte)
C1
acima, você tem,50x50x32
mas esses seriam apenas os valores para os mapas de ativação da camada, e os valores aprendidos (32x3x3
) dentro do próprio kernel?