Example #1
0
 def __init__(self, params):
     self.learning_rate = params.learning_rate
     self.batch_size = params.batch_size
     self.feature_size = params.feature_size
     self.num_epochs = params.num_epochs
     self.loss_type = params.loss_type
     self.sess = tf.Session()
     self.network = AutoencoderNetwork()
     self.losses = LossFunctions()
Example #2
0
    def __init__(self,
                 Y,
                 nnodes,
                 actFunction='Sigmoid',
                 lossFcn='CrossEntropy'):
        super(OutputLayer, self).__init__(nnodes, actFunction)

        self.Y = Y
        self.lossFcn = LossFunctions.Factory(lossFcn)
        self.L = None
Example #3
0
 def processPatchIdxOverlap(self, currVectorField, indexArray, lastVectorField, idxs, samplingRateIdx, spacing, sampler):
   for patchIdx, idx in enumerate(idxs):
     print('register patch %i out of %i patches.' % (patchIdx, len(idxs)))
     optimizer = optim.Adam(self.net.parameters(),amsgrad=True)
     self.netOptim.setOptimizer(optimizer)
     
     imgDataToWork, labelDataToWork = sampler.getSubSample(idx, self.userOpts.normImgPatches)
     imgDataToWork = imgDataToWork.to(self.userOpts.device)
     if labelDataToWork is not None:
       labelDataToWork = labelDataToWork.to(self.userOpts.device)
     
     currDefFieldIdx, offset = self.getSubCurrDefFieldIdx(currVectorField, idx)
     currVectorFieldGPU = currVectorField[:, :, currDefFieldIdx[0]:currDefFieldIdx[0]+currDefFieldIdx[3], currDefFieldIdx[1]:currDefFieldIdx[1]+currDefFieldIdx[4], currDefFieldIdx[2]:currDefFieldIdx[2]+currDefFieldIdx[5]].to(device=self.userOpts.device)
     idxGPU = indexArray[currDefFieldIdx[0]:currDefFieldIdx[0]+currDefFieldIdx[3], currDefFieldIdx[1]:currDefFieldIdx[1]+currDefFieldIdx[4], currDefFieldIdx[2]:currDefFieldIdx[2]+currDefFieldIdx[5]].to(device=self.userOpts.device)
     idxGPU[idxGPU < 1] = 1
     currVectorFieldGPU = currVectorFieldGPU / idxGPU[None,None,...]
     lastVectorFieldGPU = lastVectorField[:, :, currDefFieldIdx[0]:currDefFieldIdx[0]+currDefFieldIdx[3], currDefFieldIdx[1]:currDefFieldIdx[1]+currDefFieldIdx[4], currDefFieldIdx[2]:currDefFieldIdx[2]+currDefFieldIdx[5]].to(device=self.userOpts.device)
     
     patchIteration=0
     lossCounter = 0
     runningLoss = torch.ones(10, device=self.userOpts.device)
     runningCC = torch.ones(10, device=self.userOpts.device)
     runningDSC = torch.ones(10, device=self.userOpts.device)
     runningSmmoth = torch.ones(10, device=self.userOpts.device)
     runningCycle = torch.ones(10, device=self.userOpts.device)
     
     lossCalculator = lf.LossFunctions(imgDataToWork, spacing)
     
     while True:
       [loss, crossCorr, diceLoss, smoothnessDF, cycleLoss] = self.netOptim.optimizeNet(imgDataToWork, lossCalculator, labelDataToWork, lastVectorFieldGPU, currVectorFieldGPU, offset, samplingRateIdx, False)
       if False:
         self.printParameterInfo()
       detachLoss = loss.detach()                
       runningLoss[lossCounter] = detachLoss
       runningCC[lossCounter] = crossCorr.detach()
       runningDSC[lossCounter] = diceLoss.detach()
       runningSmmoth[lossCounter] = smoothnessDF.detach()
       runningCycle[lossCounter] = cycleLoss.detach()
       if lossCounter == 9:
         meanLoss = runningLoss.mean()
         self.logFile.write(str(float(meanLoss)) + ';' + str(patchIdx) + '\n')
         self.logFile.flush()
         lossCounter = 0
         if (self.iterationValidation(detachLoss, meanLoss, patchIteration, self.userOpts.numberOfEpochs[samplingRateIdx], 0, self.userOpts.lossTollerance)):
           break
       else:
         lossCounter+=1
       patchIteration+=1
     currVectorField[:, :, idx[0]+self.patchShift:idx[0]+imgDataToWork.shape[2]-self.patchShift, 
           idx[1]+self.patchShift:idx[1]+imgDataToWork.shape[3]-self.patchShift, 
           idx[2]+self.patchShift:idx[2]+imgDataToWork.shape[4]-self.patchShift] += currVectorFieldGPU[:,:,offset[0]+self.patchShift:offset[0]+imgDataToWork.shape[2]-self.patchShift,offset[1]+self.patchShift:offset[1]+imgDataToWork.shape[3]-self.patchShift,offset[2]+self.patchShift:offset[2]+imgDataToWork.shape[4]-self.patchShift].to("cpu")
     indexArray[idx[0]+self.patchShift:idx[0]+imgDataToWork.shape[2]-self.patchShift, 
            idx[1]+self.patchShift:idx[1]+imgDataToWork.shape[3]-self.patchShift, 
            idx[2]+self.patchShift:idx[2]+imgDataToWork.shape[4]-self.patchShift] += 1           
     
