Аналіз цін Polkadot 13 вер

Сверточна нейронна мережа-реалізація PyTorch на наборі даних CIFAR-10

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

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

Вступ

Cifar 10 | Згорткові нейронні мережі pytorch
                                    Зображення 1

Згорткові нейронні мережі, також звані ConvNets, були вперше представлені в 1980-х роках Янном Лекуном, дослідником інформатики, який працював у фоновому режимі. LeCun створив базову мережу для розпізнавання зображень на основі робіт Куніхіко Фукусіми, японського вченого.

Стара версія CNN, яка називається LeNet (на честь LeCun), може бачити рукописні цифри. CNN допомагає знайти пін-коди з пошти. Але незважаючи на свій досвід, ConvNets залишалися близькими до комп’ютерного зору та штучного інтелекту, оскільки зіткнулися з серйозною проблемою: вони не могли масштабувати. CNN вимагає великої кількості даних і інтегрованих ресурсів, щоб добре працювати з великими зображеннями.

У той час цей метод був застосовний лише до зображень з низькою роздільною здатністю. Pytorch — це бібліотека, яка може виконувати операції глибокого навчання. Ми можемо використовувати це для створення згорткових нейронних мереж. Згорткові нейронні мережі містять багато шарів штучних нейронів. Синтетичні нейрони, складне моделювання біологічних аналогів, є математичними функціями, які обчислюють зважену масу кількох вхідних даних та активацію цінності продукту.

Згорткові нейронні мережі pytorch
Зображення 2

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

CIFAR-10 – це набір даних, який містить колекцію зображень 10 різних класів. Цей набір даних широко використовується для дослідницьких цілей для тестування різних моделей машинного навчання і особливо для проблем комп’ютерного зору. У цій статті ми спробуємо побудувати модель нейронної мережі за допомогою Pytorch і протестувати її на наборі даних CIFAR-10, щоб перевірити, яку точність передбачення можна отримати.

Імпорт бібліотеки PyTorch 

імпортувати numpy як np імпортувати pandas як pd
import torch import torch.nn.functional як F з torchvision import datasets,transforms from torch import nn import matplotlib.pyplot as plt import numpy as np import seaborn as sns #from tqdm.notebook import tqdm from tqdm import tqdm

На цьому кроці ми імпортуємо необхідні бібліотеки. Ми бачимо, що ми використовуємо NumPy для числових операцій і pandas для операцій з фреймами даних. Бібліотека torch використовується для імпорту Pytorch.

Pytorch має компонент nn, який використовується для абстракції операцій і функцій машинного навчання. Це імпортується як F. Бібліотека torchvision використовується для того, щоб ми могли імпортувати набір даних CIFAR-10. Ця бібліотека має багато наборів даних зображень і широко використовується для досліджень. Перетворення можна імпортувати, щоб ми могли змінити розмір зображення до однакового розміру для всіх зображень. tqdm використовується для того, щоб ми могли відстежувати прогрес під час навчання, і використовується для візуалізації.

Прочитайте необхідний набір даних

trainData = pd.read_csv('cifar-10/trainLabels.csv') trainData.head()

Після того, як ми прочитаємо набір даних, ми побачимо різні мітки, такі як жаба, вантажівка, олень, автомобіль тощо.

Аналіз даних за допомогою PyTorch

print("Кількість точок:",trainData.shape[0]) print("Кількість функцій:",trainData.shape[1]) print("Features:",trainData.columns.values) print("Кількість Унікальні значення") для col в trainData: print(col,":",len(trainData[col].unique())) plt.figure(figsize=(12,8))

вихід:

Кількість балів: 50000 Кількість функцій: 2 Функції: ['id' 'label'] Кількість унікальних значень id: 50000 label : 10

На цьому кроці ми аналізуємо набір даних і бачимо, що наші дані про поїзд мають близько 50000 10 рядків із їхнім ідентифікатором та пов’язаною міткою. Всього 10 класів, як у назві CIFAR-XNUMX.

Отримання набору перевірки за допомогою PyTorch

з torch.utils.data імпорт random_split val_size = 5000 train_size = len(dataset) - val_size train_ds, val_ds = random_split(dataset, [train_size, val_size]) len(train_ds), len(val_ds)

