1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import torch from dataset import get_dataloader from model import DNN import eval
def train(epochs=10): train_data_loader = get_dataloader(True) eval_dataloader = get_dataloader(False)
dnn = DNN(1,28,28)
optimizer = torch.optim.Adam(dnn.parameters(), lr=0.001) lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer,len(train_data_loader),gamma=0.8) nll_loss = torch.nn.NLLLoss()
per=0 for epoch in range(epochs): dnn.train() step = 0 for images,labels in train_data_loader: optimizer.zero_grad() images = images.reshape((-1,1*28*28)) output = dnn(images) loss = nll_loss(output,labels) loss.backward()
optimizer.step() lr_scheduler.step() step += 1 if step % 100 == 0: print("epcoh: {} / {} ,step {} / {},lr: {},loss{}".format( epoch + 1, epochs, step, len(train_data_loader), lr_scheduler.get_last_lr(), loss)) per_now = eval.eval_model(dnn, eval_dataloader) torch.save(dnn.state_dict(),"dnn_new.path") if(per_now>per): print("save best model per is {:.2f}%".format(per_now.cpu().item()*100)) torch.save(dnn.state_dict(),"dnn_best.path") per=per_now
if __name__ == '__main__': train()
|