Example #4
0
    def testAlmostEqual(self):
        func = SingleVarFunctions.Func1  #Parametric Model

        #Input Data
        xData = [-2, -1, 0, 1, 2]
        yData = [func(x, [2, 3]) for x in xData]

        #Initialize model parameters
        params = [2, 3]

        self.assertAlmostEqual(LossFunctions.SSE(params, func, xData, yData),
                               0.0)
Example #5
0
def main():

    np.random.seed(0)
    height = 25
    width = 25

    #Create the D matrix
    D_w = toeplitz(np.hstack([1, np.zeros(width - 2)]),
                   np.hstack([1, -1, np.zeros(width - 2)]))
    D_h = toeplitz(np.hstack([1, np.zeros(height - 2)]),
                   np.hstack([1, -1, np.zeros(height - 2)]))
    D2 = np.kron(D_w, np.eye(height))
    D3 = np.kron(np.eye(width), D_h)
    D = np.r_[D2, D3]

    #copy kernel from matlab to compare directly
    kernel = np.array([[0.0318, 0.0375, 0.0397, 0.0375, 0.0318],
                       [0.0375, 0.0443, 0.0469, 0.0443, 0.0375],
                       [0.0397, 0.0469, 0.0495, 0.0469, 0.0397],
                       [0.0375, 0.0443, 0.0469, 0.0443, 0.0375],
                       [0.0318, 0.0375, 0.0397, 0.0375, 0.0318]])

    weights = np.zeros([height, width])
    weights[4, 4] = 1
    weights[height - 5, width - 5] = 1
    weights = convolve2d(weights, kernel, mode='same')
    weights = convolve2d(weights, kernel, mode='same')
    weights[
        weights != 0] = weights[weights != 0] / np.mean(np.mean(weights)) - 1

    (Xtrain, Ytrain) = genCorr(np.reshape(weights, height * width), 250)
    (Xval, Yval) = genCorr(np.reshape(weights, height * width), 100)
    (Xtest, Ytest) = genCorr(np.reshape(weights, height * width), 250)
    CS = [1, 10, 100, 1000]
    KChoices = [5, 25, 45, 65, 85]
    Lamb2 = [0, 0.1, 0.5, 0.8, 1]

    BestAccuracy = 0
    w0 = np.zeros(Xtrain.shape[1])
    #Search for best validation parameters
    for C in CS:
        for k in KChoices:
            for lam2 in Lamb2:
                KTVS = LF.KtvSVM(D,
                                 huber=0.00001,
                                 lambda1=1.0 / C,
                                 lambda2=lam2,
                                 k=k)
                (w, primal) = MiniBatchStochSubGradientDescent(
                    Xtrain,
                    Ytrain,
                    KTVS,
                    w0,
                    alpha0=np.power(10.0, 3),
                    N=25,
                    eta=2,
                    tol=np.power(10.0, -6),
                    compareEach=100,
                    epochs=10000)
                currAccuracy = float(
                    np.sum(np.sign(np.dot(Xval, w)) == Yval)) / len(Yval)
                if (currAccuracy > BestAccuracy):
                    wbest = w
                    BestAccuracy = currAccuracy
                    print 'Found better validation set solution of ', str(
                        BestAccuracy *
                        100), '% at k:', str(k), ' and lambda: ', str(
                            1.0 / C), ' and lambda2: ', str(lam2)

    TestAccuracy = float(
        np.sum(np.sign(np.dot(Xtest, wbest)) == Ytest)) / len(Ytest)
    print 'Best accuracy: ', str(100 * TestAccuracy), '%'
