@StatsSorceress TL; DR:
Я проходжу цю діяльність, щоб побачити, чи можу я обчислити потрібну пам'ять:
Активації: 532,752 * 2 * 4 / (1024 ^ 2) = 4,06 МБ
Параметри: 19,072,984 * 4 / (1024 ^ 2) * 3 = 218,27 Мб
Інше: 128 * 9000 * 4 / (1024 ^ 2) = 4,39 Мб
Загальна пам'ять: (4,06 * 128 ) + 218,27 + 4,39 = 742,34 Мб
( Хтось, будь ласка, виправте мене з цього приводу, якщо я помиляюся. FYI, ви вже помножили різне на 128, тому я не помножив його на 128 вище )
Я хотів би вказати на цю статтю та відповідне відео . Вони допомогли мені зрозуміти, що відбувається набагато краще.
ПРИМІТКА . Пам'ять, необхідна для використання мережі для прогнозування, набагато менша, ніж потрібна для навчання з двох причин:
- Під час прогнозування ми надсилаємо зображення лише вперед через мережу, а не назад (тому ми не примножуємо пам'ять X 3; див. Нижче)
- Є одне передбачення на зображення (тому нам не потрібно примножувати пам'ять, необхідну для одного зображення, на розмір партії, оскільки ми не використовуємо партії для прогнозування).
Процес (пам'ять для поїзду)
- Обчисліть пам'ять, необхідну для тренування на одному зображенні
- Помножте це число на кількість зображень у вашій партії
( ПАМ'ЯТАЙТЕ: Міні-партія говорить, що ми беремо підмножину наших даних, обчислюємо градієнти та помилки для кожного зображення в підмножині, потім середнє значення і крокуємо вперед у напрямку середнього. Для конвентів, ваги та ухили поділяються, але кількість активацій змішується з кількістю зображень у партії. ).
КРОК 1: Пам'ять для 1 зображення
Для тренування одного зображення потрібно резервувати пам'ять для:
Параметри моделі:
Ці ваги і зміщує на кожному шарі, а також їх градієнтів , і їх величини імпульсу (якщо Адам, Adagrad, RMSProp і т.д., оптимізатори використовуються)
Щоб наблизити пам'ять до цього, обчисліть об'єм пам'яті, необхідної для зберігання ваг і ухилів, і помножте її на 3 (тобто "на 3", тому що ми говоримо, що об'єм пам'яті, необхідний для зберігання ваг і ухилів, приблизно (приблизно) дорівнює необхідні для градієнтів та змінних імпульсів)
РІВНЯННЯ:
Звитки:
ваги (n) = глибина (n) * (ширина ядра * висота ядра) * глибина (n-1)
зміщення (n) = глибина (n)
Повністю з'єднані (щільні) шари:
ваги (n) = виходи (n) * входи (n)
зміщення (n) = виходи (n)
де n - поточний шар, а n-1 - попередній шар, а виходи - це кількість виходів із рівня FC, а входи - це кількість входів у рівень FC (якщо попередній шар не є повністю пов'язаним шаром, кількість входів дорівнює розміру цього шару, вирівняного).
ПРИМІТКА . Пам'ять лише для ваг та зміщення, а також пам'ять для активацій для одного зображення (див. Нижче) - це загальний об'єм пам'яті, який вам потрібен для прогнозування (виключаючи частину накладних витрат на пам'ять для згортків та деякі інші речі).
- Активації (це "краплі" в Caffe):
(Тут я вільно використовую терміни, майте на собі)
Кожна згортання в шарі згортки створює активацію " кількості пікселів у зображенні " (тобто ви передаєте зображення через одну згортку, ви отримуєте єдину карту функцій, що складається з активацій " 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, щоб отримати відповідь у ГБ.