저는 깊은 학습에 익숙하지 않고 Tensorflow train a cnn을 사용하여 이미지 인식을하고 있습니다. 교육 이미지는 모두 128 픽셀 * 128 픽셀 * 3 채널입니다. 내 네트워크에는 3 개의 전환 레이어, 3 개의 최대 배치 레이어 및 1 개의 완전히 연결된 레이어가 있습니다. 나는 180,000 개 이상의 라벨 이미지를 가지고 있으므로 각 배치마다 4000 개의 이미지를 교육하기로 결정했습니다. 그러나 메모리가 충분하지 않아 64GB RAM과 2 * E5 CPU를 사용하여 서버를 교육하려고했기 때문에 교육 과정을 노트북에서 실행할 수 없습니다. 이번에는 작동하지만 40GB 이상의 메모리가 필요합니다. 제가 훈련에 사용한 이미지가 고해상도 이미지 (128 * 128 만)가 아니라는 것이 혼란 스럽습니다. 하지만 왜 여전히 너무 많은 메모리를 요구합니다 (너무 큰 배치 크기 일 수 있습니다 ....). 이게 정상인가? 이것이 정상이라면, 사람들이 gpu를 신경 네트워크를 훈련 시키는데 어떻게 사용할 수 있겠습니까? gtx1080ti는 11GB 메모리를 가지고 있지만 내 네트워크를 훈련하기에는 아직 충분하지 않습니다.Tensorflow CNN에서 너무 많은 메모리를 사용하는 이유는 무엇입니까?
0
A
답변
0
4000은 한 번에 많이 들립니다. 내가 본 대부분의 예는 각 배치에서 몇백 개를 훈련시킵니다. 한 번에 모든 이미지가 메모리에로드 될 수 있으므로 높은 메모리 사용량을 상상할 수 있습니다.
작은 배치로 연습 해 볼 수 있습니까? 1000 또는 심지어 500, 그리고 메모리 사용량이 떨어지면 참조하십시오?
0
TensorFlow는 BP에 대한 컴퓨팅의 중간 값 (예 : 계층 간 그라디언트)을 저장하므로 입력의 크기가 클수록 더 많은 메모리를 소비합니다. 따라서 배치 크기를 줄이는 것이 메모리 사용을 줄이는 가장 빠른 방법입니다.
+0
배치를 줄이면 실제로 메모리 사용량이 줄어들 수 있지만 너무 많은 labled 교육 데이터가 있기 때문입니다. 모든 교육 데이터를 처리하는 데 훨씬 많은 배치가 필요하므로 수렴하는 데 더 많은 시간이 필요합니다. 메모리 사용을 줄이는 유일한 방법입니까? – sunnwmy
전체 아키텍처가 없으면 메모리를 예측하기 어렵습니다. 그러나, 배치 크기는 4000입니다. 입력 크기만으로는 이미지 당 배치 (* 128 * 128) 픽셀 당 4000 이미지 * 픽셀 당 3 채널 * 채널당 4 바이트 = 786432000 바이트 = 0.732421875GB (네트워크가 tf.float32를 사용한다고 가정)는 매우 큽니다. 트레이닝 동안 각 계층이 역 전파 단계를위한 입력을 캐싱해야하기 때문에 전체 네트워크가 훨씬 커질 것입니다. –
@Yahia Zakaria 분석해 주셔서 감사합니다. 나는 메모리 사용량을 줄이기 위해 배치 크기를 줄이면 훨씬 더 많은 배치와 수렴 시간을 의미합니다. 이것이 유일한 선택일까요? – sunnwmy
때로는 이것이 유일한 선택입니다. 경우에 따라 네트워크 자체를 최적화 할 수 있습니다 (일부 작업은 다른보다 효율적인 선택 또는 결합 된 작업으로 대체 될 수 있음). 경우에 따라 optimizer.minimize에서 다른 aggregation_method를 선택하면 도움이됩니다 (https://stackoverflow.com/questions/36194394/how-i-reduce-memory-consumption-in-a-loop-in-tensorflow 참조). 그러나 모두 실패하면 배치 크기를 줄이는 것이 유일한 선택 일 수 있습니다. –