def main():
    """
    Goal: process images by file lists, evaluating the datasize with different model size
    Version: 5.0
    """
    print('PyTorch Version: ', torch.__version__)
    print('Torchvision Version: ', torchvision.__version__)
    now = datetime.datetime.now()
    random.seed(1)
    torch.manual_seed(1)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

    args = arg_process()
    runFileName = sys.argv[0].split('.')[0]
    # need to modify according to the enviroment
    version = args.dataversion
    gpuid = args.gpuid
    model_name = args.modelname
    num_epochs = args.epochs
    lr = args.learningrate
    batch_size = args.batchsize
    model_version = args.modelversion
    feature_map = args.featuremap
    loss_function = args.lossfunction
    pool_size = args.poolsize
    classes = 3

    # logPath = os.path.join('result', model_name+'_log.txt')
    logPath = os.path.join('result', runFileName + '_log_' + 'v{}'.format(args.dataversion) + '.txt')
    # logPath = os.path.join('result', runFileName+'_log_'+'v{}'.format(version)+'.txt')
    # resultPath = os.path.join('result', 'result_'+'v{}'.format(version)+'.pt')
    data_transforms = transforms.Compose([
            transforms.ToTensor()
        ])
    # move to GPU
    device = torch.device(gpuid if torch.cuda.is_available() else 'cpu')
    # obtian the subject information in LOSO
    verFolder = 'v_{}'.format(version)
    filePath = os.path.join('data', 'MEGC2019', verFolder, 'video442subName.txt')
    subjects = []
    with open(filePath, 'r') as f:
        for textline in f:
            texts = textline.strip('\n')
            subjects.append(texts)
    # predicted and label vectors
    preds_db = {}
    preds_db['casme2'] = torch.tensor([])
    preds_db['smic'] = torch.tensor([])
    preds_db['samm'] = torch.tensor([])
    preds_db['all'] = torch.tensor([])
    labels_db = {}
    labels_db['casme2'] = torch.tensor([])
    labels_db['smic'] = torch.tensor([])
    labels_db['samm'] = torch.tensor([])
    labels_db['all'] = torch.tensor([])
    # open the log file and begin to record
    log_f = open(logPath,'a')
    log_f.write('{}\n'.format(now))
    log_f.write('-' * 80 + '\n')
    log_f.write('-' * 80 + '\n')
    log_f.write('Results:\n')
    time_s = time.time()
    for subject in subjects:
        print('Subject Name: {}'.format(subject))
        print('---------------------------')
        # random.seed(1)
        # setup a dataloader for training
        imgDir = os.path.join('data', 'MEGC2019', verFolder, '{}_train.txt'.format(subject))
        image_db_train = MEGC2019(imgList=imgDir,transform=data_transforms)
        dataloader_train = torch.utils.data.DataLoader(image_db_train, batch_size=batch_size, shuffle=True, num_workers=1)
        # Initialize the model
        print('\tCreating deep model....')
        if model_name == 'rcn_a':
            model_ft = MeNets.RCN_A(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size, model_version=model_version)
        elif model_name == 'rcn_s':
            model_ft = MeNets.RCN_S(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size)
        elif model_name == 'rcn_w':
            model_ft = MeNets.RCN_W(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size)
        elif model_name == 'rcn_p':
            model_ft = MeNets.RCN_P(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size)
        elif model_name == 'rcn_c':
            model_ft = MeNets.RCN_C(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size)
        elif model_name == 'rcn_f':
            model_ft = MeNets.RCN_F(num_input=3, featuremaps=feature_map, num_classes=classes, num_layers=1, pool_size=pool_size)
        params_to_update = model_ft.parameters()
        optimizer_ft = optim.SGD(params_to_update, lr=lr, momentum=0.9)
        # optimizer_ft = optim.Adam(params_to_update, lr=lr)
        if loss_function == 'crossentropy':
            criterion = nn.CrossEntropyLoss()
        elif loss_function == 'focal':
            criterion = LossFunctions.FocalLoss(class_num=classes,device=device)
        elif loss_function == 'balanced':
            criterion = LossFunctions.BalancedLoss(class_num=classes, device=device)
        elif loss_function == 'cosine':
            criterion = LossFunctions.CosineLoss()
        model_ft = model_ft.to(device) # from cpu to gpu
        # Train and evaluate
        model_ft = train_model(model_ft, dataloader_train, criterion, optimizer_ft, device, num_epochs=num_epochs)
        # torch.save(model_ft, os.path.join('data', 'model_s{}.pth').format(subject))

        # Test model
        imgDir = os.path.join('data', 'MEGC2019', verFolder, '{}_test.txt'.format(subject))
        image_db_test = MEGC2019(imgList=imgDir,transform=data_transforms)
        dataloaders_test = torch.utils.data.DataLoader(image_db_test, batch_size=batch_size, shuffle=False,
                                                       num_workers=1)

        preds, labels = test_model(model_ft, dataloaders_test, device)
        acc = torch.sum(preds == labels).double()/len(preds)
        print('\tSubject {} has the accuracy:{:.4f}\n'.format(subject,acc))
        print('---------------------------\n')
        log_f.write('\tSubject {} has the accuracy:{:.4f}\n'.format(subject,acc))

        # saving the subject results
        preds_db['all'] = torch.cat((preds_db['all'], preds), 0)
        labels_db['all'] = torch.cat((labels_db['all'], labels), 0)
        if subject.find('sub')!= -1:
            preds_db['casme2'] = torch.cat((preds_db['casme2'], preds), 0)
            labels_db['casme2'] = torch.cat((labels_db['casme2'], labels), 0)
        else:
            if subject.find('s')!= -1:
                preds_db['smic'] = torch.cat((preds_db['smic'], preds), 0)
                labels_db['smic'] = torch.cat((labels_db['smic'], labels), 0)
            else:
                preds_db['samm'] = torch.cat((preds_db['samm'], preds), 0)
                labels_db['samm'] = torch.cat((labels_db['samm'], labels), 0)
    time_e = time.time()
    hours, rem = divmod(time_e-time_s,3600)
    miniutes, seconds = divmod(rem,60)
    # evaluate all data
    eval_acc = metrics.accuracy()
    eval_f1 = metrics.f1score()
    acc_w, acc_uw = eval_acc.eval(preds_db['all'], labels_db['all'])
    f1_w, f1_uw = eval_f1.eval(preds_db['all'], labels_db['all'])
    print('\nThe dataset has the UAR and UF1:{:.4f} and {:.4f}'.format(acc_uw, f1_uw))
    log_f.write('\nOverall:\n\tthe UAR and UF1 of all data are {:.4f} and {:.4f}\n'.format(acc_uw, f1_uw))
    # casme2
    if preds_db['casme2'].nelement() != 0:
        acc_w, acc_uw = eval_acc.eval(preds_db['casme2'], labels_db['casme2'])
        f1_w, f1_uw = eval_f1.eval(preds_db['casme2'], labels_db['casme2'])
        print('\nThe casme2 dataset has the UAR and UF1:{:.4f} and {:.4f}'.format(acc_uw, f1_uw))
        log_f.write('\tthe UAR and UF1 of casme2 are {:.4f} and {:.4f}\n'.format(acc_uw, f1_uw))
    # smic
    if preds_db['smic'].nelement() != 0:
        acc_w, acc_uw = eval_acc.eval(preds_db['smic'], labels_db['smic'])
        f1_w, f1_uw = eval_f1.eval(preds_db['smic'], labels_db['smic'])
        print('\nThe smic dataset has the UAR and UF1:{:.4f} and {:.4f}'.format(acc_uw, f1_uw))
        log_f.write('\tthe UAR and UF1 of smic are {:.4f} and {:.4f}\n'.format(acc_uw, f1_uw))
    # samm
    if preds_db['samm'].nelement() != 0:
        acc_w, acc_uw = eval_acc.eval(preds_db['samm'], labels_db['samm'])
        f1_w, f1_uw = eval_f1.eval(preds_db['samm'], labels_db['samm'])
        print('\nThe samm dataset has the UAR and UF1:{:.4f} and {:.4f}'.format(acc_uw, f1_uw))
        log_f.write('\tthe UAR and UF1 of samm are {:.4f} and {:.4f}\n'.format(acc_uw, f1_uw))
    # writing parameters into log file
    print('\tNetname:{}, Dataversion:{}\n\tLearning rate:{}, Epochs:{}, Batchsize:{}.'.format(model_name,version,lr,num_epochs,batch_size))
    print('\tElapsed time: {:0>2}:{:0>2}:{:05.2f}'.format(int(hours),int(miniutes),seconds))
    log_f.write('\nOverall:\n\tthe weighted and unweighted accuracy of all data are {:.4f} and {:.4f}\n'.format(acc_w,acc_uw))
    log_f.write('\nSetting:\tNetname:{}, Dataversion:{}\n\tLearning rate:{}, Epochs:{}, Batchsize:{}.\n'.format(model_name,
                                                                                                        version,
                                                                                                        lr,
                                                                                                        num_epochs,
                                                                                                        batch_size))
    # # save subject's results
    # torch.save({
    #     'predicts':preds_db,
    #     'labels':labels_db,
    #     'weight_acc':acc_w,
    #     'unweight_acc':acc_uw
    # },resultPath)
    log_f.write('-' * 80 + '\n')
    log_f.write('-' * 80 + '\n')
    log_f.write('\n')
    log_f.close()
    def run(self,
            net,
            samplingRate,
            samplingRateIdx,
            dataloader,
            validationDataLoader,
            resultModels=[]):
        self.net = net
        self.net.train()
        optimizer = optim.Adam(self.net.parameters(), amsgrad=True)
        netOptim = NetOptimizer.NetOptimizer(self.net, None, optimizer,
                                             self.userOpts)

        receptiveFieldOffset = Utils.getReceptiveFieldOffset(
            self.userOpts.netDepth)
        padVals = (receptiveFieldOffset, receptiveFieldOffset,
                   receptiveFieldOffset, receptiveFieldOffset,
                   receptiveFieldOffset, receptiveFieldOffset)
        samplerShift = (0, 0, 0)

        for epoch in range(self.userOpts.numberOfEpochs[samplingRateIdx]):
            for i, data in enumerate(dataloader, 0):
                netOptim.initSmoother(data['image'].shape[1] * 3)

                lastField = None
                if len(resultModels) > 0:
                    currentState = copy.deepcopy(self.net.state_dict())
                    with torch.no_grad():
                        #             self.net.eval()
                        useContext = self.userOpts.useContext
                        self.userOpts.useContext = False
                        for previousSampleIdxs in range(samplingRateIdx):
                            modelToApply = resultModels[previousSampleIdxs]
                            self.net.load_state_dict(
                                modelToApply['model_state'])
                            defField = self.getDeformationField(
                                data, modelToApply['samplingRate'],
                                self.userOpts.patchSize[previousSampleIdxs],
                                self.userOpts.
                                useMedianForSampling[previousSampleIdxs],
                                samplerShift)
                            upSampleRate = 1.0 / modelToApply['samplingRate']
                            defField = defField * upSampleRate
                            defField = sampleImg(defField, upSampleRate)
                            if lastField is None:
                                lastField = defField
                            else:
                                lastField = Utils.combineDeformationFields(
                                    defField, lastField)
                        self.userOpts.useContext = useContext
                    self.net.load_state_dict(currentState)
                    self.net.train()

                sampledImgData, sampledMaskData, sampledLabelData, _ = Utils.sampleImgData(
                    data, samplingRate)
                if lastField is None:
                    currDefField = torch.zeros(
                        (data['image'].shape[0], data['image'].shape[1] * 3,
                         data['image'].shape[2], data['image'].shape[3],
                         data['image'].shape[4]),
                        device="cpu",
                        requires_grad=False)
                else:
                    currDefField = lastField

                currDefField = currDefField * samplingRate
                currDefField = Utils.sampleImg(currDefField, samplingRate)

                sampler = Sampler(sampledMaskData, sampledImgData,
                                  sampledLabelData,
                                  self.userOpts.patchSize[samplingRateIdx])

                if self.userOpts.randomSampling[samplingRateIdx]:
                    numberofSamplesPerRun = int(
                        sampledImgData.numel() /
                        (self.userOpts.patchSize[samplingRateIdx] *
                         self.userOpts.patchSize[samplingRateIdx] *
                         self.userOpts.patchSize[samplingRateIdx]))
                    if numberofSamplesPerRun < 1:
                        numberofSamplesPerRun = 1
                    idxs = sampler.getIndicesForRandomization()
                    idxs = sampler.getRandomSubSamplesIdxs(
                        numberofSamplesPerRun, idxs)
                else:
                    idxs = sampler.getIndicesForOneShotSampling(
                        samplerShift,
                        self.userOpts.useMedianForSampling[samplingRateIdx])

                lastDeffield = currDefField.clone()
                for _, idx in enumerate(idxs):
                    imgDataToWork = sampler.getSubSampleImg(
                        idx, self.userOpts.normImgPatches)
                    imgDataToWork = imgDataToWork.to(self.userOpts.device)
                    lossCalculator = lf.LossFunctions(
                        imgDataToWork, dataloader.dataset.getSpacingXZFlip(i))
                    currDefFieldIdx, offset = self.getSubCurrDefFieldIdx(
                        currDefField, idx)
                    currDefFieldGPU = currDefField[:, :, currDefFieldIdx[0]:
                                                   currDefFieldIdx[0] +
                                                   currDefFieldIdx[3],
                                                   currDefFieldIdx[1]:
                                                   currDefFieldIdx[1] +
                                                   currDefFieldIdx[4],
                                                   currDefFieldIdx[2]:
                                                   currDefFieldIdx[2] +
                                                   currDefFieldIdx[5]].to(
                                                       device=self.userOpts.
                                                       device)
                    lastDeffieldGPU = lastDeffield[:, :, currDefFieldIdx[0]:
                                                   currDefFieldIdx[0] +
                                                   currDefFieldIdx[3],
                                                   currDefFieldIdx[1]:
                                                   currDefFieldIdx[1] +
                                                   currDefFieldIdx[4],
                                                   currDefFieldIdx[2]:
                                                   currDefFieldIdx[2] +
                                                   currDefFieldIdx[5]].to(
                                                       device=self.userOpts.
                                                       device)

                    [loss, crossCorr, diceLoss, smoothnessDF, cycleLoss
                     ] = netOptim.optimizeNet(imgDataToWork, lossCalculator,
                                              None, lastDeffieldGPU,
                                              currDefFieldGPU, offset,
                                              samplingRateIdx, False)
                    #TODO: log also other loss values
                    detachLoss = loss.detach()
                    self.logFile.write(
                        str(epoch) + ';' + str(float(detachLoss)) + '\n')
                    self.logFile.flush()

                    currDefField[:, :, idx[0]:idx[0] + imgDataToWork.shape[2],
                                 idx[1]:idx[1] + imgDataToWork.shape[3],
                                 idx[2]:idx[2] + imgDataToWork.
                                 shape[4]] = currDefFieldGPU[:, :, offset[
                                     0]:offset[0] + imgDataToWork.shape[2],
                                                             offset[1]:
                                                             offset[1] +
                                                             imgDataToWork.
                                                             shape[3],
                                                             offset[2]:
                                                             offset[2] +
                                                             imgDataToWork.
                                                             shape[4]].to(
                                                                 "cpu")
                del imgDataToWork, sampledImgData, sampledMaskData, sampledLabelData

            ##
            ## Validation
            ##
            if epoch % self.userOpts.validationIntervall == 0:
                torch.save(
                    {
                        'epoch': epoch,
                        'model_state_dict': self.net.state_dict(),
                        'optimizer_state_dict': optimizer.state_dict(),
                        'loss': loss,
                        'samplingRate': samplingRate
                    }, self.userOpts.outputPath + os.path.sep +
                    'registrationModel' + str(samplingRateIdx) + str(epoch) +
                    '.pt')
                validationLosses, landmarkDistances = self.validateModel(
                    validationDataLoader, netOptim, samplingRate,
                    samplingRateIdx, padVals, samplerShift, resultModels)
                if len(landmarkDistances) > 0:
                    self.validationLogFile.write(
                        str(epoch) + ';' + str(np.mean(validationLosses)) +
                        ';' + str(np.std(validationLosses)) + ';' +
                        str(np.mean(landmarkDistances)) + ';' + '\n')
                else:
                    self.validationLogFile.write(
                        str(epoch) + ';' + str(np.mean(validationLosses)) +
                        ';' + str(np.std(validationLosses)) + ';' + '0.0' +
                        '\n')
                self.validationLogFile.flush()
                del validationLosses
                self.net.train()
        return self.net
    def optimizeNet(self,
                    imgDataToWork,
                    labelToWork,
                    lastDefField=None,
                    currDefFields=None,
                    idx=None,
                    itIdx=0,
                    printLoss=False):
        # zero the parameter gradients
        self.optimizer.zero_grad()

        defFields = self.net(imgDataToWork)

        addedField = lastDefField[:, :, idx[0]:idx[0] + defFields.shape[2],
                                  idx[1]:idx[1] + defFields.shape[3],
                                  idx[2]:idx[2] +
                                  defFields.shape[4]] + defFields

        currDefFields[:, :, idx[0]:idx[0] + defFields.shape[2],
                      idx[1]:idx[1] + defFields.shape[3], idx[2]:idx[2] +
                      defFields.shape[4]] = addedField.detach()

        cropStart0 = int((imgDataToWork.shape[2] - defFields.shape[2]) / 2)
        cropStart1 = int((imgDataToWork.shape[3] - defFields.shape[3]) / 2)
        cropStart2 = int((imgDataToWork.shape[4] - defFields.shape[4]) / 2)
        imgDataToWork = imgDataToWork[:, :, cropStart0:cropStart0 +
                                      defFields.shape[2],
                                      cropStart1:cropStart1 +
                                      defFields.shape[3],
                                      cropStart2:cropStart2 +
                                      defFields.shape[4]]

        lossCalculator = lf.LossFunctions(imgDataToWork, addedField,
                                          currDefFields, self.spacing)

        boundaryLoss = 0.0
        smoothnessLoss = 0.0

        smoothNessWeight = self.userOpts.smoothW[itIdx]
        crossCorrWeight = self.userOpts.ccW
        cyclicWeight = self.userOpts.cycleW
        crossCorrWeight, smoothNessWeight, cyclicWeight = self.normalizeWeights(
            crossCorrWeight, smoothNessWeight, cyclicWeight)

        if self.userOpts.boundarySmoothnessW[itIdx] > 0.0:
            boundaryLoss = lossCalculator.smoothBoundary(
                idx, self.userOpts.device)

        if imgDataToWork.shape[1] > 2:
            smoothnessLoss = lossCalculator.smoothnessVecFieldT(
                self.userOpts.device)
        else:
            smoothnessLoss = lossCalculator.smoothnessVecField(
                self.userOpts.device)

        smoothnessDF = smoothnessLoss + boundaryLoss * self.userOpts.boundarySmoothnessW[
            itIdx]

        imgDataDef = Utils.getImgDataDef(
            imgDataToWork.shape, self.userOpts.device
        )  #torch.empty(imgDataToWork.shape, device=self.userOpts.device, requires_grad=False)#
        for chanIdx in range(-1, imgDataToWork.shape[1] - 1):
            imgToDef = imgDataToWork[:, None, chanIdx, ]
            chanRange = range(chanIdx * 3, chanIdx * 3 + 3)
            deformedTmp = Utils.deformImage(imgToDef, addedField[:,
                                                                 chanRange, ],
                                            self.userOpts.device, False)
            imgDataDef[:, chanIdx + 1, ] = deformedTmp[:, 0, ]

        cycleImgData = Utils.getCycleImgData(
            defFields.shape, self.userOpts.device
        )  #torch.empty(defFields.shape, device=self.userOpts.device)
        zeroIndices = Utils.getZeroIdxField(defFields.shape,
                                            self.userOpts.device)
        outOfBoundsTensor = torch.zeros(zeroIndices[0].shape,
                                        dtype=torch.uint8,
                                        device=self.userOpts.device)
        if self.userOpts.cycleW > 0.0:
            for chanIdx in range(imgDataToWork.shape[1] - 1, -1, -1):
                chanRange = range(chanIdx * 3, chanIdx * 3 + 3)
                self.cycleLossCalculationMethod(zeroIndices, cycleImgData,
                                                addedField, chanRange, None,
                                                idx, outOfBoundsTensor)

        crossCorr = lossCalculator.normCrossCorr(imgDataDef,
                                                 self.userOpts.device)
        cycleLoss = lossCalculator.cycleLoss(cycleImgData, outOfBoundsTensor,
                                             self.userOpts.device)

        #     loss = crossCorrWeight * crossCorr + self.userOpts.cycleW * cycleLoss
        loss = crossCorrWeight * crossCorr + smoothNessWeight * smoothnessDF + self.userOpts.cycleW * cycleLoss
        if printLoss:
            print('%.5f; %.5f; %5f; %5f; %.5f' %
                  (loss, crossCorr, smoothnessLoss, boundaryLoss, cycleLoss))


