Теперь вопрос заключается в том, как обрабатывать изображения такого большого размера, когда нет никаких преимуществ понижающей дискретизации.
Я предполагаю, что под понижающей дискретизацией вы подразумеваете уменьшение входных данных перед передачей их в CNN. Сверточный слой позволяет уменьшить изображение в сети, выбирая большой шаг, что позволит сэкономить ресурсы для следующих слоев. Фактически, это то, что нужно сделать, иначе ваша модель не поместится в GPU.
1) Существуют ли методы для обработки таких больших изображений, которые нужно обучать?
Обычно исследования масштабируют изображения до разумного размера. Но если это не вариант для вас, вам нужно ограничить свой CNN. В дополнение к понижающей дискретизации в ранних слоях, я бы порекомендовал вам избавиться от слоя FC (который обычно принимает большинство параметров) в пользу сверточного слоя . Также вам придется передавать данные в каждую эпоху, потому что они не будут вписываться в ваш графический процессор.
Обратите внимание, что ничто из этого не предотвратит большую вычислительную нагрузку на ранних уровнях, именно потому, что входные данные очень велики: свертка - дорогостоящая операция, и первые слои будут выполнять много из них при каждом прямом и обратном проходе. Короче, обучение будет медленным.
2) Какой размер партии целесообразно использовать?
Вот еще одна проблема. 2400x2400x3x4
Одно изображение занимает (3 канала и 4 байта на пиксель), что составляет ~ 70 МБ, поэтому вы вряд ли сможете позволить себе даже размер пакета 10. Более реалистично было бы 5. Обратите внимание, что большая часть памяти будет занята параметрами CNN. Я думаю, что в этом случае имеет смысл уменьшить размер, используя 16-битные значения, а не 32-битные - таким образом вы сможете удвоить количество пакетов.
3) Есть ли какие-либо меры предосторожности, которые я могу предпринять, или какое-либо увеличение или уменьшение аппаратных ресурсов?
Ваше узкое место - память GPU. Если вы можете позволить себе другой графический процессор, получите его и разделите сеть между ними. Все остальное незначительно по сравнению с памятью GPU.
Обычно для изображений набор функций представляет собой значения плотности пикселей, и в этом случае это приведет к довольно большому набору функций; также не рекомендуется делать выборку изображений с понижением частоты, так как вы можете потерять (фактически потеряете) важные данные.
[1] Но есть некоторые методы, которые могут помочь вам уменьшить размер набора функций, такие подходы, как PCA (Принцип анализа компонентов), помогут вам в выборе подмножества важных функций.
Для получения подробной информации см. Ссылку http://spark.apache.org/docs/latest/ml-features.html#pca .
[2] Кроме этого, чтобы уменьшить вычислительные затраты при обучении вашей нейронной сети, вы можете использовать стохастический градиентный спуск вместо обычного использования подхода градиентного спуска, который уменьшит размер набора данных, необходимый для обучения в каждой итерации. Таким образом, размер вашего набора данных, который будет использоваться за одну итерацию, сократится и, следовательно, сократит время, необходимое для обучения сети.
Точный размер пакета, который будет использоваться, зависит от вашего распределения для обучающего набора данных и тестируемого набора данных, более общее использование - 70-30. Где вы также можете использовать вышеупомянутый стохастический подход, чтобы сократить необходимое время.
Детали для стохастического градиентного спуска http://scikit-learn.org/stable/modules/sgd.html
[3] Похоже, что для обновления потребуется оборудование, но при необходимости посмотрите на облачные решения, такие как AWS, где вы можете получить бесплатную подписку на учетную запись до предела использования.
источник
Такие большие данные не могут быть загружены в вашу память. Давайте разделим то, что вы можете сделать на две части:
источник