Panoramica sugli Strati di PyTorch per il Deep Learning

March 3, 2025

Nel mondo del deep learning, le reti neurali sono costruite utilizzando una varietà di strati (layers), ciascuno progettato per svolgere compiti specifici. PyTorch, un popolare framework per il machine learning, offre una vasta gamma di strati nel modulo torch.nn, che permettono di costruire modelli complessi e adattabili. Questa guida esplora tutti gli strati disponibili in PyTorch, fornendo una spiegazione dettagliata, parametri chiave ed esempi di codice per ogni strato.

1. Strati Lineari (Linear Layers)

Gli strati lineari sono i mattoni fondamentali delle reti neurali. Essi effettuano una trasformazione lineare degli input.

Esempio:

import torch
import torch.nn as nn

# Creazione di uno strato lineare con 5 feature in ingresso e 3 in uscita
linear_layer = nn.Linear(5, 3)

# Eseguo l'inferenza su un input casuale
input_tensor = torch.randn(1, 5)
output = linear_layer(input_tensor)
print("Output shape:", output.shape)  # Shape atteso: torch.Size([1, 3])

2. Strati Convolutivi (Conv Layers)

Gli strati convolutivi sono essenziali nell'elaborazione delle immagini.

Esempio con Conv2d:

# Parametri: in_canali, out_canali, kernel_size, stride, padding
conv_layer = nn.Conv2d(1, 10, kernel_size=5, stride=2, padding=2)

input_tensor = torch.randn(1, 1, 28, 28)  # Batch size 1, canale singolo, dimensioni 28x28
output = conv_layer(input_tensor)
print("Output shape:", output.shape)

3. Strati Transposti Convolutivi (Transposed Conv Layers)

Utilizzati per aumentare le dimensioni spaziali di un'immagine.

Esempio con ConvTranspose2d:

transp_conv_layer = nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2)
input_tensor = torch.randn(1, 1, 16, 16)  
output = transp_conv_layer(input_tensor)
print("Output shape:", output.shape)

4. Strati di Massimo Raggruppamento (Max Pooling Layers)

Riducono le dimensioni spaziali dell'input mantenendo le caratteristiche più importanti.

Esempio con MaxPool2d:

max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
input_tensor = torch.randn(1, 1, 32, 32)  
output = max_pool(input_tensor)
print("Output shape:", output.shape)

5. Strati di Media Raggruppamento (Average Pooling Layers)

Simili al max pooling ma utilizzano la media come funzione di raggruppamento.

Esempio con AvgPool2d:

avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)
input_tensor = torch.randn(1, 1, 32, 32)  
output = avg_pool(input_tensor)
print("Output shape:", output.shape)

6. Dropout

Regolarizza il modello disattivando casualmente alcuni neuroni durante l'addestramento.

Esempio:

dropout_layer = nn.Dropout(p=0.5)
input_tensor = torch.randn(1, 10)  
output = dropout_layer(input_tensor)
print("Output shape:", output.shape)

7. Batch Normalization

Normalizza l'input prima di applicare l'attivazione, accelerando l'addestramento.

Esempio:

bn_layer = nn.BatchNorm1d(10)  # Per input a una dimensione
input_tensor = torch.randn(1, 10)
output = bn_layer(input_tensor)
print("Output shape:", output.shape)

8. Strati Ricorrenti (RNN, LSTM, GRU)

Elaborano dati sequenziali come testo o serie temporali.

Esempio con LSTM:

lstm_layer = nn.LSTM(input_size=10, hidden_size=20, num_layers=1, batch_first=True)
input_tensor = torch.randn(1, 5, 10)  # Batch size 1, sequenza di 5 passi, input size 10
output, (hn, cn) = lstm_layer(input_tensor)
print("Output shape:", output.shape)  # (1, 5, 20)

9. Transformer Layers

Includono meccanismi di attenzione multi-testa per processi sequenziali.

Esempio con MultiheadAttention:

import torch.nn.functional as F

attention_layer = nn.MultiheadAttention(embed_dim=10, num_heads=2)
query = torch.randn(1, 5, 10)  # batch_size=1, seq_len=5, embed_dim=10
key = torch.randn(1, 5, 10)
value = torch.randn(1, 5, 10)

output, _ = attention_layer(query, key, value)
print("Output shape:", output.shape)  # (1, 5, 10)

10. Upsample Layers

Aumentano le dimensioni spaziali di un'immagine.

Esempio con Upsample:

upsample_layer = nn.Upsample(scale_factor=2, mode='nearest')
input_tensor = torch.randn(1, 1, 16, 16)  
output = upsample_layer(input_tensor)
print("Output shape:", output.shape)  # (1, 1, 32, 32)

11. Strati di Incorporamento (Embedding Layers)

Mappano indici discreti in vettori densi.

Esempio:

embedding_layer = nn.Embedding(num_embeddings=10, embedding_dim=5)
input_tensor = torch.randint(0, 10, (1, 3))  # Batch size 1, sequenza di 3 elementi
output = embedding_layer(input_tensor)
print("Output shape:", output.shape)  # (1, 3, 5)

12. Layer Normalization

Normalizza l'input lungo un certo insieme di dimensioni.

Esempio:

ln_layer = nn.LayerNorm(10)  
input_tensor = torch.randn(1, 10)
output = ln_layer(input_tensor)
print("Output shape:", output.shape)

13. Group Normalization

Normalizza l'input dividendo i canali in gruppi.

Esempio:

gn_layer = nn.GroupNorm(num_groups=2, num_channels=10)  
input_tensor = torch.randn(1, 10, 5, 5)
output = gn_layer(input_tensor)
print("Output shape:", output.shape)

14. Adaptive Max Pooling

Applica raggruppamento adattivo per mantenere dimensioni di uscita fisse.

Esempio con AdaptiveMaxPool2d:

adaptive_max_pool = nn.AdaptiveMaxPool2d((3, 3))
input_tensor = torch.randn(1, 1, 6, 6)  
output = adaptive_max_pool(input_tensor)
print("Output shape:", output.shape)

15. Softmax

Utilizzato come ultima attivazione per ottenere probabilità nella classe di uscita.

Esempio:

softmax_layer = nn.Softmax(dim=1)  
input_tensor = torch.randn(1, 5)
output = softmax_layer(input_tensor)
print("Output shape:", output.shape)

Conclusione

Ogni strato in PyTorch è progettato per specifiche funzionalità, permettendo ai modelli di adattarsi a vari compiti. Comprendere questi strati è essenziale per costruire reti neurali efficaci. Questa guida fornisce una base solida per esplorare ulteriormente le potenzialità di PyTorch nel deep learning.

Per un approfondimento, si consiglia di consultare la documentazione ufficiale di PyTorch e sperimentare con diversi modelli per vedere come questi strati possano essere combinati per risolvere problemi reali.