# Pytorch for dummy

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/5JInQJzhU0nP5wRP-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/5JInQJzhU0nP5wRP-image.png)

Originariamente impletato da META ora fa parte della Linux foundation

La base di tutto è il tensore, che non è altro che una matrice (o un array) sulla quale PT consente tutta una serie di operazioni, un po' come numpy, es:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/2Wy98ryNFWIMKs54-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/2Wy98ryNFWIMKs54-image.png)

es:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/33x62opLJgWKlLc7-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/33x62opLJgWKlLc7-image.png)

##### Layer della rete neurale

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/GpK546stIUrHPhB4-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/GpK546stIUrHPhB4-image.png)

la parte in rosso sono gli input della rete, detta "features", la parte in grigio sono i layer "nascosi", mentra la parte di blu è l'output layer ovvero l'output desiderato.

##### Classificatori

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/r2OjVZ9CllxyQQcQ-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/r2OjVZ9CllxyQQcQ-image.png)

Le funzioni possono essere:

- <span style="color: rgb(22, 145, 121);">**Sigmoid** </span>per la classificazione binaria (un unico output con un valore compreso tra 0 e 1)[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/Uv23PqcWloLiMdRr-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/Uv23PqcWloLiMdRr-image.png)
- <span style="color: rgb(22, 145, 121);">**Softmax** </span>per la multi classificazione, va messo come ultimi layer della rete neurale. (dove l'ultimo livelo di neurino definice il numero di valori da classificre)[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/zu9mewmoDwJTDmmI-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/zu9mewmoDwJTDmmI-image.png)
- yy per la regressione, ovvero per predirre un flusso continuo di valori numerici, in questo caso non verrò inserita nessuna funzione di attivazione

##### Forward pass

è l'operazione di passaggio dei pesi e del bias da un layer della rete a quello successivo

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/6Y4LDw7Kmim4FZhM-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/6Y4LDw7Kmim4FZhM-image.png)

##### Loss function

La LF indica quanto il modello è <span style="text-decoration: underline;">efficace </span>nel predirre i valori <span style="text-decoration: underline;">durante la fase di training</span>.

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/o97ucS9Qpsjfrtwc-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/o97ucS9Qpsjfrtwc-image.png)

La funzione di "loss" indicata come F, riceve in input i valori corretti associati alle features utilizzate durante il training e quelli generati dal modello -&gt; F(y,**<span style="color: rgb(186, 55, 42);">y</span><span style="color: rgb(186, 55, 42);">'</span>**)

L'outuput è un valore numerico

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/TXrs8UtxFNwq4hIk-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/TXrs8UtxFNwq4hIk-image.png)

Una delle funzioni di loss function è la *CrossEntropyLoss* che vuole in i<span style="text-decoration: underline;">nput i valori calcolati dalla rete</span> <span style="text-decoration: underline;">e le label </span>che rappresentano il valore "<span style="text-decoration: underline;">vero</span>". L'ouput è il valore di "<span style="text-decoration: underline;">**loss**</span>" vero e proprio che, attraverso la<span style="text-decoration: underline;"> backpropagation bisogna minimizzare</span>.

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/hsdvDCYStMh7n3EW-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/hsdvDCYStMh7n3EW-image.png)

#####  

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/AJwKIZ8go1FVysvq-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/AJwKIZ8go1FVysvq-image.png)

##### La Backpropagation

Una volta calcolati i pesi e i bias della rete neurale, si prende il valore generato y' e si effettua un'operazione di backpropagation che, attraverso il calcolo della discesa del gradiente va a ricalcolare i pesi e i bias a ritroso per ciascun layar, al fine dir minimizzare l'errore.

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/xYcjFK4yvuWEseUM-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/xYcjFK4yvuWEseUM-image.png)

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/vPGF3X9HkRE0FCeM-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/vPGF3X9HkRE0FCeM-image.png)

vediamolo in PT:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/GK1IO9UagprJCqVp-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/GK1IO9UagprJCqVp-image.png)

##### Preparazione dei dati per il training

Ci sono 4 passi fondamentali prima di "allenare" la rete neurale, ovvero:

prendiamo per esempio un dataset di animali dove le prime colonne (esclusa la zero che è puramente decrittiva) rappresentano le "features" mentre l'ultima indica il tipo di animale:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/QTiG2tdyTBJIUXIi-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/QTiG2tdyTBJIUXIi-image.png)