#     print('%.5f; %5f; %5f; %.5f' % (crossCorr, smoothnessLoss, boundaryLoss, cycleLoss))
#     print('cc: %.5f smmothness: %.5f cycleLoss: %.5f' % (crossCorr, smoothnessDF, cycleLoss))
#     print('weighted cc: %.5f smmothness: %.5f cycleLoss: %.5f' % (crossCorrWeight * crossCorr, smoothNessWeight * smoothnessDF, self.userOpts.cycleW * cycleLoss))
        torch.cuda.empty_cache()
        #     print(torch.cuda.memory_allocated() / 1048576.0)

        loss.backward()
        self.optimizer.step()
        return loss
Example #9
0
nTLS = 7.0
freq = 1e3

###################################
#  Staging for Loss Calculations  #
###################################
omega = 2 * np.pi * freq
density = nTLS / vol
tMatrix = np.linspace(minT, maxT, num=nT)

if len(sys.argv) > 1:
    suff = "_" + sys.argv[1]
else:
    suff = ""

tlsdata = LF.ImportData("Data/tls.tot" + suff)
tlsdata, nPts = LF.CleanData(tlsdata,
                             constG=constG,
                             constY=constY,
                             constT=constT)

original = LF.calculateLossFunction(tlsdata,
                                    density,
                                    omega,
                                    tMatrix,
                                    BoltzmannCorrection=BoltzmannCorrection)

