Pytorch 6 Input Output
Posted on 15/10/2021, in Italiano. Reading time: 8 minsIndice Globale degli argomenti tra i vari post:
1.1. Indice degli argomenti.
1.1. Introduzione e fonti.
1.1. Lingo - Gergo utilizzato.
1.2. Tensori in Pytorch.
2.1. Chainrule e Autograd.
2.2. Backpropagation.
3.1. Loss e optimizer.
3.2. Modelli di Pytorch.
3.3. Dataset e Dataloader.
3.4. Dataset Transforms.
3.5. Softmax e Cross-Entropy Loss.
3.6. Activation Function.
4.1. Feed Forward Neural Network.
5.1. Convolutional Neural Network.
5.2. Transfer Learning.
5.3. Tensorboard.
6.1. I/O Saving and Loading Models.
7.1. Recurrent Neural Networks.
7.2. RNN, GRU e LSTM.
8.1. Pytorch Lightning.
8.2. LR Scheduler.
9.1. Autoencoder.
I/O Saving and Loading Models
Video-lezione di Python Engineer sul soggetto.
Un modello viene salvato come un dictionary.
i 3 metodi da ricordare:
torch.save(arg, PATH)
posso salvare tensor, model o dictiionary (e posso usare Pickle)torch.load(PATH)
model.load_state_dict(arg)
Ci sono 2 modi per salvare un modello: il modo lazy
e modo raccomandato
- lazy: usando
torch.save(arg, PATH)
e poi carico il modello conmodel =torch.load(PATH)
A questo punto si usa:
model.eval()
in questo modo si entra in modalita’ evaluation (da controllare)
Il difetto del metodo lazy e’ che i dati “serializzati” (intende compressi con pickle) seguono esattamente la classe e la struttura di quando sono salvati.
- modo raccomandato: basta salvare SOLO i parametri del modello stesso:
torch.save(model.state_dict(), PATH)
A questo punto devo creare un nuovo modello, e poi importare i parametri:
model= Model(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.eval()
- i modelli vengono salvati in file che hanno come estensione
pth
Salviamo anche i checkpoint:
un check point e’ un dizionario di dizionari!
- i parametri del modello sono un dizionario
- i parametri dell’optimizer sono un dizionario -….
Quindi quello che facciamo e’ un dizionario in cui la prima key e’ “model” e associamo il dizionario del modello, poi la chiave “optimizer” e il dizionario dell’ottimizzatore. Alla fine quando abbiamo bisogno usiamo checkpoint[“model”] e lui mi restituisce il dizionario con i parametri del modello (o se ho scritto optimizer, quelli dell’ottimizzatore).
######## LAZY method #################
import torch
import torch.nn as nn
class Model(nn.Module): # eredita un oggetto nn.Module
def __init__(self , n_input_features):
super(Model, self).__init__()
self.linear = nn.Linear(n_input_features, 1)
def forward(self, x):
y_pred = torch.sigmoid(self.linear(x))
return y_pred
model = Model(n_input_features=6)
######## SALVO IL MODELLO ############
FILE = "model.pth" # solitamente i modelli hanno come estensione pth ?
torch.save(model, FILE)
######## CARICO IL MODELLO ###########
model = torch.load(FILE)
model.eval()
for param in model.parameters():
print(param)
Parameter containing:
tensor([[-0.3695, 0.2621, 0.0619, -0.2925, -0.3088, -0.2284]],
requires_grad=True)
Parameter containing:
tensor([-0.2680], requires_grad=True)
########## Metodo raccomandato ###########
import torch
import torch.nn as nn
class Model(nn.Module): # eredita un oggetto nn.Module
def __init__(self , n_input_features):
super(Model, self).__init__()
self.linear = nn.Linear(n_input_features, 1)
def forward(self, x):
y_pred = torch.sigmoid(self.linear(x))
return y_pred
model = Model(n_input_features=6)
#for param in model.parameters():
# print('Prima',param)
######## SALVO IL MODELLO ############
FILE = "model-raccomandato.pth" # solitamente i modelli hanno come estensione pth ?
torch.save(model.state_dict(), FILE) # salvo solo i parametri del modello
######## Prima devo definire un modello #####
loaded_model = Model(n_input_features=6) # creo un modello con la stessa struttura
loaded_model.load_state_dict(torch.load(FILE)) # carico i parametri
loaded_model.eval() # setto il modello in eval mode.
#for param in loaded_model.parameters():
# print('Dopo', param)
Model(
(linear): Linear(in_features=6, out_features=1, bias=True)
)
############# Check point ####################
import torch
import torch.nn as nn
class Model(nn.Module): # eredita un oggetto nn.Module
def __init__(self , n_input_features):
super(Model, self).__init__()
self.linear = nn.Linear(n_input_features, 1)
def forward(self, x):
y_pred = torch.sigmoid(self.linear(x))
return y_pred
model = Model(n_input_features=6)
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr= learning_rate)
print(optimizer.state_dict())
####### CHECK point ######
checkpoint = { # e' un dizionario
"epoch":90, # per esempio siamo alla epoca 90
"model_state": model.state_dict(),
"optim_state": optimizer.state_dict()
}
torch.save(checkpoint, "checkpoint.pth")
# a questo punto posso caricare:
loaded_checkpoint =torch.load("checkpoint.pth")
epoch =loaded_checkpoint["epoch"]
model = Model(n_input_features=6)
optimizer = torch.optim.SGD(model.parameters(), lr=0) # mettiamo 0 e poi carichiamo la corretta lr
model.load_state_dict(checkpoint["model_state"])
optimizer.load_state_dict(checkpoint["optim_state"])
print(optimizer.state_dict())
{'state': {}, 'param_groups': [{'lr': 0.01, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0, 1]}]}
{'state': {}, 'param_groups': [{'lr': 0.01, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [0, 1]}]}
Salvare modelli da GPU
Minuto 16 circa.
Gli esempi sopra fungono se tutt il modello e’ tenuto sulla CPU (sia per load che train, validation).
map_location
argomento di load_state_dict(PATH, map_location=device)
non e’ chiaro cosa intenda per save on GPU (io salvo su disco! magari intende che il modello e’ sulla GPU e poi lo metto su disco)
import torch
import torch.nn as nn
# SAVE sulla GPU, load sulla CPU
device = torch.device("cuda")
model.to(device)
torch.save(model.state_dict(), PATH)
device =torch.device("cpu")
model = Model(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location=device))
#####################################
# SAVE sulla GPU, load sulla GPU
device = torch.device("cuda")
model.to(device)
torch.save(model.state_dict(), PATH)
device =torch.device("cpu")
model = Model(*args, **kwargs)
model.load_state_dict(torch.load(PATH))
model.to(device)
#####################################
# SAVE sulla CPU, load sulla GPU
torch.save(model.state_dict(), PATH)
device =torch.device("cuda")
model = Model(*args, **kwargs)
model.load_state_dict(torch.load(PATH, map_location="cuda:0") # 0 e' per la GPU zerp
model.to(device)
Comments