| 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) | |