Цей крок такий самий, як і етап навчання, але ми хочемо розділити дані на набори підготовки та перевірки.

(45000, 5000)
з torch.utils.data.dataloader імпортуйте DataLoader batch_size=64 train_dl = DataLoader(train_ds, batch_size, shuffle=True, num_workers=4, pin_memory=True) val_dl = DataLoader(swork_ds, num_pin_e), batch_pin=True.

У torch.utils є завантажувач даних, який може допомогти нам завантажити необхідні дані, минаючи різні параметри, як-от номер працівника або розмір партії.

Визначення необхідних функцій

@torch.no_grad() def accuracy(виходи, мітки): _, preds = torch.max(виходи, dim=1) return torch.tensor(torch.sum(preds == labels).item() / len(preds )) class ImageClassificationBase(nn.Module): def training_step(self, batch): зображення, мітки = пакетний вихід = self(images) # Створення прогнозів втрат = F.cross_entropy(out, labels) # Розрахувати втрати accu = accuracy(out ,labels) return loss,accu def validation_step(self, batch): images, labels = batch out = self(images) # Generate predictions loss = F.cross_entropy(out, labels) # Розрахувати втрати acc = accuracy(out, labels) # Розрахувати точність повернення {'Loss': loss.detach(), 'Accuracy': acc} def validation_epoch_end(self, outputs): batch_losses = [x['Loss'] for x in outputs] epoch_loss = torch.stack(batch_losses ).mean() # Об'єднати втрати batch_accs = [x['Accuracy'] для x у вихідних даних] epoch_acc = torch.stack(batch_accs).mean() # Об'єднати точність return {'Loss': epoch_loss.item(), ' Точність': epoch_acc.item()} def epoch_end(self, epoch, result): pr int("Epoch :",epoch + 1) print(f'Точність поїзда:{результат["train_accuracy"]*100:.2f}% Точність перевірки:{результат["Accuracy"]*100:.2f}%' ) print(f'Втрата поїзда:{результат["train_loss"]:.4f} Втрата перевірки:{результат["Втрата"]:.4f}')

Як ми бачимо тут, ми використовували реалізацію класу ImageClassification і він приймає один параметр, який є nn.Module. У цьому класі ми можемо реалізувати різні функції або різні кроки, такі як навчання, перевірка тощо. Функції тут є простими реалізаціями на Python.

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

Реалізація модуля згорткової нейронної мережі

class Cifar10CnnModel(ImageClassificationBase): def __init__(self): super().__init__() self.network = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(32, 64, kernel_size=3, side=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), # вихід: 64 x 16 x 16 nn.BatchNorm2d(64) , nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1), nn .ReLU(), nn.MaxPool2d(2, 2), # вихід: 128 x 8 x 8 nn.BatchNorm2d(128), nn.Conv2d(128, 256, kernel_size=3, side=1, padding=1), nn.ReLU(), nn.Conv2d(256, 256, kernel_size=3, side=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), # вихід: 256 x 4 x 4 nn.BatchNorm2d(256), nn.Flatten(), nn.Linear(256*4*4, 1024), nn.ReLU(), nn.Linear(1024, 512), nn.ReLU(), nn.Linear (512, 10)) def forward(self, xb): повернути self.network(xb)

Це найважливіша частина реалізації нейронної мережі. Протягом усього часу ми використовуємо модуль nn, який ми імпортували з torch. Як ми бачимо в першому рядку, Conv2d — це модуль, який допомагає реалізувати згорткову нейронну мережу. Перший параметр 3 тут означає, що зображення кольорове та у форматі RGB. Якби це було зображення у відтінках сірого, ми б вибрали 1.

32 - це розмір початкового вихідного каналу, і коли ми переходимо до наступного шару conv2d, у нас буде цей 32 як вхідний канал і 64 як вихідний.

Третій параметр у першому рядку називається розміром ядра, і він допомагає нам подбати про використовувані фільтри. Операція заповнення є останнім параметром.

Операція згортки підключена до рівня активації і Relu тут. Після двох шарів Conv2d ми маємо операцію максимального об’єднання розміром 2 * 2. Значення, що виходить із цього, є пакетно нормалізованим для стабільності та для уникнення внутрішнього коваріатного зсуву. Ці операції повторюються з більшою кількістю шарів, щоб поглибити мережу та зменшити її розмір. Нарешті, ми вирівнюємо шар, щоб ми могли побудувати лінійний шар для відображення значень до 10 значень. Імовірність кожного нейрона з цих 10 нейронів визначить, до якого класу належить конкретне зображення на основі максимальної ймовірності.

