Perus-RNN:n Toteuttaminen
Toteutamme yksinkertaisen RNN:n havainnollistaaksemme, miten verkko käsittelee sekventiaalista dataa ja tekee ennusteita. Käytämme pientä testidataa esitelläksemme, kuinka RNN oppii datasta ja säätää painojaan.
- Testidatan luominen: ensin generoimme pienen aineiston, joka koostuu yksinkertaisista numeerisista sekvensseistä. Näitä sekvenssejä käytetään opettamaan RNN:ää tunnistamaan datan sisäisiä kuvioita;
sequences = np.random.rand(self.num_samples, self.seq_length, input_size).astype(np.float32)
labels = np.zeros(self.num_samples, dtype=np.int64)
- RNN-mallin rakentaminen: luomme yksinkertaisen RNN-arkkitehtuurin, jossa on yksi piilokerros. Syötekerros vastaanottaa datan, piilokerros käsittelee sen ja välittää tuloksen seuraavaan vaiheeseen. Lopullinen kerros antaa ennusteen;
self.hidden_size = hidden_size
self.num_layers = num_layers
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
- RNN:n kouluttaminen: koulutuksen aikana RNN säätää sisäisiä painojaan takaisinkytkentäalgoritmin avulla minimoidakseen ennustevirheet. Käytämme häviöfunktiota (esim. keskineliövirhe) mittaamaan mallin suorituskykyä;
for i, (sequences, labels) in enumerate(dataloader):
# --- Forward pass ---
outputs = model(sequences) # Get model predictions (logits)
loss = criterion(outputs, labels) # Calculate the loss
# --- Backward pass and optimization ---
optimizer.zero_grad() # Clear gradients from the previous iteration
loss.backward() # Compute gradients (Backpropagation Through Time happens here)
optimizer.step() # Update model parameters based on gradients
# --- Track metrics ---
total_loss += loss.item() # Accumulate the loss (loss.item() gets the scalar value)
# Calculate accuracy for the batch
_, predicted_classes = torch.max(outputs.data, 1) # Get the index (class) with the highest score
total_samples += labels.size(0) # Add the number of samples in this batch
correct_predictions += (predicted_classes == labels).sum().item()
- Mallin arviointi: koulutuksen jälkeen testaamme RNN:n kykyä ennustaa tulevia datapisteitä opituista testidatan kuvioista. Tämä auttaa arvioimaan, kuinka hyvin malli yleistää;
all_sequences, all_labels = dataset[:]
# Get model predictions for the entire dataset
outputs = model(all_sequences)
# Find the predicted class for each sample
_, predicted = torch.max(outputs.data, 1)
# Calculate total number of samples and correct predictions
total = all_labels.size(0)
correct = (predicted == all_labels).sum().item()
# Print the final accuracy
print(f'Accuracy of the model on the {total} training sequences: {100 * correct / total:.2f} %')
- Koodiesimerkki: tämän luvun koodi on ladattavissa.
Yhteenvetona: yksinkertaisen RNN:n toteutus sisältää datan valmistelun, arkkitehtuurin määrittelyn, mallin koulutuksen ja suorituskyvyn arvioinnin. Tämä käytännönläheinen lähestymistapa antaa ymmärrystä siitä, miten RNN:iä voidaan hyödyntää sekvenssien ennustustehtävissä.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain what the hidden state in an RNN does and why it's important?
How does the sequence length affect the RNN's ability to learn patterns?
What are some common shortcomings of basic RNNs that were mentioned?
Awesome!
Completion rate improved to 4.55
Perus-RNN:n Toteuttaminen
Pyyhkäise näyttääksesi valikon
Toteutamme yksinkertaisen RNN:n havainnollistaaksemme, miten verkko käsittelee sekventiaalista dataa ja tekee ennusteita. Käytämme pientä testidataa esitelläksemme, kuinka RNN oppii datasta ja säätää painojaan.
- Testidatan luominen: ensin generoimme pienen aineiston, joka koostuu yksinkertaisista numeerisista sekvensseistä. Näitä sekvenssejä käytetään opettamaan RNN:ää tunnistamaan datan sisäisiä kuvioita;
sequences = np.random.rand(self.num_samples, self.seq_length, input_size).astype(np.float32)
labels = np.zeros(self.num_samples, dtype=np.int64)
- RNN-mallin rakentaminen: luomme yksinkertaisen RNN-arkkitehtuurin, jossa on yksi piilokerros. Syötekerros vastaanottaa datan, piilokerros käsittelee sen ja välittää tuloksen seuraavaan vaiheeseen. Lopullinen kerros antaa ennusteen;
self.hidden_size = hidden_size
self.num_layers = num_layers
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
- RNN:n kouluttaminen: koulutuksen aikana RNN säätää sisäisiä painojaan takaisinkytkentäalgoritmin avulla minimoidakseen ennustevirheet. Käytämme häviöfunktiota (esim. keskineliövirhe) mittaamaan mallin suorituskykyä;
for i, (sequences, labels) in enumerate(dataloader):
# --- Forward pass ---
outputs = model(sequences) # Get model predictions (logits)
loss = criterion(outputs, labels) # Calculate the loss
# --- Backward pass and optimization ---
optimizer.zero_grad() # Clear gradients from the previous iteration
loss.backward() # Compute gradients (Backpropagation Through Time happens here)
optimizer.step() # Update model parameters based on gradients
# --- Track metrics ---
total_loss += loss.item() # Accumulate the loss (loss.item() gets the scalar value)
# Calculate accuracy for the batch
_, predicted_classes = torch.max(outputs.data, 1) # Get the index (class) with the highest score
total_samples += labels.size(0) # Add the number of samples in this batch
correct_predictions += (predicted_classes == labels).sum().item()
- Mallin arviointi: koulutuksen jälkeen testaamme RNN:n kykyä ennustaa tulevia datapisteitä opituista testidatan kuvioista. Tämä auttaa arvioimaan, kuinka hyvin malli yleistää;
all_sequences, all_labels = dataset[:]
# Get model predictions for the entire dataset
outputs = model(all_sequences)
# Find the predicted class for each sample
_, predicted = torch.max(outputs.data, 1)
# Calculate total number of samples and correct predictions
total = all_labels.size(0)
correct = (predicted == all_labels).sum().item()
# Print the final accuracy
print(f'Accuracy of the model on the {total} training sequences: {100 * correct / total:.2f} %')
- Koodiesimerkki: tämän luvun koodi on ladattavissa.
Yhteenvetona: yksinkertaisen RNN:n toteutus sisältää datan valmistelun, arkkitehtuurin määrittelyn, mallin koulutuksen ja suorituskyvyn arvioinnin. Tämä käytännönläheinen lähestymistapa antaa ymmärrystä siitä, miten RNN:iä voidaan hyödyntää sekvenssien ennustustehtävissä.
Kiitos palautteestasi!