shuffleIndices = [0, 3, 4, 5, 6, 7, 10]
tlskde = BS.tlsKDE()
tlskde.fit(tlsdata, shuffleIndices, bandwidth=0.186379686016)
Example #10
0
class Autoencoder:
    def __init__(self, params):
        self.learning_rate = params.learning_rate
        self.batch_size = params.batch_size
        self.feature_size = params.feature_size
        self.num_epochs = params.num_epochs
        self.loss_type = params.loss_type
        self.sess = tf.Session()
        self.network = AutoencoderNetwork()
        self.losses = LossFunctions()

    def create_dataset(self, is_training, data, batch_size):
        """Create dataset given input data

      Args:
          is_training: (bool) whether to use the train or test pipeline.
                       At training, we shuffle the data and have multiple epochs
          data: (array) corresponding array containing the input data
          batch_size: (int) size of each batch to consider from the data
 
      Returns:
          output: (dict) contains what will be the input of the tensorflow graph
      """
        num_samples = data.shape[0]

        # create dataset object
        dataset = tf.data.Dataset.from_tensor_slices(data)

        if is_training:
            dataset = dataset.shuffle(num_samples).repeat()

        dataset = dataset.batch(batch_size)
        dataset = dataset.prefetch(1)

        # create reinitializable iterator from dataset
        iterator = dataset.make_initializable_iterator()
        data = iterator.get_next()
        iterator_init = iterator.initializer
        return {'data': data, 'iterator_init': iterator_init}

    def create_model(self, is_training, inputs, output_size):
        """Model function defining the graph operations.

      Args:
          is_training: (bool) whether we are training or not
          inputs: (dict) contains the inputs of the graph (features, labels...)
                  this can be `tf.placeholder` or outputs of `tf.data`
          output_size: (int) size of the output layer

      Returns:
          model_spec: (dict) contains the graph operations or nodes needed for training / evaluation
      """
        data = inputs['data']

        with tf.variable_scope('model', reuse=not is_training):
            features = self.network.encoder(data, self.feature_size,
                                            is_training)
            output = self.network.decoder(features, output_size, is_training)

        if self.loss_type == 'bce':
            loss = self.losses.binary_cross_entropy(data, output)
        else:
            loss = self.losses.mean_square_error(data, output)

        if is_training:
            optimizer = tf.train.AdamOptimizer(self.learning_rate)
            train_op = optimizer.minimize(loss)

        model_spec = inputs
        model_spec['loss'] = loss
        model_spec['variable_init_op'] = tf.global_variables_initializer()
        model_spec['features'] = features
        model_spec['output'] = output

        if is_training:
            model_spec['train_op'] = train_op

        return model_spec

    def evaluate_dataset(self, is_training, num_batches, model_spec):
        """Evaluate the model

      Args:
          is_training: (bool) whether we are training or not
          num_batches: (integer) number of batches to train/test
          model_spec: (dict) contains the graph operations or nodes needed for evaluation

      Returns:
          avg_loss: (float) average loss for the given number of batches (training phase)
      """
        avg_loss = 0.0
        self.sess.run(model_spec['iterator_init'])
        if is_training:
            for j in range(num_batches):
                _, loss = self.sess.run(
                    [model_spec['train_op'], model_spec['loss']])
                avg_loss = avg_loss + loss
        else:
            for j in range(num_batches):
                loss = self.sess.run(model_spec['loss'])
                avg_loss = avg_loss + loss

        avg_loss /= num_batches
        return avg_loss

    def train(self, train_data, val_data):
        """Train the model

      Args:
          train_data: (array) corresponding array containing the training data
          val_data: (array) corresponding array containing the validation data

      Returns:
          output: (dict) contains the history of train/val loss
      """
        train_history_loss = []
        val_history_loss = []

        # create training and validation dataset
        train_dataset = self.create_dataset(True, train_data, self.batch_size)
        val_dataset = self.create_dataset(False, val_data, self.batch_size)

        # create train and validation models
        output_size = train_data.shape[1]
        train_model = self.create_model(True, train_dataset, output_size)
        val_model = self.create_model(False, val_dataset, output_size)

        # set number of batches
        TRAIN_BATCHES = train_data.shape[0] // self.batch_size
        VALIDATION_BATCHES = val_data.shape[0] // self.batch_size

        # initialize global variables
        self.sess.run(train_model['variable_init_op'])

        # training and validation phases
        print('Training phase...')
        for i in range(self.num_epochs):
            train_loss = self.evaluate_dataset(True, TRAIN_BATCHES,
                                               train_model)
            val_loss = self.evaluate_dataset(False, VALIDATION_BATCHES,
                                             val_model)

            print("(Epoch %d / %d) Training Loss: %.5lf; Validation Loss: %.5lf" % \
                  (i + 1, self.num_epochs, train_loss, val_loss))

            train_history_loss.append(train_loss)
            val_history_loss.append(val_loss)

        return {
            'train_history_loss': train_history_loss,
            'val_history_loss': val_history_loss
        }

    def test(self, test_data):
        """Test the model

      Args:
          test_data: (array) corresponding array containing the testing data

      """
        # create dataset
        test_dataset = self.create_dataset(False, test_data, self.batch_size)

        # reuse model used in training phase
        output_size = test_data.shape[1]
        test_model = self.create_model(False, test_dataset, output_size)

        # evaluate model
        TEST_BATCHES = test_data.shape[0] // self.batch_size
        print("Testing phase...")
        test_loss = self.evaluate_dataset(False, TEST_BATCHES, test_model)
        print("Testing Loss: %lf\n" % test_loss)

    def latent_features(self, data, batch_size=-1):
        """Obtain latent features learnt by the model

      Args:
          data: (array) corresponding array containing the data
          batch_size: (int) size of each batch to consider from the data

      Returns:
          features: (array) array containing the features from the data
      """
        if batch_size == -1:
            batch_size = data.shape[0]

        # create dataset
        dataset = self.create_dataset(False, data, batch_size)

        # we will use only the encoder network
        with tf.variable_scope('model', reuse=True):
            encoder = self.network.encoder(dataset['data'], self.feature_size)

        # obtain the features from the input data
        self.sess.run(dataset['iterator_init'])
        num_batches = data.shape[0] // batch_size
        features = np.zeros((data.shape[0], self.feature_size))
        for j in range(num_batches):
            features[j * batch_size:j * batch_size +
                     batch_size] = self.sess.run(encoder)
        return features

    def reconstruct_data(self, data, batch_size=-1):
        """Reconstruct Data

      Args:
          data: (array) corresponding array containing the data
          batch_size: (int) size of each batch to consider from the data

      Returns:
          reconstructed: (array) array containing the reconstructed data
      """
        if batch_size == -1:
            batch_size = data.shape[0]

        # create dataset
        dataset = self.create_dataset(False, data, batch_size)

        # reuse model used in training
        model_spec = self.create_model(False, dataset, data.shape[1])

        # obtain the reconstructed data
        self.sess.run(model_spec['iterator_init'])
        num_batches = data.shape[0] // batch_size
        reconstructed = np.zeros(data.shape)
        pos = 0
        for j in range(num_batches):
            reconstructed[pos:pos + batch_size] = self.sess.run(
                model_spec['output'])
            pos += batch_size
        return reconstructed

    def plot_latent_space(self, data, labels, save=False):
        """Plot the latent space learnt by the model

      Args:
          data: (array) corresponding array containing the data
          labels: (array) corresponding array containing the labels
          save: (bool) whether to save the latent space plot

      Returns:
          fig: (figure) plot of the latent space
      """
        # obtain the latent features
        features = self.latent_features(data)

        # plot only the first 2 dimensions
        fig = plt.figure(figsize=(8, 6))
        plt.scatter(features[:, 0],
                    features[:, 1],
                    c=labels,
                    marker='o',
                    edgecolor='none',
                    cmap=plt.cm.get_cmap('jet', 10),
                    s=10)
        plt.colorbar()
        if (save):
            fig.savefig('latent_space.png')
        return fig
