zhangj726's picture
Upload 50 files
3f42bd3
import math
import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim
from src.utils.utils import make_cuda
from torch.nn import functional as F
from sklearn.metrics import mean_squared_error, mean_absolute_error
def train(args, model, data_loader, initial=False):
optimizer = optim.Adam(model.parameters(), lr=args.learning_rate)
model.train()
num_epochs = args.initial_epochs if initial else args.num_epochs
for epoch in range(num_epochs):
loss = 0
for step, (features, targets) in enumerate(data_loader):
features = make_cuda(features)
targets = make_cuda(targets)
optimizer.zero_grad()
pre, _ = model(features)
crs_loss = model.cross_entropy(pre, targets.reshape(-1))
loss += crs_loss.item()
crs_loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad_norm)
optimizer.step()
# print step info
if (step + 1) % args.log_step == 0:
print("Epoch [%.3d/%.3d] Step [%.3d/%.3d]: CROSS_loss=%.4f, RCROSS_loss=%.4f"
% (epoch + 1,
num_epochs,
step + 1,
len(data_loader),
loss / args.log_step,
math.sqrt(loss / args.log_step)))
loss = 0
# Loss = []
# for step, (features, targets) in enumerate(valid_data_loader):
# features = make_cuda(features)
# targets = make_cuda(targets)
# model.eval()
# preds = model(features)
# valid_loss = CrossLoss(preds, targets)
# Loss.append(valid_loss)
# print("Valid loss: %.3d\n" % (np.mean(Loss)))
return model
def evaluate(args, model, data_loader):
model.eval()
loss = []
for step, (features, targets) in enumerate(data_loader):
features = make_cuda(features)
targets = make_cuda(targets)
pre, _ = model(features)
crs_loss = model.cross_entropy(pre, targets.reshape(-1))
loss.append(crs_loss.item())
torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad_norm)
print("loss=%.4f" % (np.mean(loss)))