@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 МБ
( Кто-то, пожалуйста, поправьте меня, если я ошибаюсь. К вашему сведению, вы уже умножили разное на 128, поэтому я не умножил его на 128 выше )
Я хотел бы указать вам на эту статью и соответствующее видео . Они помогли мне понять, что происходит намного лучше.
ПРИМЕЧАНИЕ . Память, необходимая для использования сети для прогнозов, намного меньше, чем для обучения, по двум причинам:
- При прогнозировании мы отправляем изображение только через сеть, а не назад (поэтому мы не умножаем память X 3; см. Ниже)
- Для каждого изображения существует один прогноз (поэтому нам не нужно умножать объем памяти, требуемый для одного изображения, на размер пакета, потому что мы не используем пакеты в прогнозе).
Процесс (память на тренировку)
- Рассчитать память, необходимую для тренировки на одном изображении
- Умножьте это число на количество изображений в вашей партии
( ПОМНИТЕ: мини-пакетирование говорит, что мы берем подмножество наших данных, вычисляем градиенты и ошибки для каждого изображения в подмножестве, затем усредняем их и делаем шаг вперед в направлении среднего. Для коннетов весовые коэффициенты и уклоны являются общими, но количество активаций умножается на количество изображений в пакете. )
ШАГ 1: Память на 1 изображение
Чтобы обучить одно изображение, вы должны зарезервировать память для:
Параметры модели:
Эти веса и смещает на каждом слое, а также их градиентов , и их величины импульса (если Адам, Adagrad, RMSProp и т.д., оптимизаторы используются)
Чтобы приблизить для этого объем памяти, рассчитайте объем памяти, необходимый для хранения весов и смещений, и умножьте ее на 3 (т. Е. «На 3», поскольку мы говорим, что объем памяти, необходимый для хранения весов и смещений, (приблизительно) равен что нужно для градиентов и для переменных импульса)
УРАВНЕНИЯ:
сверток:
весовые коэффициенты (n) = глубина (n) * (kernel_width * kernel_height) * глубина (n-1)
уклоны (n) = глубина (n)
Полностью связанные (плотные) слои:
веса (n) = выходы (n) * входы (n)
смещения (n) = выходы (n)
где n - текущий уровень, а n-1 - предыдущий уровень, а выходы - это количество выходов из уровня FC, а входы - это количество входов в уровень FC (если предыдущий уровень не является полностью подключенным уровнем, количество входов равно размеру сплющенного слоя).
ПРИМЕЧАНИЕ . Память только для весов и смещений плюс память для активаций для одного изображения (см. Ниже) - это общий объем памяти, необходимый для предсказаний (исключая некоторые накладные расходы на память для сверток и некоторые другие вещи).
- Активации (это «Blobs» в Caffe):
(Я использую термины здесь, терпите меня)
Каждая свертка в слое свертки производит активации « количество пикселей в изображении » (т.е. вы пропускаете изображение через одну свертку, вы получаете одну карту объектов, состоящую из активаций « m », где « m » - это количество пикселей от вашего изображение / вход).
Для полностью связанных слоев количество активаций, которые вы производите, равно размеру вашего вывода.
сверток:
активаций (n) = ширина изображения * высота изображения * изображение_канала
Полностью связанные (плотные) слои:
активации (n) = выходы (n)
Обратите внимание, что ваши входные данные на самом деле являются только изображениями в начале сети. После свертки он превращается во что-то еще (карта возможностей). Поэтому действительно замените «image_width», «image_height» и «image_num_channels» на «input_width», «input_height» и «layer_depth», чтобы быть более точным. (Мне просто легче представить эту концепцию в терминах изображений.)
Поскольку нам также нужно хранить ошибку для активаций на каждом уровне (используемую в обратном проходе), мы умножаем количество активаций на 2, чтобы получить общее количество сущностей, для которых нам нужно освободить место в нашем хранилище. Количество активаций увеличивается с увеличением количества изображений в пакете, поэтому вы умножаете это число на размер пакета.
ШАГ 2: Память для обучения партии
Суммируйте количество весов и смещений (3 раза) и количество активаций (2 раза больше размера партии). Умножьте это на 4, и вы получите количество байтов, необходимое для обучения пакета. Вы можете разделить на 1024 ^ 2, чтобы получить ответ в ГБ.