[Python] how to save epoches every 20 times and load model again?

Discussão em 'Python' iniciado por Stack, Fevereiro 18, 2025.

  1. Stack

    Stack Membro Participativo

    i want to train this model on colab and it has 1000 epoches ..but its takes too long.

    this is my code with python:

    its training a model for 1000 epoches ,

    and i want to save epoches every 20 times(for example) and load model again and continue from last epoch .

    example : train from 1 to 20 , then save model...then load model and continue from 20 to 40 and so .

    import argparse
    import numpy as np
    import pandas as pd
    import sys, os
    from random import shuffle
    import torch
    import torch.nn as nn
    from models.gcn import GCNNet
    from utils import *

    # training function at each epoch
    def train(model, device, train_loader, optimizer, epoch,hidden,cell):
    print('Training on {} samples...'.format(len(train_loader.dataset)))
    model.train()
    for batch_idx, data in enumerate(train_loader):
    data = data.to(device)
    optimizer.zero_grad()
    output = model(data,hidden,cell)
    loss = loss_fn(output, data.y.view(-1, 1).float().to(device))
    loss.backward()
    optimizer.step()
    if batch_idx % LOG_INTERVAL == 0:
    print('Train epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch,
    batch_idx * len(data.x),
    len(train_loader.dataset),
    100. * batch_idx / len(train_loader),
    loss.item()))

    def predicting(model, device, loader,hidden,cell):
    model.eval()
    total_preds = torch.Tensor()
    total_labels = torch.Tensor()
    print('Make prediction for {} samples...'.format(len(loader.dataset)))
    with torch.no_grad():
    for data in loader:
    data = data.to(device)
    output = model(data,hidden,cell)
    total_preds = torch.cat((total_preds, output.cpu()), 0)
    total_labels = torch.cat((total_labels, data.y.view(-1, 1).cpu()), 0)
    return total_labels.numpy().flatten(),total_preds.numpy().flatten()


    loss_fn = nn.MSELoss()
    LOG_INTERVAL = 20

    def main(args):
    dataset = args.dataset
    modeling = [GCNNet]
    model_st = modeling[0].__name__

    cuda_name = "cuda:0"
    print('cuda_name:', cuda_name)

    TRAIN_BATCH_SIZE = args.batch_size
    TEST_BATCH_SIZE = args.batch_size
    LR = args.lr

    NUM_EPOCHS = args.epoch

    print('Learning rate: ', LR)
    print('Epochs: ', NUM_EPOCHS)

    # Main program: iterate over different datasets
    print('\nrunning on ', model_st + '_' + dataset )
    processed_data_file_train = 'data/processed/' + dataset + '_train.pt'
    processed_data_file_test = 'data/processed/' + dataset + '_test.pt'
    if ((not os.path.isfile(processed_data_file_train)) or (not os.path.isfile(processed_data_file_test))):
    print('please run create_data.py to prepare data in pytorch format!')
    else:
    train_data = TestbedDataset(root='data', dataset=dataset+'_train')
    test_data = TestbedDataset(root='data', dataset=dataset+'_test')

    # make data PyTorch mini-batch processing ready
    train_loader = DataLoader(train_data, batch_size=TRAIN_BATCH_SIZE, shuffle=True,drop_last=True)
    test_loader = DataLoader(test_data, batch_size=TEST_BATCH_SIZE, shuffle=False,drop_last=True)

    # training the model
    device = torch.device(cuda_name if torch.cuda.is_available() else "cpu")
    model = modeling[0](k1=1,k2=2,k3=3,embed_dim=128,num_layer=1,device=device).to(device)



    optimizer = torch.optim.Adam(model.parameters(), lr=LR)
    best_mse = 1000
    best_ci = 0
    best_epoch = -1
    #model_file_name = 'model' + model_st + '_' + dataset + '.model'
    result_file_name = 'result' + model_st + '_' + dataset + '.csv'


    ##TRAIN _ NUM OF EPOCHES
    for epoch in range(NUM_EPOCHS):
    hidden,cell = model.init_hidden(batch_size=TRAIN_BATCH_SIZE)
    train(model, device, train_loader, optimizer, epoch+1,hidden,cell)
    G,P = predicting(model, device, test_loader,hidden,cell)
    ret = [rmse(G,P),mse(G,P),pearson(G,P),spearman(G,P),ci(G,P),get_rm2(G.reshape(G.shape[0],-1),P.reshape(P.shape[0],-1))]
    if ret[1]<best_mse:
    if args.save_file:
    model_file_name = args.save_file + '.model'
    torch.save(model.state_dict(), model_file_name)


    with open(result_file_name,'w') as f:
    f.write('rmse,mse,pearson,spearman,ci,rm2\n')
    f.write(','.join(map(str,ret)))
    best_epoch = epoch+1
    best_mse = ret[1]
    best_ci = ret[-2]
    print('rmse improved at epoch ', best_epoch, '; best_mse,best_ci:', best_mse,best_ci,model_st,dataset)
    else:
    print(ret[1],'No improvement since epoch ', best_epoch, '; best_mse,best_ci:', best_mse,best_ci,model_st,dataset)

    if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Run DeepGLSTM")

    parser.add_argument("--dataset",type=str,default='davis',
    help="Dataset Name (davis,kiba,DTC,Metz,ToxCast,Stitch)")

    parser.add_argument("--epoch",
    type = int,
    default = 1000,
    help="Number of training epochs. Default is 1000."
    )

    parser.add_argument("--lr",
    type=float,
    default = 0.0005,
    help="learning rate",
    )

    parser.add_argument("--batch_size",type=int,
    default = 128,
    help = "Number of drug-tareget per batch. Default is 128 for davis.") # batch 128 for Davis

    parser.add_argument("--save_file",type=str,
    default=None,
    help="Where to save the trained model. For example davis.model")


    args = parser.parse_args()
    print(args)
    main(args)


    what shoud i do for my code ?
    ​

    Continue reading...

Compartilhe esta Página