import torch
from torch import optim, nn
import torchvision
from torch.utils.data import DataLoader
from MakeDataset import makedataset
from torchvision.models import densenet121
from utils import Flatten
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt

batchsz = 280  # Remove all test data at once
device = torch.device('cuda')
torch.manual_seed(1234)

test_db = makedataset('mydata', 224, mode='test')
test_loader = DataLoader(test_db, batch_size=batchsz)

# Do one-hot coding of labels
depth = 6


def one_hot(label, depth=6):
    out = torch.zeros(label.size(0), depth)
    idx = torch.LongTensor(label).view(-1, 1)
    out.scatter_(dim=1, index=idx, value=1)
    return out


# load model
trained_model = densenet121(pretrained=True)
model = nn.Sequential(
from torch.utils.data import DataLoader
from MakeDataset import makedataset
from torchvision.models import densenet121
from utils import Flatten

# Set hyper-parameters
batchsz = 4
lr = 1e-3
epochs = 10

# Specify CUDA acceleration and set random seeds
device = torch.device('cuda')
torch.manual_seed(1234)

# load train/val/test datasets
train_db = makedataset('mydata', 224, mode='train')
val_db = makedataset('mydata', 224, mode='val')
test_db = makedataset('mydata', 224, mode='test')
train_loader = DataLoader(train_db, batch_size=batchsz, shuffle=True)
val_loader = DataLoader(val_db, batch_size=batchsz)
test_loader = DataLoader(test_db, batch_size=batchsz)

# view numbers of datasets
print('num_train:', len(train_loader.dataset))
print('num_val:', len(val_loader.dataset))
print('num_test:', len(test_loader.dataset))


# Define validation functions
def evalute(model, loader):
    model.eval()