Yksinkertaisen Neuroverkon Luominen
Tavoitteena on rakentaa perus PyTorch-neuroverkko käyttäen digits dataset -aineistoa, joka on klassinen koneoppimisen aineisto. Tehtävänä on ennustaa numero (kohde) käsinkirjoitetun numerokuvan perusteella, joka on esitetty pikseliarvojen (piirteiden) joukkona.
Aineiston yleiskatsaus
Digits dataset sisältää käsinkirjoitettuja numerokuvia, jotka on esitetty numeerisina pikseliarvoina. Jokainen havainto koostuu 64 piirteestä, jotka vastaavat 8×8 harmaasävykuvan pikselien intensiteettejä. Kohdemuuttuja ('target'-sarake) ilmaisee numeroluokan (0-9), eli minkä numeron kuva esittää.
Ensimmäinen vaihe on lukea CSV-tiedosto ja erottaa piirteet (X) sekä kohdemuuttuja (y), joka on mallin ennustettava arvo:
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
Malliluokan määrittely
Aluksi tulee tuoda kaikki tarvittavat PyTorch-moduulit (nn, F). nn-moduulia käytetään mallikerrosten ja arkkitehtuurien määrittelyyn, kun taas F-moduuli sisältää aktivointifunktioita, tappiotoimintoja ja muita usein funktionaalisessa tyylissä käytettyjä apuvälineitä.
import torch.nn as nn
import torch.nn.functional as F
Seuraavaksi voidaan määritellä malliluokka:
class DigitsClassifier(nn.Module):
...
Aina kun määrittelet malliluokan PyTorchissa, sen tulee periä nn.Module-luokasta, koska tämä tarjoaa olennaisia toimintoja, kuten automaattisen parametrien hallinnan, forward()-metodin määrittelyn sekä sisäänrakennetut työkalut, kuten mallin tallennus/lataus ja parametrien käsittely. Tämä yksinkertaistaa neuroverkkojen rakentamista, kouluttamista ja käyttöönottoa hoitamalla monia tehtäviä taustalla.
Mallin arkkitehtuuri
Koska kyseessä on yksinkertainen moniluokkainen luokittelutehtävä, monikerroksinen perceptroni (MLP), jossa on 2 piilokerrosta, riittää.
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
Kutsu super().__init__() alustaa nn.Module-yläluokan, mahdollistaen olennaiset toiminnot, kuten parametrien seurannan, aliluokkien rekisteröinnin ja mallin tallennuksen/latauksen, jotka ovat tärkeitä mallin rakentamisessa ja kouluttamisessa.
Kuten jo tiedät, MLP koostuu täysin yhdistetyistä kerroksista (myös tiheät kerrokset), joissa piilokerrokset käsittelevät syöteominaisuuksia ja ulostulokerros tuottaa lopulliset luokkaprediktiot. Nämä täysin yhdistetyt kerrokset esitetään PyTorchissa nn.Linear -kerroksina.
Eteenpäin suuntautuva laskenta
Tämä .forward()-metodi määrittelee datan eteenpäin suuntautuvan laskennan mallin läpi.
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
Syötetensori x kulkee ensin ensimmäisen täysin yhdistetyn kerroksen (fc1) läpi, jonka jälkeen käytetään ReLU-aktivointifunktiota epälineaarisuuden lisäämiseksi. Tämän jälkeen data kulkee toisen täysin yhdistetyn kerroksen (fc2) läpi, jälleen ReLU:n kanssa.
Lopuksi muunnettu data kulkee ulostulokerroksen (out) läpi, joka tuottaa raaka-arvot (logitit) ulostuloluokille.
Mallin luominen
Koska malliluokka on nyt määritelty, voidaan nyt määrittää mallin parametrit ja luoda mallin ilmentymä.
Samoin kuin piilokerrosten lukumäärä, piilokerrosten neuronien määrä valitaan tässä esimerkissä melko satunnaisesti: 32 ja 16 ensimmäiselle ja toiselle piilokerrokselle.
Näin ollen tuloksena oleva malli rakentuu seuraavasti:
- Syötekerros: vastaa tietoaineiston ominaisuuksien määrää (
64tässä aineistossa); - Piilokerrokset: satunnaiset neuronimäärät (
32ja16); - Ulostulokerros: vastaa luokkien määrää (
10numeroa).
Täydellinen toteutus
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)
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 5
Yksinkertaisen Neuroverkon Luominen
Pyyhkäise näyttääksesi valikon
Tavoitteena on rakentaa perus PyTorch-neuroverkko käyttäen digits dataset -aineistoa, joka on klassinen koneoppimisen aineisto. Tehtävänä on ennustaa numero (kohde) käsinkirjoitetun numerokuvan perusteella, joka on esitetty pikseliarvojen (piirteiden) joukkona.
Aineiston yleiskatsaus
Digits dataset sisältää käsinkirjoitettuja numerokuvia, jotka on esitetty numeerisina pikseliarvoina. Jokainen havainto koostuu 64 piirteestä, jotka vastaavat 8×8 harmaasävykuvan pikselien intensiteettejä. Kohdemuuttuja ('target'-sarake) ilmaisee numeroluokan (0-9), eli minkä numeron kuva esittää.
Ensimmäinen vaihe on lukea CSV-tiedosto ja erottaa piirteet (X) sekä kohdemuuttuja (y), joka on mallin ennustettava arvo:
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
Malliluokan määrittely
Aluksi tulee tuoda kaikki tarvittavat PyTorch-moduulit (nn, F). nn-moduulia käytetään mallikerrosten ja arkkitehtuurien määrittelyyn, kun taas F-moduuli sisältää aktivointifunktioita, tappiotoimintoja ja muita usein funktionaalisessa tyylissä käytettyjä apuvälineitä.
import torch.nn as nn
import torch.nn.functional as F
Seuraavaksi voidaan määritellä malliluokka:
class DigitsClassifier(nn.Module):
...
Aina kun määrittelet malliluokan PyTorchissa, sen tulee periä nn.Module-luokasta, koska tämä tarjoaa olennaisia toimintoja, kuten automaattisen parametrien hallinnan, forward()-metodin määrittelyn sekä sisäänrakennetut työkalut, kuten mallin tallennus/lataus ja parametrien käsittely. Tämä yksinkertaistaa neuroverkkojen rakentamista, kouluttamista ja käyttöönottoa hoitamalla monia tehtäviä taustalla.
Mallin arkkitehtuuri
Koska kyseessä on yksinkertainen moniluokkainen luokittelutehtävä, monikerroksinen perceptroni (MLP), jossa on 2 piilokerrosta, riittää.
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
Kutsu super().__init__() alustaa nn.Module-yläluokan, mahdollistaen olennaiset toiminnot, kuten parametrien seurannan, aliluokkien rekisteröinnin ja mallin tallennuksen/latauksen, jotka ovat tärkeitä mallin rakentamisessa ja kouluttamisessa.
Kuten jo tiedät, MLP koostuu täysin yhdistetyistä kerroksista (myös tiheät kerrokset), joissa piilokerrokset käsittelevät syöteominaisuuksia ja ulostulokerros tuottaa lopulliset luokkaprediktiot. Nämä täysin yhdistetyt kerrokset esitetään PyTorchissa nn.Linear -kerroksina.
Eteenpäin suuntautuva laskenta
Tämä .forward()-metodi määrittelee datan eteenpäin suuntautuvan laskennan mallin läpi.
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
Syötetensori x kulkee ensin ensimmäisen täysin yhdistetyn kerroksen (fc1) läpi, jonka jälkeen käytetään ReLU-aktivointifunktiota epälineaarisuuden lisäämiseksi. Tämän jälkeen data kulkee toisen täysin yhdistetyn kerroksen (fc2) läpi, jälleen ReLU:n kanssa.
Lopuksi muunnettu data kulkee ulostulokerroksen (out) läpi, joka tuottaa raaka-arvot (logitit) ulostuloluokille.
Mallin luominen
Koska malliluokka on nyt määritelty, voidaan nyt määrittää mallin parametrit ja luoda mallin ilmentymä.
Samoin kuin piilokerrosten lukumäärä, piilokerrosten neuronien määrä valitaan tässä esimerkissä melko satunnaisesti: 32 ja 16 ensimmäiselle ja toiselle piilokerrokselle.
Näin ollen tuloksena oleva malli rakentuu seuraavasti:
- Syötekerros: vastaa tietoaineiston ominaisuuksien määrää (
64tässä aineistossa); - Piilokerrokset: satunnaiset neuronimäärät (
32ja16); - Ulostulokerros: vastaa luokkien määrää (
10numeroa).
Täydellinen toteutus
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)
Kiitos palautteestasi!