selezioniamo le fetures:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/AKgS39O4CBVDEKH5-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/AKgS39O4CBVDEKH5-image.png)

ora le labels

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/HGmzTqnF98qIwZvJ-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/HGmzTqnF98qIwZvJ-image.png)

Ora utilizziamo l'oggetto TensorDataset per caricare le x e le y:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/VrGMWIQdANcPflta-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/VrGMWIQdANcPflta-image.png)

ora creiamo il dataloader per gestire il carico dei dati efficacemente durante il training

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/Guz5Igol1Y9amfR2-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/Guz5Igol1Y9amfR2-image.png)

avendo setto il batch size a 2 ad ogni iterazione del dataloader estrarrò solo un bach di due elementi (in questo 2 carratteristiche di animali e il tipo), come sotto riportato:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/5AW7N3Uczgje0T3m-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/5AW7N3Uczgje0T3m-image.png)

essemdo solo 5 animali si può notarer come l'ultimo batch contenga un solo animale.

**Quindi il cliclo for fa passare tutto il dataset.**

##### Training

ora possiamo procedere con il training, che consiste in:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/Eh6m7MKLaLRpBso9-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/Eh6m7MKLaLRpBso9-image.png)

Il training è molto importante perchè consenti di minimizzare la loss e di appore delle modifiche al training stesso.

##### Regressione

La regressione consente di avere un valore lineare come output.

Per la regressione so utilizza in genere la funzione di loss MSE (mean square error)

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/0HVVwCmCm9JndKAx-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/0HVVwCmCm9JndKAx-image.png)

facciamo un esempio di regression i gli stipendi dei data scientist:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/utNvjH8uVVlTeSX3-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/utNvjH8uVVlTeSX3-image.png)

creiamo la rete neurale

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/PnwueCqqq9gXnyND-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/PnwueCqqq9gXnyND-image.png)

adesso loppiamo su tutto il dataset

```python
# The training loop
for epoch in range(num_epochs):
  for data in dataloader:
    # va azzerato ad ogni epoca
    optimizer.zero_grad()
    
    # Get feature and target from the data loader
    feature, target = data
    
    # Run a forward pass
    pred = model(feature)
    
    # Compute loss and gradients
    loss = criterion(pred, target)
    loss.backward()
    
    # Update the parameters
    optimizer.step()
```

##### Utilizzo Softmax vs ReLU.

E' emerso che per gli hidden layer è meglio utilizzare la <span style="color: rgb(186, 55, 42);">**funzione di attivazione**</span> ReLU, mentre per l'output layer si può utilizzare anche la Softmax.

##### Leaky ReLU

Migliora la ReLU moltiplicando i valori di input per un coefficiente che evita i casi di disattivazione totale del neurone che causa lo stop dell'apprendimento.

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/xGDkPzkRsuMfHqIC-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/xGDkPzkRsuMfHqIC-image.png)

##### Learing rate e momentum

Il LR è il passo utilizzato per arrivare al mimimo durante la fase della discesa del gradiente, se è troppo piccolo non arrivieremo al minimo, come qui:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/OFYUV1WRvZI3PCoL-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/OFYUV1WRvZI3PCoL-image.png)

se è troppo grande, continua a rimbalzare senza trovare cmq il minimo, come qui:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/JVJouDcm27ScueSC-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/JVJouDcm27ScueSC-image.png)

Il "momento" invece rappresenta l'inzeria con la quale si effettuano i passi, serve per evitare di fermarsi ad un "minimo locale", in sintesi:

[![image.png](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/scaled-1680-/UuSxqfXQ6EjVQZwL-image.png)](https://cms.marcocucchi.it/uploads/images/gallery/2025-12/UuSxqfXQ6EjVQZwL-image.png)

Valutazione del modello

https://www.youtube.com/watch?v=IFsVsXAqPto

<span class="yt-core-attributed-string--link-inherit-color" dir="auto">[47:37](https://www.youtube.com/watch?v=IFsVsXAqPto&t=2857s)</span><span class="yt-core-attributed-string--link-inherit-color" dir="auto"> Evaluating Models with Training and Validation Data </span>