Побудова моделі Resnet-34 за допомогою Pytorch-Посібник для початківців

Вихідний вузол: 1075632

Ця стаття була опублікована як частина Блогатон науки про дані

Вступ

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

Тут значною мірою впливає точність. Це також призводить до проблеми під назвою зникнення градієнта. Це не дозволить нам правильно оновити ваги під час кроку зворотного поширення. Під час етапу зворотного поширення ми використовуємо правило ланцюга, похідні кожного рівня, коли ми йдемо вниз мережею, множаться.

Якщо ми використовуємо глибші шари та маємо приховані шари, такі як сигмовид, похідні зменшуються нижче 0.25 у кожному шарі. Отже, коли багато похідних шарів множиться, градієнт експоненціально зменшується, і ми отримуємо дуже мале значення, яке марне для обчислення градієнта. Це призвело до створення Resnet компанією Microsoft Research, яка використовувала пропущені підключення, щоб уникнути погіршення. У цій статті ми обговоримо реалізацію 34-рівневої архітектури ResNet за допомогою фреймворку Pytorch на Python.

Проблема зникаючого градієнта Resnet-34
Зображення 1

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

Проблема з площинними мережами

проблема з простими мережами
Зображення 2

Як показано на малюнку, ми бачимо плоскі мережі, які мають більш глибокі шари. Ліворуч ми маємо помилку поїзда та помилку тесту праворуч. Ми могли б подумати, що це може бути причиною переобладнання, але тут % похибок 56-шарової мережі є найгіршим як для навчання, так і для даних тестування, чого не відбувається, коли модель переобладнана. Це називається деградація.

Архітектура Resnet-34

Архітектура Resnet-34
Зображення 3

Спочатку у нас є згортковий шар, який має 64 фільтри з розміром ядра 7×7, це перша згортка, потім шар максимального об’єднання. У нас є крок, визначений як 2 в обох випадках. Далі, в conv2_x ми маємо шар об’єднання та наступні шари згортки. Ці шари зазвичай групуються попарно через спосіб з’єднання залишків (стрілки показують, що стрибають кожні два шари).

Тут ми маємо 2 шари, які мають kernel_size 3×3, num_filters 64, і всі вони повторюються x3, що відповідає шарам між пулом/2 і фільтром 128, загалом 6 шарів (один пара разів 3). Ці 2 шари мають kernel_size 3×3, num_filters — 128, і вони також повторюються, але на цей раз 4. Це продовжується до функції avg_pooling і softmax. Щоразу, коли кількість фільтрів подвоюється, ми бачимо, що перший шар визначає кількість_фільтрів/2.

Код для визначення Resnet-34 у Pytorch:

клас ResNet34(nn.Module): def __init__(self): super(ResNet34,self).__init__() self.block1 = nn.Sequential( nn.Conv2d(1,64,kernel_size=2,stride=2,padding=) 3,bias=False), nn.BatchNorm2d(64), nn.ReLU(True) ) self.block2 = nn.Sequential( nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2) ,3) ) self.block64,128 = nn.Sequential( ResidualBlock(128,128,2), ResidualBlock(4) ) self.block128,256 = nn.Sequential( ResidualBlock(256,256,2), ResidualBlock(5) ) self.block256,512 = nn. Sequential( ResidualBlock(512,512,2), ResidualBlock(2) ) self.avgpool = nn.AvgPool2d(1) # vowel_diacritic self.fc512,11 = nn.Linear(2) # grapheme_root self.fc512,168 = nn.Linear(3) # consonant_diacritic self.fc512,7 = nn.Linear(1) def forward(self,x): x = self.block2(x) x = self.block3(x) x = self.block4(x) x = self. block5(x) x = self.block0(x) x = self.avgpool(x) x = x.view(x.size(1),-1) x1 = self.fc2(x) x2 = self.fc3( x) x3 = self.fc1(x) повертає x2,x3,xXNUMX

Цей код дає нам повну реалізацію модуля для Resnet-34. Тепер давайте поглибимося в розуміння того, як працює кожна лінія. Для цього давайте скоротимо архітектуру, яку ми бачили раніше. Зверніться до 34 багаторівневих діаграм нижче.

