Як обробляти зображення великих розмірів у CNN?


15

Припустимо, для використання в CNN потрібно використовувати 10К зображень розміром 2400 х 2400. На мій погляд, звичайні комп'ютери, якими користуються люди, будуть корисні. Тепер питання полягає в тому, як обробляти такі великі розміри зображень, де немає привілеїв зменшення розміру.

Ось системні вимоги: -

Ubuntu 16.04 64-розрядна оперативна пам'ять 16 ГБ GPU 8 ГБ HDD 500 ГБ

1) Чи існують якісь методи для обробки таких великих зображень, які слід навчити?
2) Який розмір партії доцільно використовувати?
3) Чи є якісь запобіжні заходи щодо вживання або збільшення або зменшення апаратних ресурсів, які я можу зробити?

Відповіді:


14

Тепер питання полягає в тому, як обробляти такі великі розміри зображень, де немає привілеїв зменшення розміру

Я припускаю, що під пониженням ви маєте на увазі зменшення входу до передачі його в CNN. Конволюційний шар дозволяє зменшити вибірку зображення всередині мережі, вибравши великий крок, який збирається заощадити ресурси для наступних шарів. Насправді це те, що він повинен робити, інакше ваша модель не впишеться в GPU.

1) Чи існують якісь методи для обробки таких великих зображень, які слід навчити?

Зазвичай дослідження масштабують зображення до резонансного розміру. Але якщо це не варіант для вас, вам потрібно буде обмежити свій CNN. На додаток до зниження тиску на ранніх шарах, я б рекомендував вам позбутися шару FC (який зазвичай приймає більшість параметрів) на користь згорткового шару . Також вам доведеться передавати свої дані в кожну епоху, оскільки вони не впишуться у ваш GPU.

Зауважте, що нічого з цього не завадить великим обчислювальним навантаженням у ранніх шарах, саме тому, що вхід настільки великий: згортання - це дорога операція, і перші шари будуть виконувати їх багато в кожному проході вперед і назад. Словом, навчання буде повільним.

2) Який розмір партії доцільно використовувати?

Ось ще одна проблема. Одне зображення займає 2400x2400x3x4(3 канали та 4 байти на піксель), що становить ~ 70 Мбіт, тому ви навряд чи можете дозволити собі навіть розмір партії 10. Більш реально було б 5. Зауважте, що більшу частину пам'яті буде займати параметри CNN. Я думаю, що в цьому випадку є сенс зменшити розмір, використовуючи 16-бітні значення, а не 32-розрядні - таким чином ви зможете подвоїти партії.

3) Чи є якісь запобіжні заходи щодо вживання або збільшення або зменшення апаратних ресурсів, які я можу зробити?

Вашим вузьким місцем є пам’ять GPU. Якщо ви можете дозволити собі інший GPU, отримайте його та розділіть мережу по них. Все інше є незначним порівняно з пам'яттю GPU.


1
Дякую. Я вже дотримувався кількох пропозицій, які ви дали у цій відповіді. Гарна відповідь.
WaterRocket8236

5

Зазвичай для зображень набір функцій - це значення щільності пікселів, і в цьому випадку це призведе до досить великого набору функцій; також не рекомендується знімати вибірки зображень, оскільки ви можете втратити (фактично втратите) важливі дані.

[1] Але є деякі методи, які можуть допомогти вам зменшити розмір набору функцій, такі підходи, як PCA (Principle Component Analysis), допомагають вам у виборі важливого набору функцій.

Детальну інформацію можна знайти за посиланням http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Крім того, щоб зменшити обчислювальні витрати під час тренування вашої нейронної мережі, ви можете використовувати Stochastic Gradient Descent, а не звичайне використання підходу Gradient Descent, що дозволило б зменшити розмір набору даних, необхідний для тренінгу для кожної ітерації. Таким чином, розмір вашого набору даних, який буде використовуватися в одній ітерації, зменшився б, таким чином, зменшився б час, необхідний для навчання мережі.

Точний розмір партії, який буде використовуватися, залежить від вашого розповсюдження для навчальних наборів даних та тестування набору даних, більш загальне використання - 70-30. Де ви також можете використовувати вищезгаданий стохастичний підхід, щоб скоротити необхідний час.

Деталі для стохастичного градієнтного спуску http://scikit-learn.org/stable/modules/sgd.html

[3] Здається, що апаратне забезпечення підходить для оновлення, все ж, якщо потрібно, подивіться на хмарні рішення, такі як AWS, де ви можете отримати безкоштовну підписку на рахунок до ліміту використання.


Дякую за відповідь. Оновіть відповідь, якщо отримаєте більше інформації.
WaterRocket8236

Дякуємо за посилання на стохастичний градієнтний спуск, і ласкаво просимо до AI!
DukeZhou

2

Такі великі дані не можуть бути завантажені у вашу пам'ять. Дозволяємо розділити те, що ви можете зробити на два:

  1. Масштабуйте всі ваші зображення до менших розмірів. Ви можете змінити їх масштаб до 112x112 пікселів. У вашому випадку, оскільки у вас квадратне зображення, обрізати не буде потреби. Ви все одно не зможете завантажувати ці цілі зображення в оперативну пам’ять.

  2. Найкращим варіантом є використання генераторної функції, яка подаватиме дані партіями. Будь ласка, зверніться до використання fit_generator , який використовується у Keras. Якщо параметри вашої моделі стають занадто великими, щоб вписатись у пам’ять GPU, розглянути можливість використання пакетної нормалізації або використання залишкової моделі для зменшення кількості параметрів.


3
Чому ви вибрали б розмір 112x112 пікселів? Це не потенція 2, а не дільник 2400.
Andi R

@AndiR. Ось річ. Що стосується вхідного виміру, можна вільно вибрати, який розмір колись. Це пояснюється тим, що, якщо в мережі є якісь несумісність розмірів, це легко вирішити за допомогою нульової прокладки. Таким чином, немає фіксованої методології щодо розміру вхідних даних. Що потрібно бути обережним, це переконатися, що занадто велика вибірка вниз не впливає на якість введення. Погляньте на цей документ, який використовує розмір 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.