Example #11
0
vol = 1.0
nTLS = 1.0
#freq = 1e3

#vol = vol * 1e-30

###################################
#  Staging for Loss Calculations  #
###################################
if len(sys.argv) > 1:
    suff = "_" + sys.argv[1]
else:
    suff = ""

tlsdata = np.loadtxt("pp-tls.tot" + suff)
tlsdata = LF.RemoveOutliers(tlsdata)
print tlsdata.shape
#tlsdata = LF.RemoveDuplicates(tlsdata)
nPts = tlsdata.shape[0]
fMatrix = np.logspace(np.log10(minF), np.log10(maxF), num=nF)
fMatrix = fMatrix[:] * 2 * np.pi
density = nTLS / vol

print np.mean(tlsdata[:, 7])

tlsdata[:, 5] = 1.0 / tlsdata[:, 5] * 0.0101804979 * 1e-12
tlsdata[:, 6] = 1.0 / tlsdata[:, 6] * 0.0101804979 * 1e-12
tlsdata[:, 7] = dipole
tlsdata[:, 8] = dipole

originalLoss = DL.calculateSusceptibility(
Example #12
0
    Y = (X >= 0)
    return X, Y


#nsamples = 10
#X, Y = load_planar_dataset()
X, Y = load_sign_class_dataset(1000)

DNN.append(NNLayers.InputLayer(X))
DNN.append(NNLayers.FeedFwdLayer(nnodes=2, actfcn='Tanh'))
#DNN.append( NNLayers.FeedFwdLayer( nnodes=2, actfcn='ReLU' ) )
DNN.append(NNLayers.FeedFwdLayer(nnodes=1, actfcn='Sigmoid'))

nlayers = len(DNN)

CrossEntropyFcn = LossFunctions.Factory('CrossEntropy')

#np.random.seed(2)
# initialization
for i in range(1, nlayers):
    DNN[i].SetNNodesPrev(DNN[i - 1].GetNNodes())
    DNN[i].Initialize()

# main loop
for j in range(nepochs):

    # dummy init A
    A = None

    # forward prop
    for i in range(nlayers):