@StatsSorceress TL; DR :
이 활동을 수행하여 필요한 메모리를 직접 계산할 수 있는지 확인합니다.
활성화 : 532,752 * 2 * 4 / (1024 ^ 2) = 4.06 MB
매개 변수 : 19,072,984 * 4 / (1024 ^ 2) * 3 = 218.27MB
기타 : 128 * 9,000 * 4 / (1024 ^ 2) = 4.39MB
총 메모리 : (4.06 * 128 ) + 218.27 + 4.39 = 742.34 MB
( 내가 틀렸다면 누군가 나를 수정하십시오. 참고로, 당신은 이미 기타에 128을 곱했기 때문에 위의 128을 곱하지 않은 이유입니다 )
이 기사 와 해당 비디오 를 알려 드리겠습니다 . 그들은 내가 더 잘 진행되고있는 것을 이해하도록 도와주었습니다.
참고 : 예측에 네트워크를 사용하는 데 필요한 메모리는 다음 두 가지 이유로 훈련에 필요한 메모리보다 훨씬 작습니다.
- 예측할 때 네트워크를 통해 이미지를 앞으로 만 전송하고 뒤로는 전송하지 않습니다 (따라서 메모리 X 3을 곱하지는 않습니다. 아래 참조).
- 이미지 당 하나의 예측이 있습니다 (따라서 예측에 배치를 사용하지 않기 때문에 하나의 이미지에 필요한 메모리에 배치 크기를 곱할 필요가 없습니다).
프로세스 (트레이닝 할 메모리)
- 하나의 이미지를 학습하는 데 필요한 메모리 계산
- 이 숫자에 배치의 이미지 수를 곱 하십시오.
( 기억하세요 : 미니 배치는 데이터의 서브 세트를 가져 와서 서브 세트의 각 이미지에 대한 그라디언트 및 오류를 계산 한 다음 이들을 평균화하고 평균 방향으로 진행한다고 말합니다. convnets의 경우 가중치와 바이어스는 공유되지만 활성화 횟수는 배치의 이미지 수에 따라 제한됩니다. ).
1 단계 : 1 개의 이미지를위한 메모리
하나의 이미지를 훈련 시키려면 다음을 위해 메모리를 예약해야합니다.
모델 매개 변수 :
각 레이어 의 가중치 및 바이어스 , 그레디언트 및 모멘텀 변수 (Adam, Adagrad, RMSProp 등의 경우 옵티마이 저가 사용 된 경우)
이를 위해 메모리를 근사화하려면 가중치와 바이어스를 저장하는 데 필요한 메모리를 계산하고 가중치와 바이어스를 저장하는 데 필요한 메모리의 양이 (대략) 같다고 말하므로 3을 곱합니다 (예 : "3"). 그라디언트 및 운동량 변수에 필요한 것)
방정식 :
컨볼 루션 :
가중치 (n) = 깊이 (n) * (kernel_width * kernel_height) * 깊이 (n-1)
치우침 (n) = 깊이 (n)
완전히 연결된 (고밀도) 레이어 :
가중치 (n) = 출력 (n) * 입력 (n)
바이어스 (n) = 출력 (n)
여기서 n 은 현재 레이어이고 n-1 은 이전 레이어이고 출력 은 FC 레이어의 출력 수이고 입력 은 FC 레이어 의 입력 수입니다 (이전 레이어가 완전히 연결된 레이어가 아닌 경우, 입력 수는 평평한 레이어의 크기와 같습니다).
참고 : 가중치 및 바이어스 전용 메모리와 하나의 이미지에 대한 활성화 메모리 (아래 참조)는 예측에 필요한 총 메모리 양입니다 (볼록 및 기타 사항에 대한 메모리 오버 헤드 제외).
(여기서 용어를 느슨하게 사용하고 있습니다.
컨볼 루션 레이어의 각 컨볼 루션은 " 이미지의 픽셀 수 "활성화를 생성합니다 (예 : 단일 컨볼 루션을 통해 이미지를 전달하면 " m "활성화 로 구성된 단일 기능 맵이 표시됩니다 . 여기서 " m "은 사용자의 픽셀 수임) 이미지 / 입력).
완전히 연결된 레이어의 경우 생성하는 활성화 수는 출력 크기와 같습니다.
컨볼 루션 :
활성화 (n) = image_width * image_height * image_num_channels
완전히 연결된 (고밀도) 레이어 :
활성화 (n) = 출력 (n)
입력 내용은 실제로 네트워크 시작 부분의 이미지 일뿐입니다. 컨볼 루션 후에는 다른 것으로 바뀝니다 (피처 맵). 따라서 "image_width", "image_height"및 "image_num_channels"를 "input_width", "input_height"및 "layer_depth"로보다 정확하게 대체하십시오. (이미지 측면에서이 개념을 생각하기가 더 쉽습니다.)
또한 각 계층에서 활성화에 대한 오류를 저장해야하기 때문에 (후진 패스에서 사용), 스토리지 공간에서 공간을 확보해야하는 총 엔티티 수를 얻기 위해 활성화 수에 2를 곱합니다. 일괄 처리의 이미지 수에 따라 활성화 수가 증가하므로이 수에 일괄 처리 크기를 곱하십시오.
2 단계 : 배치를 훈련시키는 메모리
가중치 및 바이어스 수 (3 회)와 활성화 횟수 (배치 크기의 2 배)를 합산합니다. 이 값에 4를 곱하면 배치를 훈련시키는 데 필요한 바이트 수를 얻습니다. 1024 ^ 2로 나누면 GB 단위로 답을 얻을 수 있습니다.