Train
In [ ]:
Copied!
import time
import torch
def loss_f(y_pred, y_true):
return torch.nn.functional.cross_entropy(y_pred, y_true)
import time
import torch
def loss_f(y_pred, y_true):
return torch.nn.functional.cross_entropy(y_pred, y_true)
In [ ]:
Copied!
def train(model, optimizer, train_data, valid_data, device, epochs, torch_resize):
model.to(device)
loss_history = []
acc_history = []
startTime = time.time()
for e in range(epochs):
model.train()
for x, y in train_data:
x = torch_resize(x).to(device)
y = y.to(device)
y_pred = model.forward(x)
loss = loss_f(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_sum, acc = get_acc(model, valid_data, device, torch_resize)
loss_history.append(loss_sum)
acc_history.append(acc)
print(f"Epoch{e+1} loss {loss_sum} valid accuracy {acc}%")
endTime = time.time()
print(f'Train cost {(endTime - startTime)}s')
return loss_history,acc_history
def train(model, optimizer, train_data, valid_data, device, epochs, torch_resize):
model.to(device)
loss_history = []
acc_history = []
startTime = time.time()
for e in range(epochs):
model.train()
for x, y in train_data:
x = torch_resize(x).to(device)
y = y.to(device)
y_pred = model.forward(x)
loss = loss_f(y_pred, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
loss_sum, acc = get_acc(model, valid_data, device, torch_resize)
loss_history.append(loss_sum)
acc_history.append(acc)
print(f"Epoch{e+1} loss {loss_sum} valid accuracy {acc}%")
endTime = time.time()
print(f'Train cost {(endTime - startTime)}s')
return loss_history,acc_history
In [ ]:
Copied!
def get_acc(model, data, device, torch_resize):
model.eval()
loss_sum = 0
num_true, num_total = 0, 0
with torch.no_grad():
for x, y in data:
x = torch_resize(x).to(device)
y = y.to(device)
y_pred = model.forward(x)
loss = loss_f(y_pred, y)
loss_sum += loss.to(device)
num_total += y.size(0)
num_true += (torch.argmax(y_pred, dim=1) == y).sum().to(device)
return loss_sum, num_true / num_total * 100
def get_acc(model, data, device, torch_resize):
model.eval()
loss_sum = 0
num_true, num_total = 0, 0
with torch.no_grad():
for x, y in data:
x = torch_resize(x).to(device)
y = y.to(device)
y_pred = model.forward(x)
loss = loss_f(y_pred, y)
loss_sum += loss.to(device)
num_total += y.size(0)
num_true += (torch.argmax(y_pred, dim=1) == y).sum().to(device)
return loss_sum, num_true / num_total * 100