Repository navigation
Expand file tree
/
Copy pathtrain.py
More file actions
77 lines (57 loc) · 2.54 KB
/
Copy pathtrain.py
File metadata and controls
77 lines (57 loc) · 2.54 KB
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import argparse
import json
import numpy as np
import os
import torch
from datetime import datetime
from pathlib import Path
from sklearn import metrics
from evaluate import run_model
from loader import load_data
from model import MRNet
def train(rundir, diagnosis, epochs, learning_rate, use_gpu):
train_loader, valid_loader, test_loader = load_data(diagnosis, use_gpu)
model = MRNet()
if use_gpu:
model = model.cuda()
optimizer = torch.optim.Adam(model.parameters(), learning_rate, weight_decay=.01)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience=5, factor=.3, threshold=1e-4)
best_val_loss = float('inf')
start_time = datetime.now()
for epoch in range(epochs):
change = datetime.now() - start_time
print('starting epoch {}. time passed: {}'.format(epoch+1, str(change)))
train_loss, train_auc, _, _ = run_model(model, train_loader, train=True, optimizer=optimizer)
print(f'train loss: {train_loss:0.4f}')
print(f'train AUC: {train_auc:0.4f}')
val_loss, val_auc, _, _ = run_model(model, valid_loader)
print(f'valid loss: {val_loss:0.4f}')
print(f'valid AUC: {val_auc:0.4f}')
scheduler.step(val_loss)
if val_loss < best_val_loss:
best_val_loss = val_loss
file_name = f'val{val_loss:0.4f}_train{train_loss:0.4f}_epoch{epoch+1}'
save_path = Path(rundir) / file_name
torch.save(model.state_dict(), save_path)
def get_parser():
parser = argparse.ArgumentParser()
parser.add_argument('--rundir', type=str, required=True)
parser.add_argument('--diagnosis', type=int, required=True)
parser.add_argument('--seed', default=42, type=int)
parser.add_argument('--gpu', action='store_true')
parser.add_argument('--learning_rate', default=1e-05, type=float)
parser.add_argument('--weight_decay', default=0.01, type=float)
parser.add_argument('--epochs', default=50, type=int)
parser.add_argument('--max_patience', default=5, type=int)
parser.add_argument('--factor', default=0.3, type=float)
return parser
if __name__ == '__main__':
args = get_parser().parse_args()
np.random.seed(args.seed)
torch.manual_seed(args.seed)
if args.gpu:
torch.cuda.manual_seed_all(args.seed)
os.makedirs(args.rundir, exist_ok=True)
with open(Path(args.rundir) / 'args.json', 'w') as out:
json.dump(vars(args), out, indent=4)
train(args.rundir, args.diagnosis, args.epochs, args.learning_rate, args.gpu)