|
import os |
|
import torch |
|
from torchvision import models |
|
import torch.nn as nn |
|
import torch.optim as optim |
|
import time |
|
import copy |
|
import sys |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
import numpy as np |
|
from sklearn.metrics import roc_auc_score |
|
from scripts.model import train_model |
|
import scripts.dataset as DATA |
|
import scripts.config as config |
|
import argparse |
|
from PIL import ImageFile |
|
ImageFile.LOAD_TRUNCATED_IMAGES = True |
|
|
|
|
|
def main(args): |
|
modelname = args.modelname |
|
imagepath = args.imagepath |
|
label_num,subgroup_num = config.THYROID() |
|
Datasets = DATA.Thyroid_Datasets |
|
|
|
if args.architecture =='resnet': |
|
net = models.resnet18(pretrained=True) |
|
features = net.fc.in_features |
|
net.fc = nn.Sequential( |
|
nn.Linear(features, args.Class)) |
|
|
|
|
|
if os.path.exists('./modelsaved/%s' % modelname) == False: |
|
os.makedirs('./modelsaved/%s' % modelname) |
|
if os.path.exists('./result/%s' % modelname) == False: |
|
os.makedirs('./result/%s' % modelname) |
|
|
|
|
|
data_transforms = config.Transforms(modelname) |
|
|
|
print("%s Initializing Datasets and Dataloaders..." % modelname) |
|
|
|
transformed_datasets = {} |
|
transformed_datasets['train'] = Datasets( |
|
path_to_images=imagepath, |
|
fold=args.train_data, |
|
PRED_LABEL=label_num, |
|
transform=data_transforms['train']) |
|
transformed_datasets['valid'] = Datasets( |
|
path_to_images=imagepath, |
|
fold=args.valid_data, |
|
PRED_LABEL=label_num, |
|
transform=data_transforms['valid']) |
|
transformed_datasets['test'] = Datasets( |
|
path_to_images=imagepath, |
|
fold=args.test_data, |
|
PRED_LABEL=label_num, |
|
transform=data_transforms['valid']) |
|
|
|
dataloaders = {} |
|
dataloaders['train'] = torch.utils.data.DataLoader( |
|
transformed_datasets['train'], |
|
batch_size=args.batch_size, |
|
shuffle=True, |
|
num_workers=24) |
|
dataloaders['valid'] = torch.utils.data.DataLoader( |
|
transformed_datasets['valid'], |
|
batch_size=1, |
|
shuffle=False, |
|
num_workers=24) |
|
dataloaders['test'] = torch.utils.data.DataLoader( |
|
transformed_datasets['test'], |
|
batch_size=1, |
|
shuffle=False, |
|
num_workers=24) |
|
|
|
|
|
if args.modelload_path: |
|
net.load_state_dict(torch.load('%s' % args.modelload_path , map_location=lambda storage, loc: storage),strict=False) |
|
|
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
|
|
net = net.to(device) |
|
optimizer = optim.Adam(filter(lambda p: p.requires_grad, net.parameters()), lr=args.learning_rate, betas=(0.9, 0.99),weight_decay=0.03) |
|
|
|
|
|
if args.Class > 2: |
|
criterion = nn.BCELoss() |
|
else: |
|
criterion = nn.CrossEntropyLoss() |
|
|
|
train_model(net,dataloaders, criterion, optimizer, args.num_epochs, modelname, device) |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument("--modelname", type=str, default="Thyroid") |
|
parser.add_argument("--architecture", type=str, choices= ["resnet","densnet","efficientnet"], default="resnet") |
|
parser.add_argument("--modelload_path", type=str, default= None) |
|
parser.add_argument("--imagepath", type=str, default="./dataset/") |
|
parser.add_argument("--train_data", type=str, default='thyroid_train') |
|
parser.add_argument("--valid_data", type=str, default='thyroid_valid') |
|
parser.add_argument("--test_data", type=str, default='thyroid_test') |
|
parser.add_argument("--learning_rate", type=float, default=0.00005) |
|
parser.add_argument("--batch_size", type=int, default=64) |
|
parser.add_argument("--num_epochs", type=int, default=100) |
|
parser.add_argument("--Class", type=int, default=2) |
|
args = parser.parse_args() |
|
main(args) |
|
|
|
|
|
|