вихід коду
Зображення 4

Ми бачимо, що нам потрібно реалізувати будь-яку архітектуру Resnet у 5 блоках. Перший блок містить 64 фільтри з кроком 2, а потім максимальне об’єднання з кроком 2. Архітектура використовує доповнення 3. Оскільки існує ймовірність внутрішнього зсуву коваріат, ми повинні стабілізувати мережу шляхом пакетної нормалізації. Наприкінці ми використовуємо активацію ReLU. Перший блок є однаковим для будь-якої архітектури, а інші блоки змінюються для різних рівнів і повторюються за певним шаблоном. 1-й блок може бути реалізований як:

nn.Conv2d(1,64,kernel_size=2,stride=2,padding=3,bias=False),
nn.BatchNorm2d(64),
nn.ReLU(True)

На цьому етапі ми маємо пропуск з’єднання. Що є основною ідеєю залишкових мереж. На діаграмі архітектури, яку ми бачили раніше, були пропущені з’єднання з пунктирними та темними стрілками. Пунктирна лінія — це те, що тут відбувається, оскільки ми переходимо до каналу, більшого розміру, ніж попередній. Другий блок має реалізацію початкового максимального пулу 1 * 1 з розміром ядра 3 * 3 і двома залишковими блоками, як показано в коді нижче. Ці два приймають 64 як вхідні та вихідні канали та повторюються 3 рази, як показано в архітектурі. Зрештою, останній з'єднується з наступним блоком кроком 2.

nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2)

Вміст останнього блоку повторився 3 рази, і ми вказали, що за допомогою темної стрілки на діаграмі архітектури розмір вхідного та вихідного каналів залишається незмінним. '/2', показаний на діаграмі архітектури, говорить нам про використовуваний крок.

Третій блок має розмір ядра 3 * 3 із вхідним каналом, що надходить з останнього блоку 64 і дає вихідний канал 128. Потім ми беремо той самий 128 як вхідний і 128 як вихідний канал. Ми повторюємо це 4 рази, як показано на попередній діаграмі архітектури.

ResidualBlock(64,128), ResidualBlock(128,128,2)

Подібно до цього, ми будуємо наші 4-й і 5-й блоки, які мають розміри ядра 256 і 512.

ResidualBlock(128,256), ResidualBlock(256,256,2)
ResidualBlock(256,512), ResidualBlock(512,512,2)

Лінійні функції допомагають зрештою пов’язати це з кінцевою місією, яка може включати такі кроки, як класифікація наборів даних cifar 10 тощо, а ідея полягає в тому, щоб звести шари та надати імовірнісне значення, щоб знайти макс. І функція forward, яку ми визначили для з’єднання кожного з блоків. Для повної реалізації Python, включаючи навчання, ви можете звернутися до цього сайт. Ми також можемо використовувати техніку навчання переносу Pytorch, і для цього коду ви можете звернутися до цього GitHub репо.

Висновок:

Посилання:

  1. https://www.kaggle.com/khoongweihao/resnet-34-pytorch-starter-kit
  2. https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types

Про себе: Я студент-дослідник, який цікавиться сферою глибокого навчання та обробки природної мови, і зараз навчаюся в аспірантурі зі штучного інтелекту.

Image Source

  1. Зображення 1,2, 69: https://towardsdatascience.com/the-vanishing-gradient-problem-08bf15484bXNUMX
  2. Зображення 3,4: https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types
  3. Попередній перегляд зображення: https://www.zdnet.com/pictures/10-cool-robots-at-this-years-robobusiness-conference/2/

Не соромтеся зв’язатися зі мною на:

  1. Linkedin: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2. Github: https://github.com/Siddharth1698

Медіафайли, показані в цій статті на ResNet-34, не належать Analytics Vidhya та використовуються на розсуд Автора.

Джерело: https://www.analyticsvidhya.com/blog/2021/09/building-resnet-34-model-using-pytorch-a-guide-for-beginners/

Часова мітка:

Більше від Аналітика Vidhya