Тренуйте модель

@torch.no_grad() def evaluate(model, data_loader): model.eval() outputs = [model.validation_step(batch) for batch in data_loader] return model.validation_epoch_end(outputs) def fit(model, train_loader, val_loader,epochs) =10,learning_rate=0.001): best_valid = None history = [] optimizer = torch.optim.Adam(model.parameters(), learning_rate,weight_decay=0.0005) для епохи в діапазоні (епох): # Фаза навчання model.train( ) train_losses = [] train_accuracy = [] для пакету в tqdm(train_loader): loss,accu = model.training_step(batch) train_losses.append(loss) train_accuracy.append(accu) loss.backward() optimizer.step() optimizer .zero_grad() # Результат фази перевірки = evaluate(model, val_loader) result['train_loss'] = torch.stack(train_losses).mean().item() result['train_accuracy'] = torch.stack(train_accuracy). mean().item() model.epoch_end(epoch, result) if(best_valid == Немає або best_valid
історія = підходить (модель, train_dl, val_dl)

Це основний крок для навчання нашої моделі для отримання необхідного результату. функція fit тут буде відповідати даним поїзда та Val із створеною нами моделлю. Функція fit спочатку приймає список під назвою history, який опікується ітераційними даними кожної епохи. Ми запускаємо цикл for, щоб ми могли перебирати кожну епоху. Для кожної партії ми показуємо прогрес за допомогою tqdm. Ми називаємо крок навчання, який ми реалізували раніше, і обчислюємо точність і втрати. Перейти до зворотного поширення та запустити оптимізатор, який ми визначили раніше. Після цього ми відстежуємо наш список, а функції допомагають нам друкувати деталі та прогрес.

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

Побудова графіків результатів

На цьому кроці ми візуалізуємо точність у порівнянні з кожною епохою. Ми можемо помітити, що в міру зростання епохи точність системи продовжує зростати, і так само втрати продовжують зменшуватися. Червона лінія вказує на перебіг даних навчання, а синя – для перевірки. Ми бачимо, що в наших результатах спостерігається значне переобладнання, оскільки навчальні дані значно перевершують результати перевірки, а також у разі втрати. Після 10 епох дані про поїзд, здається, обходять 90% точності, але мають втрату приблизно 0.5. Тестові дані отримують близько 81%, а втрати близько 0.2.

def plot_accuracies(history): Validation_accuracies = [x['Accuracy'] для x в історії] Training_Accuracies = [x['train_accuracy'] для x в історії] plt.plot(Training_Accuracies, '-rx') plt.plot(curacies) , '-bx') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(['Training', 'Validation']) plt.title('Точність проти кількості епох') ; plot_accuracies (історія)
Точність графіків
def plot_losses(історія): train_losses = [x.get('train_loss') для x в історії] val_losses = [x['Loss'] для x в історії] plt.plot(train_losses, '-bx') plt.plot (val_losses, '-rx') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(['Training', 'Validation']) plt.title('Втрата проти кількості епох '); plot_losses (історія)

test_dataset = ImageFolder(data_dir+'/test', transform=ToTensor()) test_loader = DeviceDataLoader(DataLoader(test_dataset, batch_size), device) result = evaluate(final_model, test_loader) print(f'Test Accuracy:{result["Accuracy" ]*100:.2f}%')
Точність тесту: 81.07%

Ми бачимо, що ми отримуємо точність 81.07%.

Висновок:

зображення:https://unsplash.com/photos/5L0R8ZqPZHk

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

Image Source

  1. Image 1: https://becominghuman.ai/cifar-10-image-classification-fd2ace47c5e8
  2. Зображення 2: https://www.analyticsvidhya.com/blog/2021/05/convolutional-neural-networks-cnn/

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

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

Носії, показані в цій статті, не належать Analytics Vidhya і використовуються на розсуд автора.

Джерело: https://www.analyticsvidhya.com/blog/2021/09/convolutional-neural-network-pytorch-implementation-on-cifar10-dataset/

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

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