@StatsSorceress TL; DR:
Estou passando por essa atividade para ver se consigo calcular a memória necessária:
Ativações: 532.752 * 2 * 4 / (1024 ^ 2) = 4,06 MB
Parâmetros: 19,072,984 * 4 / (1024 ^ 2) * 3 = 218,27 MB
Diversos: 128 * 9.000 * 4 / (1024 ^ 2) = 4,39 MB
Memória total: (4,06 * 128 ) + 218,27 + 4,39 = 742,34 MB
( Alguém, por favor, me corrija se estiver errado. Para sua informação, você já multiplicou por 128, por isso não o multipliquei por 128 acima )
Eu indicaria este artigo e o vídeo correspondente . Eles me ajudaram a entender o que está acontecendo muito melhor.
NOTA: A memória necessária para usar uma rede para previsões é muito menor que a necessária para o treinamento por dois motivos:
- Ao prever, enviamos apenas uma imagem para a frente pela rede e não para trás (para não multiplicarmos a memória X 3; veja abaixo)
- Há uma previsão por imagem (portanto, não precisamos multiplicar a memória necessária para uma imagem por um tamanho de lote, porque não usamos lotes na previsão).
Processo (Memória a Treinar)
- Calcule a memória necessária para treinar em uma imagem
- Multiplique esse número pelo número de imagens em seu lote
( LEMBRE-SE: o mini-lote diz que pegamos um subconjunto de nossos dados, calculamos os gradientes e os erros de cada imagem no subconjunto, calculamos a média e avançamos na direção da média. Para convnets, pesos e preconceitos são compartilhados, mas o número de ativações é multiplicado pelo número de imagens no lote. ).
PASSO 1: Memória para 1 imagem
Para treinar uma imagem, você deve reservar memória para:
Parâmetros do modelo:
Os pesos e desvios em cada camada, seus gradientes e suas variáveis de momento (se forem utilizados otimizadores Adam, Adagrad, RMSProp etc., otimizadores)
Para aproximar a memória, calcule a memória necessária para armazenar os pesos e desvios e multiplique por 3 (ou seja, "por 3" porque estamos dizendo que a quantidade de memória necessária para armazenar os pesos e desvios é (aproximadamente) igual a necessário para os gradientes e para as variáveis de momento)
EQUAÇÕES:
Convoluções:
pesos (n) = profundidade (n) * (largura do kernel * altura do kernel) * profundidade (n-1)
vieses (n) = profundidade (n)
Camadas (densas) totalmente conectadas:
pesos (n) = saídas (n) * entradas (n)
vieses (n) = saídas (n)
onde n é a camada atual e n-1 é a camada anterior, e saídas são o número de saídas da camada FC e entradas são o número de entradas para a camada FC (se a camada anterior não for uma camada totalmente conectada, o número de entradas é igual ao tamanho dessa camada achatada).
OBSERVAÇÃO: A memória apenas para pesos e preconceitos, além da memória para as ativações de uma imagem (veja abaixo), é a quantidade total de memória necessária para previsões (excluindo algumas despesas gerais de memória para convoluções e outras coisas).
- Ativações (são "Blobs" no Caffe):
(Estou usando termos vagos aqui, tenha paciência comigo)
Cada convolução em uma camada de convolução produz ativações de " número de pixels na imagem " (ou seja, você passa uma imagem através de uma única convolução, obtém um único mapa de recursos que consiste em ativações " m ", em que " m " é o número de pixels da sua imagem / entrada).
Para camadas totalmente conectadas, o número de ativações produzidas é igual ao tamanho da sua saída.
Convoluções:
ativações (n) = largura_imagem * altura_imagem * número_imagem_canais
Camadas (densas) totalmente conectadas:
ativações (n) = saídas (n)
Observe que sua entrada é realmente apenas uma imagem no início da rede. Após as convoluções, ele se transforma em outra coisa (mapas de recursos). Então, substitua "largura_de_imagem", "altura_de_imagem" e "número_de_imagem" por "largura_de_ entrada", "altura_de entrada" e "profundidade_cama" para ser mais preciso. (É mais fácil para mim pensar nesse conceito em termos de imagens.)
Como também precisamos armazenar o erro para as ativações em cada camada (usada na passagem para trás), multiplicamos o número de ativações por 2 para obter o número total de entidades que precisamos abrir espaço em nosso espaço de armazenamento. O número de ativações aumenta com o número de imagens no lote, portanto você multiplica esse número pelo tamanho do lote.
PASSO 2: Memória para Treinar Lote
Soma o número de pesos e desvios (vezes 3) e o número de ativações (vezes 2 vezes o tamanho do lote). Multiplique isso por 4 e você obterá o número de bytes necessários para treinar o lote. Você pode dividir por 1024 ^ 2 para obter a resposta em GB.