Створення Простої Нейронної Мережі
Наша мета — побудувати базову нейронну мережу на PyTorch, використовуючи digits dataset — класичний набір даних у машинному навчанні. Завдання полягає у прогнозуванні цифри (цільова змінна) за зображенням її рукописного написання, представленого у вигляді набору значень пікселів (ознаки).
Огляд набору даних
Digits dataset містить зображення рукописних цифр, представлені у вигляді числових значень пікселів. Кожен зразок складається з 64 ознак, що відповідають інтенсивності пікселів з 8×8 зображення у відтінках сірого. Цільова змінна ('target' стовпець) відображає клас цифри (0-9), тобто, яке число зображено на картинці.
Перший крок — зчитування CSV-файлу та виділення ознак (X) і цільової змінної (y), яка є вихідною величиною для прогнозування:
import pandas as pd
digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv')
# Extract features and target
X = digits_df.drop(columns=["target"]).values
y = digits_df["target"].values
Визначення класу моделі
Спочатку необхідно імпортувати всі потрібні модулі PyTorch (nn, F). Модуль nn використовується для визначення шарів моделі та архітектури, а модуль F містить функції активації, функції втрат та інші утиліти, які часто застосовуються у функціональному стилі.
import torch.nn as nn
import torch.nn.functional as F
Тепер можна перейти до визначення класу моделі:
class DigitsClassifier(nn.Module):
...
Щоразу, коли визначається клас моделі у PyTorch, він повинен наслідуватися від nn.Module, оскільки це забезпечує необхідні функції, такі як автоматичне управління параметрами, визначення методу forward() і використання вбудованих утиліт, наприклад, збереження/завантаження моделі та доступ до параметрів. Це спрощує процес побудови, навчання та розгортання нейронних мереж, автоматизуючи багато завдань.
Архітектура моделі
Оскільки завдання є простою багатокласовою класифікацією, достатньо використати багатошаровий перцептрон (MLP) з 2 прихованими шарами.
class DigitsClassifier(nn.Module):
def __init__(self, input_features, hidden1, hidden2, output_classes):
super().__init__()
# Define the layers
self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer
self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer
self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer
Виклик super().__init__() ініціалізує батьківський клас nn.Module, що забезпечує важливу функціональність, таку як відстеження параметрів, реєстрація підмодулів і збереження/завантаження моделі, які є критично важливими для побудови та навчання моделі.
Як вам вже відомо, багатошаровий перцептрон (MLP) складається з повнозв'язаних шарів (також називаються щільними шарами), де приховані шари обробляють вхідні ознаки, а вихідний шар надає остаточні передбачення класу. Ці повнозв'язані шари представлені як шари nn.Linear у PyTorch.
Пряме поширення
Метод .forward() визначає пряме поширення даних через модель.
def forward(self, x):
# Pass data through layers with activation functions
a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU
a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU
output = self.out(a2) # Output layer (no activation for raw scores)
return output
Вхідний тензор x спочатку проходить через перший повнозв'язаний шар (fc1), після чого застосовується активаційна функція ReLU для введення нелінійності. Далі дані проходять через другий повнозв'язаний шар (fc2), знову з ReLU.
Зрештою, перетворені дані проходять через вихідний шар (out), який формує сирі оцінки (logits) для вихідних класів.
Створення моделі
Оскільки клас моделі вже визначено, тепер можна визначити параметри моделі та створити екземпляр моделі.
Подібно до кількості прихованих шарів, кількість нейронів у кожному прихованому шарі у цьому прикладі обрана досить довільно: 32 та 16 для першого та другого прихованих шарів відповідно.
Відповідно, отримана модель має таку структуру:
- Вхідний шар: відповідає кількості ознак у наборі даних (
64для цього набору даних); - Приховані шари: довільна кількість нейронів (
32та16); - Вихідний шар: відповідає кількості класів (
10digits).
Повна реалізація
12345678910111213141516171819202122232425262728293031323334import torch.nn as nn import torch.nn.functional as F import pandas as pd digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv') # Extract features and target X = digits_df.drop(columns=["target"]).values y = digits_df["target"].values # Define the model class class DigitsClassifier(nn.Module): def __init__(self, input_features, hidden1, hidden2, output_classes): super().__init__() # Define the layers self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer def forward(self, x): # Pass data through layers with activation functions a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU output = self.out(a2) # Output layer (no activation for raw scores) return output # Define model parameters input_features = X.shape[1] # Number of features (pixels) hidden1 = 32 # Number of neurons in first hidden layer hidden2 = 16 # Number of neurons in second hidden layer output_classes = len(digits_df["target"].unique()) # Number of unique digits (0-9) # Create an instance of the model model = DigitsClassifier(input_features, hidden1, hidden2, output_classes) # Display the model structure print(model)
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 5
Створення Простої Нейронної Мережі
Свайпніть щоб показати меню
Наша мета — побудувати базову нейронну мережу на PyTorch, використовуючи digits dataset — класичний набір даних у машинному навчанні. Завдання полягає у прогнозуванні цифри (цільова змінна) за зображенням її рукописного написання, представленого у вигляді набору значень пікселів (ознаки).
Огляд набору даних
Digits dataset містить зображення рукописних цифр, представлені у вигляді числових значень пікселів. Кожен зразок складається з 64 ознак, що відповідають інтенсивності пікселів з 8×8 зображення у відтінках сірого. Цільова змінна ('target' стовпець) відображає клас цифри (0-9), тобто, яке число зображено на картинці.
Перший крок — зчитування CSV-файлу та виділення ознак (X) і цільової змінної (y), яка є вихідною величиною для прогнозування:
import pandas as pd
digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv')
# Extract features and target
X = digits_df.drop(columns=["target"]).values
y = digits_df["target"].values
Визначення класу моделі
Спочатку необхідно імпортувати всі потрібні модулі PyTorch (nn, F). Модуль nn використовується для визначення шарів моделі та архітектури, а модуль F містить функції активації, функції втрат та інші утиліти, які часто застосовуються у функціональному стилі.
import torch.nn as nn
import torch.nn.functional as F
Тепер можна перейти до визначення класу моделі:
class DigitsClassifier(nn.Module):
...
Щоразу, коли визначається клас моделі у PyTorch, він повинен наслідуватися від nn.Module, оскільки це забезпечує необхідні функції, такі як автоматичне управління параметрами, визначення методу forward() і використання вбудованих утиліт, наприклад, збереження/завантаження моделі та доступ до параметрів. Це спрощує процес побудови, навчання та розгортання нейронних мереж, автоматизуючи багато завдань.
Архітектура моделі
Оскільки завдання є простою багатокласовою класифікацією, достатньо використати багатошаровий перцептрон (MLP) з 2 прихованими шарами.
class DigitsClassifier(nn.Module):
def __init__(self, input_features, hidden1, hidden2, output_classes):
super().__init__()
# Define the layers
self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer
self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer
self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer
Виклик super().__init__() ініціалізує батьківський клас nn.Module, що забезпечує важливу функціональність, таку як відстеження параметрів, реєстрація підмодулів і збереження/завантаження моделі, які є критично важливими для побудови та навчання моделі.
Як вам вже відомо, багатошаровий перцептрон (MLP) складається з повнозв'язаних шарів (також називаються щільними шарами), де приховані шари обробляють вхідні ознаки, а вихідний шар надає остаточні передбачення класу. Ці повнозв'язані шари представлені як шари nn.Linear у PyTorch.
Пряме поширення
Метод .forward() визначає пряме поширення даних через модель.
def forward(self, x):
# Pass data through layers with activation functions
a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU
a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU
output = self.out(a2) # Output layer (no activation for raw scores)
return output
Вхідний тензор x спочатку проходить через перший повнозв'язаний шар (fc1), після чого застосовується активаційна функція ReLU для введення нелінійності. Далі дані проходять через другий повнозв'язаний шар (fc2), знову з ReLU.
Зрештою, перетворені дані проходять через вихідний шар (out), який формує сирі оцінки (logits) для вихідних класів.
Створення моделі
Оскільки клас моделі вже визначено, тепер можна визначити параметри моделі та створити екземпляр моделі.
Подібно до кількості прихованих шарів, кількість нейронів у кожному прихованому шарі у цьому прикладі обрана досить довільно: 32 та 16 для першого та другого прихованих шарів відповідно.
Відповідно, отримана модель має таку структуру:
- Вхідний шар: відповідає кількості ознак у наборі даних (
64для цього набору даних); - Приховані шари: довільна кількість нейронів (
32та16); - Вихідний шар: відповідає кількості класів (
10digits).
Повна реалізація
12345678910111213141516171819202122232425262728293031323334import torch.nn as nn import torch.nn.functional as F import pandas as pd digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv') # Extract features and target X = digits_df.drop(columns=["target"]).values y = digits_df["target"].values # Define the model class class DigitsClassifier(nn.Module): def __init__(self, input_features, hidden1, hidden2, output_classes): super().__init__() # Define the layers self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer def forward(self, x): # Pass data through layers with activation functions a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU output = self.out(a2) # Output layer (no activation for raw scores) return output # Define model parameters input_features = X.shape[1] # Number of features (pixels) hidden1 = 32 # Number of neurons in first hidden layer hidden2 = 16 # Number of neurons in second hidden layer output_classes = len(digits_df["target"].unique()) # Number of unique digits (0-9) # Create an instance of the model model = DigitsClassifier(input_features, hidden1, hidden2, output_classes) # Display the model structure print(model)
Дякуємо за ваш відгук!