Example #1
0
def epochTrain (epochID, model, dataLoader, optimizer, loss, test_model):

    model.train()

    for batchID, (input, target) in enumerate (dataLoader):
        # print(args.branch_type+' Training...'+'epoch:'+str(epochID)+'||'+'train:'+str(batchID))

        target = target.cuda(async = True)


        if args.branch_type == 'local':
            output, heatmap, pool = test_model(torch.autograd.Variable(input.cuda(async = True)))
            input = heatmap_crop_origin(heatmap.cpu(), input)

        if args.branch_type == 'fusion':
            test_model1, test_model2 = test_model
            output, heatmap, pool1 = test_model1(torch.autograd.Variable(input.cuda(async = True)))
            inputs = heatmap_crop_origin(heatmap.cpu(), input)
            output, heatmap, pool2 = test_model2(torch.autograd.Variable(inputs.cuda(async = True)))
            pool1 = pool1.view(pool1.size(0), -1)
            pool2 = pool2.view(pool2.size(0), -1)
            pool3 = pool3.view(pool3.size(0), -1)
            input = torch.cat((pool1.cpu(), pool2.cpu(), pool3.cpu()), dim=1)

        input = input.cuda(async = True)

        varInput = torch.autograd.Variable(input)
        varTarget = torch.autograd.Variable(target)
        varOutput, heatmap, pool = model(varInput)

        lossvalue = loss(varOutput, varTarget)

        optimizer.zero_grad()
        lossvalue.backward()
        optimizer.step()
Example #2
0
 def test_loss(self):
     _, loss, _ = linear(self.l1, self.l2)
     actual = loss(self.theta, self.x, self.y)
     self.assertTrue(isinstance(actual, float))
     expected_error = 22 - 6
     expected_loss = expected_error * expected_error + 1.0 + 1.3
     self.assertAlmostEqual(actual, expected_loss)
Example #3
0
def attack3():
    attack_loader = loader.attack_loader
    loss.start_log()
    for batch, (inputs, labels) in enumerate(attack_loader):
        inputs = inputs.to('cuda')
        inputs.requires_grad = True
        labels = labels.to('cuda')
        print("333333333333333333")
        outputs = model(inputs)
        lossx = loss(outputs, labels)
        gradients = torch.autograd.grad(lossx, inputs)[0]
        per = 0.1 * gradients.sign()
        for (t) in range(14):
            adversarial_examples = inputs + per
            #adversarial_examples = torch.clamp(adversarial_examples, min=0, max=1).detach()
            #adversarial_examples.requires_grad = True
            outputs = model(adversarial_examples)
            lossx = loss(outputs, labels)
            gradients = torch.autograd.grad(lossx, adversarial_examples)[0]
            per = per + (0.1 / 14) * gradients.sign()
            per = torch.clamp(per, min=-0.1, max=0.1)
        #loss.backward()
        save_img(adversarial_examples, inputs.shape[0])
        loss.end_log(len(attack_loader))
Example #4
0
    def _info_gain(self, y, threshold, col_data):
        # 计算当前节点上的所有样本,在当前特征的当前分割点下,所选择的criterion的信息增益
        if self.criterion == 'mse':
            loss = mse
        elif self.criterion == 'entropy':
            loss = entropy
        elif self.criterion == 'gini':
            loss = gini

        parent_loss = loss(y)

        left_idx_array = np.argwhere(col_data <= threshold).flatten()
        right_idx_array = np.argwhere(col_data > threshold).flatten()

        # 计算子节点的loss的时候,简单按照样本个数比例做加权,惩罚一下样本数太少的子节点
        left_num = len(left_idx_array)
        right_num = len(right_idx_array)
        n = left_num + right_num
        left_loss = loss(y[left_idx_array])
        right_loss = loss(y[right_idx_array])

        child_loss = (left_num / n) * left_loss + (right_num / n) * right_loss

        return parent_loss - child_loss
Example #5
0
def validate(opt, shared, m, val_data, val_idx):
    m.train(False)

    val_loss = 0.0
    num_ex = 0

    loss = None
    if opt.loss == 'loss':
        loss = Loss(opt, shared)
    elif opt.loss == 'crf':
        loss = CRFLoss(opt, shared)
    elif opt.loss == 'luka':  # Ashim : For Lukasiewicz Loss
        print('Using Lukasiewicz Loss')
        loss = LukaLoss(opt, shared)
    elif opt.loss == 'godel':
        print('Using Godel Loss')
        loss = GodelLoss(opt, shared)

    loss.train(False)

    print('validating on the {0} batches...'.format(len(val_idx)))

    m.begin_pass()
    for i in range(len(val_idx)):
        (data_name, source, char_source, batch_ex_idx, batch_l, source_l,
         label, res_map) = val_data[val_idx[i]]

        wv_idx = Variable(source, requires_grad=False)
        cv_idx = Variable(char_source, requires_grad=False)
        y_gold = Variable(label, requires_grad=False)

        # update network parameters
        m.update_context(batch_ex_idx, batch_l, source_l, res_map)

        # forward pass
        pred = m.forward(wv_idx, cv_idx)

        # loss
        batch_loss = loss(pred, y_gold)

        # stats
        val_loss += float(batch_loss.data)
        num_ex += batch_l

    perf, extra_perf = loss.get_epoch_metric()
    m.end_pass()

    return (perf, extra_perf, val_loss / num_ex, num_ex)
Example #6
0
def epochVal (epochID, model, dataLoader, optimizer, loss, test_model):
    with torch.no_grad():



        model.eval ()

        lossVal = 0
        lossValNorm = 0

        losstensorMean = 0

        for i, (input, target) in enumerate (dataLoader):
            # print(args.branch_type+' Valing...''epoch:'+str(epochID)+'||'+'eval:'+str(i))
            target = target.cuda(async = True)

            if args.branch_type == 'local':
                output, heatmap, pool = test_model(torch.autograd.Variable(input.cuda(async = True)))
                input = heatmap_crop_origin(heatmap.cpu(), input)

            if args.branch_type == 'fusion':
                test_model1, test_model2 = test_model
                output, heatmap, pool1 = test_model1(torch.autograd.Variable(input.cuda(async = True)))
                inputs = heatmap_crop_origin(heatmap.cpu(), input)
                output, heatmap, pool2 = test_model2(torch.autograd.Variable(inputs.cuda(async = True)))
                pool1 = pool1.view(pool1.size(0), -1)
                pool2 = pool2.view(pool2.size(0), -1)
                input = torch.cat((pool1.cpu(), pool2.cpu()), dim=1)

            input = input.cuda(async = True)

            varInput = torch.autograd.Variable(input, volatile=True)
            varTarget = torch.autograd.Variable(target, volatile=True)
            varOutput, heatmap, pool = model(varInput)

            losstensor = loss(varOutput, varTarget)
            losstensorMean += losstensor

            lossVal += losstensor.data[0]
            lossValNorm += 1

        outLoss = lossVal / lossValNorm
        losstensorMean = losstensorMean / lossValNorm

        return outLoss, losstensorMean
Example #7
0
def evaluate(opt, shared, m, data):
    m.train(False)

    val_loss = 0.0
    num_ex = 0
    verbose = opt.verbose==1

    loss = None
    if opt.loss == 'loss':
        loss = Loss(opt, shared)
    elif opt.loss == 'crf':
        loss = CRFLoss(opt, shared)
    loss.train(False)

    loss.verbose = verbose

    m.begin_pass()
    loss.begin_pass()
    for i in range(data.size()):
        (data_name, source, char_source, batch_ex_idx, batch_l, source_l, label, res_map) = data[i]

        wv_idx = Variable(source, requires_grad=False)
        cv_idx = Variable(char_source, requires_grad=False)
        y_gold = Variable(label, requires_grad=False)

        # update network parameters
        m.update_context(batch_ex_idx, batch_l, source_l, res_map)

        # forward pass
        pred = m.forward(wv_idx, cv_idx)

        # loss
        batch_loss = loss(pred, y_gold)

        # stats
        val_loss += float(batch_loss.data)
        num_ex += batch_l

    perf, extra_perf = loss.get_epoch_metric()
    loss.end_pass()
    m.end_pass()

    return (perf, extra_perf, val_loss / num_ex, num_ex)
def validation(data_loader, net, loss, epoch, save_dir,visual=None):
    global min_loss
    net.eval()

    metrics=[]
    loss_value=0
    count=0
    for i, (data,label) in enumerate(data_loader):
        data=Variable(data.cuda(async=True))
        label=Variable(label.cuda(async=True))
        output=net(data.float())
        loss_output=loss(output,label)
        loss_value+=loss_output.item()
        print("the loss is",loss_output.item())
        count+=1
        output=output>0
        label=label>0
        for j in range(data.size()[0]):
            metrics.append(torch.equal(output[j],label[j]))


    metrics=np.array(metrics)*1.0

    acc=metrics.sum()/metrics.shape[0]


    print("------------------------------------------------")
    print("the epoch is %d, and the validation acc is %f"%(epoch,acc))
    print("the loss value is ",loss_value)
    print("------------------------------------------------")

    if min_loss>loss_value:
        #-------save the best-------------
        min_loss=loss_value
        state_dict=net.module.state_dict()
        for key in state_dict.keys():
            state_dict[key]=state_dict[key].cpu()

        torch.save({
            'epoch': epoch,
            'save_dir': save_dir,
            'state_dict': state_dict},
            os.path.join(save_dir, 'the_min_loss_%f_epoch_%d_acc_%f.ckpt' % (min_loss,epoch,acc)))
def train(data_loader, net, loss, epoch, optimizer, get_lr, save_freq, save_dir,visual=None):
    net.train()
    lr=get_lr(epoch)
    for param_group in optimizer.param_groups:
        param_group['lr']=lr

    metrics=[]
    for i, (data,label) in enumerate(data_loader):
        data=Variable(data.cuda(async=True))
        label=Variable(label.cuda(async=True))
        output=net(data.float())
        loss_output=loss(output,label)
        print("the loss is",loss_output.data)

        optimizer.zero_grad()
        loss_output.backward()
        optimizer.step()

        output=output>0 #最后一层没有sigmoid激活,所以要大于0
        label=label>0
        for j in range(data.size()[0]):
            metrics.append(torch.equal(output[j],label[j]))

    metrics=np.array(metrics)*1.0

    acc=metrics.sum()/metrics.shape[0]
    print("------------------------------------------------")
    print("the epoch is %d, and the acc is %f"%(epoch,acc))
    print("------------------------------------------------")
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    if epoch%save_freq==0:
        #-----------for training restart---------------
        state_dict=net.module.state_dict()
        for key in state_dict.keys():
            state_dict[key]=state_dict[key].cpu()

        torch.save({
            'epoch': epoch,
            'save_dir': save_dir,
            'state_dict': state_dict},
            os.path.join(save_dir, 'train_%d_acc_%f.ckpt' % (epoch,acc)))
Example #10
0
def run_epoch(config,optimizer,loss,epoch,pbar,model,configuration):
    
    if configuration=='train':
        model.train()
    elif configuration=='val':
        model.eval()  
        
    epoch_logger = {'criterion':torch.zeros(1).cuda(gpus_list[0]),'dice':torch.zeros(1).cuda(gpus_list[0]),'bce':torch.zeros(1).cuda(gpus_list[0]),'rce':torch.zeros(1).cuda(gpus_list[0])}
    
    for iteration,batch in enumerate(pbar, 1):
        
        if configuration=='train':
            optimizer.zero_grad()
            logits = model(batch['input_rd'].cuda(gpus_list[0]))
            
        elif configuration=='val':
            with torch.no_grad():
                logits = model(batch['input_rd'].cuda(gpus_list[0]))
                
        logger = loss(logits,batch['label'].cuda(gpus_list[0]))
            
        if configuration=='train':
            logger['criterion'].backward()  
            optimizer.step()
       
        epoch_logger['criterion'] += logger['criterion'].detach()
        epoch_logger['dice']      += logger['dice'].detach()
        epoch_logger['bce']       += logger['bce'].detach()
        epoch_logger['rce']       += logger['rce'].detach()

        stats = {'criterion':epoch_logger['criterion'].detach().item()/(iteration*batch_size),'dice':epoch_logger['dice'].detach().item()/(iteration*batch_size),
                 'bce':epoch_logger['bce'].detach().item()/(iteration*batch_size),'rce':epoch_logger['rce'].detach().item()/(iteration*batch_size)}
        pbar.set_postfix(ordered_dict=stats, refresh=True)
        
        # Debug
        if debug_mode and iteration==4: break
            
    epoch_logger['criterion'] /= (iteration*batch_size)
    epoch_logger['dice']      /= (iteration*batch_size)
    epoch_logger['bce']       /= (iteration*batch_size)
    epoch_logger['rce']       /= (iteration*batch_size)

    return epoch_logger
Example #11
0
def evaluate():
    eval_batch_count = 50  # faster validation, change to 40000/batch_size for the report
    validation_error = 0
    validation_accuracy = 0

    with tf.device('/cpu:0'):
        with tf.Graph().as_default() as g:
            images, labels = cifar_input.build_input(
                'cifar100', '../../cifar/cifar100/validation.bin', batch_size,
                'eval')  #TEST.BIN OR VALIDATION.BIN

            logits = inference(images, NUM_CLASSES=100)
            saver = tf.train.Saver()

            losses = loss(logits, labels)

            accuracies = accuracy(logits, labels)

            sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True))
            tf.train.start_queue_runners(sess)

            ckpt_state = tf.train.get_checkpoint_state(train_dir)
            saver.restore(sess, ckpt_state.model_checkpoint_path)

            for _ in six.moves.range(eval_batch_count):
                (value_losses, value_accuracy) = sess.run([losses, accuracies])
                validation_error += value_losses
                validation_accuracy += value_accuracy
            validation_error /= 50
            validation_accuracy /= 50

            step = str(ckpt_state.model_checkpoint_path).split('-')[1]
            tf.logging.info('loss: %.3f, best accuracy: %.3f' %
                            (validation_error, validation_accuracy))
            f = open(train_dir + "validation_data.csv", 'ab')
            f.write('{0},{1},{2}\n'.format(step, validation_error,
                                           validation_accuracy))
            f.close()
            f = open(train_dir + "log.txt", 'ab')
            f.write('loss: {0}, best accuracy: {1}\n'.format(
                validation_error, validation_accuracy))
            f.close()
Example #12
0
def attack2():
    attack_loader = loader.attack_loader
    loss.start_log()
    for batch, (inputs, labels) in enumerate(attack_loader):
        inputs = inputs.to('cuda')
        inputs.requires_grad = True
        labels = labels.to('cuda')

        outputs = model(inputs)

        print(inputs.shape)
        print(labels.shape)
        print(outputs[0].shape)
        print("22222222222222222222222")

        lossx = loss(outputs, labels)
        #loss.backward()
        gradients = torch.autograd.grad(lossx, inputs)[0]
        adversarial_examples = inputs + (0.1 * gradients.sign())
        save_img(adversarial_examples, inputs.shape[0])
        loss.end_log(len(attack_loader))
Example #13
0
def train(opt):
    # Load Dataset
    content_image = image_load(opt.content)
    style_image = image_load(opt.style)

    generate_image = torch.randn_like(content_image).requires_grad_(True)

    # Set Optimizer
    optim = torch.optim.Adam([generate_image], lr=0.01)

    # Set Loss
    loss = Loss(alpha=1, beta=1000)

    writer = SummaryWriter()

    if not osp.isdir(opt.result):
        os.makedirs(opt.result)

    for epoch in range(opt.epoch):
        optim.zero_grad()
        total_loss, c_loss, s_loss = loss(generate_image, content_image,
                                          style_image)
        total_loss.backward()
        optim.step()

        writer.add_scalar('loss/total', total_loss, epoch)
        writer.add_scalar('loss/content', c_loss, epoch)
        writer.add_scalar('loss/style', s_loss, epoch)

        if (epoch + 1) % opt.display_epoch == 0:
            writer.add_images('image',
                              generate_image,
                              epoch,
                              dataformats="NCHW")
            print('[Epoch {}] Total : {:.2} | C_loss : {:.2} | S_loss : {:.2}'.
                  format(epoch + 1, total_loss, c_loss, s_loss))
            imsave(generate_image,
                   osp.join(opt.result, '{}.png'.format(epoch + 1)))
            imsave(content_image, 'content.png')
            imsave(style_image, 'style.png')
Example #14
0
        def plot_prediction(i):
            labels = {
                0: "cross",
                1: "circle",
                2: "triangle",
                3: "square",
                4: "pentagon"
            }
            pred = net.forward(data_test)
            print(pred.shape)

            pred_label = np.where(pred[:, i] == np.max(pred[:, i]))[0][0]
            plot_title = labels[int(pred_label)] + " prob : " + str(
                round(np.max(pred[:, i]), 2))
            plt.title(plot_title)
            plt.imshow(data_test[:, i].reshape(size, size), cmap="Greys")

            plot_img_derivative(net, loss(), data_test[:, i], labels_test[:,
                                                                          i])
            plt.colorbar()

            plt.show()
Example #15
0
    def faster_ssd(self):
        '''
		定义faster-ssd的计算图谱
		'''
        with self.graph.as_default():
            # Training computation.
            self.small_rpn_train = InceptionV3_facenet_112(
                batch_seize=train_batch,
                num_channels=self.input_image_size[0],
                image_size_h=self.input_image_size[1],
                image_size_w=self.input_image_size[2],
                trainable=True,
                resueable=False,
                BN_decay=0.99,
                BN_epsilon=0.00001,
                anchor_num=15,
                name="train_rpn/")
            self.rpn_target_layer = anchor_target_layer(
                self.small_rpn_train.roi_data,
                batch=train_batch,
                img_height=self.input_image_size[1],
                img_width=self.input_image_size[2],
                FrcnnParam=self.Work_Param)
            '''
			self.small_rpn_val=InceptionV3_facenet_112(batch_seize=val_batch,num_channels=self.input_image_size[0],image_size_h=self.input_image_size[1],image_size_w=self.input_image_size[2],
													trainable=False,resueable=True,BN_decay=0.99,BN_epsilon=0.00001,anchor_num=15,name="val/")
			self.small_rpn_test=InceptionV3_facenet_112(batch_seize=test_batch,num_channels=self.input_image_size[0],image_size_h=self.input_image_size[1],image_size_w=self.input_image_size[2],
													trainable=False,resueable=True,BN_decay=0.99,BN_epsilon=0.00001,anchor_num=15,name="test/")
			'''
            #self.merged_train_weights_summary= tf.summary.merge(summaries)
            #self.summary_placeholders, self.update_ops, self.summary_op = self.setup_summary()
            for var in tf.trainable_variables():
                if var.op.name.find('train_rpn') > 0:
                    self.rpn_variable.append(var)
            train = loss(self.small_rpn_train.rpn_cls_score_reshape,
                         self.small_rpn_train.rpn_bbox_pred, self.rpn_variable)
            return train
Example #16
0
    def build_train_graph(self):
        opt = self.opt

        print("ALL Ok GIRL")
        print(opt.dataset_dir)

        # class weights Sitting
        class_weight = [
            1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0
        ]
        class_weight = tf.reshape(
            tf.convert_to_tensor(class_weight, dtype=tf.float32), [12])

        self.train_image_batch = tf.placeholder(
            tf.float32, [None, opt.img_height, opt.img_width, 3])
        self.train_label_batch = tf.placeholder(
            tf.float32,
            [None, opt.img_height * opt.img_width, opt.numberClasses])
        self.tgt_image = self.train_image_batch
        self.tgt_label = self.train_label_batch
        self.tgt_label = self.train_label_batch
        # train_image_batch, train_label_batch = self.camvid_batches()
        self.N_classes = opt.numberClasses
        self.keep_prob = opt.dropout
        self.batch_size = opt.batch_size
        self.width = opt.img_width
        self.height = opt.img_height
        self.Training = True
        self.random = False
        self.total_steps = opt.max_steps
        self.dataset = opt.dataset
        self.version_net = opt.version_net
        self.configuration = opt.configuration

        with tf.name_scope("Net_prediction"):
            if self.version_net == 'FCN_Seg':
                print("Computing FCN_Seg encoder and decoder")
                segMap = FCN_Seg(self, is_training=self.Training)
            print("Output FCN_Seg")
            print(segMap)

        with tf.name_scope("Output_Metrics"):
            segmentationMask = tf.argmax(segMap, axis=1)
            # 	print("Segmentation mask")
            # 	print(segmentationMask)
            Smask = tf.placeholder(tf.float32,
                                   [None, opt.img_height * opt.img_width])
            Smask = tf.reshape(
                segmentationMask,
                (self.batch_size, opt.img_height * opt.img_width))
            segmentationLabel = tf.argmax(self.train_label_batch, axis=2)
            # 	print("Segmentation Label")
            # 	print(segmentationLabel)
            print(Smask)
            print(segmentationLabel)
            equality = tf.equal(Smask, segmentationLabel)
            accuracy = tf.reduce_mean(tf.cast(equality, tf.float32))

        with tf.name_scope("compute_loss"):
            # Compute Softmax loss of D-Net
            Reshaped_labels = tf.reshape(self.train_label_batch,
                                         (-1, self.N_classes))

            if opt.version_net == 'FCN_Seg':
                TotalLoss = loss(segMap, Reshaped_labels, self.N_classes,
                                 class_weight)

            print(TotalLoss)

        with tf.name_scope("Training"):
            print(
                "==================== Training ================================="
            )
            train_vars = [var for var in tf.trainable_variables()]

            global_step = tf.train.get_or_create_global_step()
            self.global_step = global_step
            self.incr_global_step = tf.assign(self.global_step,
                                              self.global_step + 1)

            # DECAY ############################
            print("Exponential Decay .......")
            Decay = 0.90
            # Decay the learning rate exponentially based on the number of
            # steps.
            lr = tf.train.exponential_decay(opt.learning_rate,
                                            global_step,
                                            (self.total_steps / 2),
                                            Decay,
                                            staircase=True)

            # OPTIMIZER #########################
            # select Adam as optimizer
            optimizer = tf.train.AdamOptimizer(lr, opt.beta1)

            self.grads_and_vars = optimizer.compute_gradients(
                TotalLoss, var_list=train_vars)
            self.Training = optimizer.apply_gradients(self.grads_and_vars)
            self.learning_rate = lr

        # Collect tensors that are useful later (tf summary)
        self.predMask = segMap
        self.total_loss = TotalLoss
        self.steps_per_epoch = opt.steps_per_epoch
        self.accuracy = accuracy

        self.version_net = opt.version_net

        # merge all summaries into a single "operation" which we can execute in a session
        # merged = tf.summary.merge_all()
        self.logs_path = opt.logs_path

        print("DONE BUILDING GRAPH!")
Example #17
0
    def DifferentialEvolution_f(self,model):
        self.emin,self.emax =model.normalise_val()
        model=self.model
        re = ""
        frontier=[model.candidates(0,False,0) for _ in range(self.max_changes)]
        best_energy=model.Energy(frontier[0],self.emax,self.emin)
        best_solution=frontier[0]
        k=0
        list_energy=[]
        a12_small=0.56
        prev_energy=[0 for _ in range(21)]
        while k<self.kmax :
            re=""

            if(best_energy==self.threshold):
                break

            for i, solution in enumerate(frontier):
                seen = []
                while len(seen) < 3:
                    rand_index = random.randint(0, 99)
                    if rand_index == i:
                        continue
                    if rand_index not in seen:
                        seen.append(rand_index)
                mutation=frontier[seen[0]]
                current_energy=model.Energy(solution,self.emax,self.emin)
                append=" ."
                if(self.crossover < random.random()):
                    if(model.Energy(mutation,self.emax,self.emin)<current_energy):
                        current_energy=model.Energy(mutation,self.emax,self.emin)
                        frontier[i] = mutation
                        append = " +"

                else:
                    mutation=[]
                    for j in xrange(model.n):
                        l=model.lo[j]
                        m=model.hi[j]
                        inter = (frontier[seen[0]][j] + self.f* (frontier[seen[1]][j] - frontier[seen[2]][j]))
                        if inter >= l and inter <= m:
                            mutation.append(inter)
                        else:
                            mutation.append(frontier[seen[random.randint(0, 2)]][j])

                    if(model.ok(mutation) and model.Energy(mutation,self.emax,self.emin)<current_energy) :
                        frontier[i]=mutation
                        current_energy=model.Energy(mutation,self.emax,self.emin)
                        append=" +"

                if(current_energy<best_energy  and current_energy>=self.threshold):
                    append=" ?"
                    best_energy=current_energy
                    best_solution=frontier[i]
                list_energy.append(current_energy)
                re=re+append
                k+=1
                if (k>0):
                    if (k==25):
                                first_energy=prev_energy
                    if k % 25 is 0:
                        print k,best_energy,re
                        re = ""
                       
                        l1=list_energy
                        l2=prev_energy
                       # print l1,l2
                           # print l1
                            #print l2
                        a12_result=a12(l1,l2)
                    #print a12_result
                        if (a12_result>a12_small):
                            k =k +5
                        else :
                            k=k -1
                        prev_energy=list_energy
                        list_energy=[]
                        l=''

        final_energy=prev_energy
        x=loss(final_energy,first_energy)

        global_variable.loss_inter=x

        print("\nBest Solution : " + str(best_solution))
        print("Best Energy : " + str((model.Energy(best_solution,self.emax,self.emin))))
Example #18
0
def train_epoch(opt, shared, m, optim, ema, data, epoch_id, sub_idx):
    train_loss = 0.0
    num_ex = 0
    start_time = time.time()
    min_grad_norm2 = 1000000000000.0
    max_grad_norm2 = 0.0

    loss = None
    if opt.loss == 'loss':
        loss = Loss(opt, shared)
    elif opt.loss == 'crf':
        loss = CRFLoss(opt, shared)
    elif opt.loss == 'luka':  # Ashim : For Lukasiewicz Loss
        print('Using Lukasiewicz Loss')
        loss = LukaLoss(opt, shared)
    elif opt.loss == 'godel':
        print('Using Godel Loss')
        loss = GodelLoss(opt, shared)

    #if opt.loss == 'godel' and epoch_id < 100:
    #    print('Using R-Prod')
    #    loss = Loss(opt, shared)

    data_size = len(sub_idx)
    batch_order = torch.randperm(data_size)
    batch_order = [sub_idx[idx] for idx in batch_order]

    acc_batch_size = 0
    m.train(True)
    loss.train(True)
    loss.begin_pass()
    m.begin_pass()
    for i in range(data_size):
        (data_name, source, char_source, batch_ex_idx, batch_l, source_l,
         label, res_map) = data[batch_order[i]]

        #print('Batch_l ' + str(batch_l))
        #print('Source_l ' +str(source_l))
        #print(source)

        wv_idx = Variable(source, requires_grad=False)
        cv_idx = Variable(char_source, requires_grad=False)
        y_gold = Variable(label, requires_grad=False)

        # update network parameters
        shared.epoch = epoch_id
        m.update_context(batch_ex_idx, batch_l, source_l, res_map)

        # forward pass
        output = m.forward(wv_idx, cv_idx)

        # loss
        if opt.loss == 'luka':
            batch_loss = loss(output,
                              y_gold,
                              constraints_lambda=opt.constraints_lambda)
        else:
            batch_loss = loss(output,
                              y_gold,
                              constraints_lambda=opt.constraints_lambda)

        # stats
        train_loss += float(batch_loss.data)
        num_ex += batch_l
        time_taken = time.time() - start_time
        acc_batch_size += batch_l

        # accumulate grads
        batch_loss.backward()

        # accumulate current batch until the rolled up batch size exceeds threshold or meet certain boundary
        if i == data_size - 1 or acc_batch_size >= opt.acc_batch_size or (
                i + 1) % opt.print_every == 0:
            grad_norm2 = optim.step(m, acc_batch_size)
            if opt.ema == 1:
                ema.step(m)

            # clear up grad
            m.zero_grad()
            acc_batch_size = 0

            # stats
            grad_norm2_avg = grad_norm2
            min_grad_norm2 = min(min_grad_norm2, grad_norm2_avg)
            max_grad_norm2 = max(max_grad_norm2, grad_norm2_avg)
            time_taken = time.time() - start_time
            loss_stats = loss.print_cur_stats()

            if (i + 1) % opt.print_every == 0:
                stats = '{0}, Batch {1:.1f}k '.format(epoch_id + 1,
                                                      float(i + 1) / 1000)
                stats += 'Grad {0:.1f}/{1:.1f} '.format(
                    min_grad_norm2, max_grad_norm2)
                stats += 'Loss {0:.4f} '.format(train_loss / num_ex)
                stats += loss.print_cur_stats()
                stats += 'Time {0:.1f}'.format(time_taken)
                print(stats)

    perf, extra_perf = loss.get_epoch_metric()

    m.end_pass()
    loss.end_pass()

    return perf, extra_perf, train_loss / num_ex, num_ex
Example #19
0
def lr_find(model, lr_max, lr_min, trn_dataloader, linear=True):
    """

    """
    torch.save(model.state_dict(), "tmp.pth")
    lr_array, loss_array = [], []

    num_batch = len(trn_dataloader)
    ratio = lr_max / lr_min
    step = (lr_max - lr_min) / num_batch

    optimizer = torch.optim.SGD(model.parameters(), lr=lr_min, momentum=0.9)
    print("SGD")

    use_cuda = torch.cuda.is_available()
    device = torch.device("cuda:0" if use_cuda else "cpu")
    model.freeze_basenet()
    model = model.to(device)
    prior_box = get_prior_box()
    min_loss = float("inf")

    for i, batch in enumerate(tqdm(trn_dataloader)):
        if linear:
            lr = lr_min + step * i
        else:
            lr = lr_min * ratio ** (i / num_batch)
        optimizer.param_groups[0]["lr"] = lr

        imgs, bboxes, labels = batch
        imgs = imgs.to(device)
        cls_preds, loc_preds = model(imgs)

        model.zero_grad()

        total_loss = 0
        total_loc_loss, total_cls_loss = 0, 0

        for idx in range(imgs.shape[0]):

            img, bbox, label = imgs[idx], bboxes[idx], labels[idx]
            cls_pred, loc_pred = cls_preds[idx], loc_preds[idx]
            iou = get_iou(bbox, prior_box)

            pos_mask, cls_target, bbox_target = get_target(
                iou, prior_box, img, bbox, label
            )
            pos_mask, cls_target, bbox_target = (
                pos_mask.to(device),
                cls_target.to(device),
                bbox_target.to(device),
            )

            loss_loc, loss_cls = loss(
                cls_pred, loc_pred, pos_mask, cls_target, bbox_target
            )
            total_loc_loss += loss_loc
            total_cls_loss += loss_cls

            total_loss += loss_cls + loss_loc

        total_loss /= float(imgs.shape[0])

        # use min_loss to terminate the lr find more quickly
        if min_loss * 4 <= float(total_loss):
            break
        min_loss = min(float(min_loss), float(total_loss.data))
        # print(min_loss)

        total_loss.backward()
        optimizer.step()

        lr_array.append(lr)
        loss_array.append(round(float(total_loss), 3))

    model.state_dict = torch.load("tmp.pth")
    return lr_array, loss_array
Example #20
0
        dataset = dataset(batch_size=cfg.total_bs, imgsize=cfg.img_size)
        dataset.show_batch(rows=3, figsize=(10,10))
        plt.show()
    except:
        print("Dataset Type {} are Not Implemented. ".format(cfg.dataset_type))
        exit()


    metrics = [getattr(fastai.metrics, met) for met in cfg.metric]
    try:
        loss = getattr(nn, cfg.loss)
    except AttributeError as error:
        loss = getattr(loss, cfg.loss)
    optimizer = get_optimizer(cfg.optimizer)

    learner = Learner(dataset, model, opt_func=optimizer, loss_func=loss().to(device),
                      metrics=metrics, bn_wd=False, true_wd=True,
                      wd=cfg.optimizer.weight_decay, path=cfg.work_dir) # Custom Learner

    # models : Darknet, resnet18,34,50,101,152,xresnet18,34,50,101,152,squeezenet1_0,squeezenet1_1, densenet121
    # learner = cnn_learner(dataset, models.resnet18, wd=cfg.optimizer.weight_decay,metrics=metrics)
    # learner = unet_learner(dataset, models.resnet34, metrics=partial(foreground_acc,void_code=30), wd=cfg.optimizer.weight_decay)

    # GAN
    # generator = basic_generator(in_size=64, n_channels=3, n_extra_layers=1)
    # critic = basic_critic(in_size=64, n_channels=3, n_extra_layers=1)
    # learner = GANLearner.wgan(dataset, generator, critic, switch_eval=False,opt_func=partial(optim.Adam, betas=(0., 0.99)), wd=0.)

    # NLP
    # languagemodellearner()
    # textclassifierlearner()
Example #21
0
def train(image_width,
          dim_x,
          dim_z,
          encoder_type,
          decoder,
          dataset,
          learning_rate=0.0001,
          optimizer=tf.train.AdamOptimizer,
          loss=elbo_loss,
          batch_size=100,
          results_dir='results',
          max_epochs=10,
          n_view=10,
          results_file=None,
          bn=False,
          **kwargs):
    saved_variables = kwargs.pop('saved_variables', None)
    anneal_lr = kwargs.pop('anneal_lr', False)
    learning_rate_temperature = kwargs.pop('learning_rate_temperature', None)
    global_step = tf.Variable(0, trainable=False)  # for checkpoint saving
    on_epoch = tf.placeholder(tf.float32, name='on_epoch')
    dt = datetime.datetime.now()
    results_file = results_file if results_file is not None else '/{}_{:02d}-{:02d}-{:02d}'.format(
        dt.date(), dt.hour, dt.minute, dt.second)
    results_dir += results_file
    os.mkdir(results_dir)

    # Get all the settings and save them.
    with open(results_dir + '/settings.txt', 'w') as f:
        args = inspect.getargspec(train).args
        #print("locals= ", locals())
        #print("args= ", args)
        #print("locals()['image_width'] = ", locals()['image_width'])
        #print("locals()['image_width'] = ", locals()[args[0]])
        #for arg in args:  # ERROR SOMEWHERE
        #print("arg= ", arg, ",   locals= ", locals()[arg] )
        lll = locals(
        )  # BUG in Python 3? Cannot write: locals()[arg] in a comprehensive list. locals()['image_width'] works in a print statement
        #settings = print("locals= ", [lll[arg] for arg in args])
        settings = [lll[arg] for arg in args]
        for s, arg in zip(settings, args):
            setting = '{}: {}'.format(arg, s)
            f.write('{}\n'.format(setting))
            print(setting)
        settings = locals()[inspect.getargspec(train).keywords]
        for kw, val in settings.items():
            setting = '{}: {}'.format(kw, val)
            f.write('{}\n'.format(setting))
            print(setting)

    # Make the neural neural_networks
    # GE: There is also a cnn (not used)
    # GE: change from tanh to relu or elu?
    # GE: nn and cnn are defined in neural_network.py
    is_training = tf.placeholder(tf.bool)
    if bn:
        encoder_net = lambda x: nn(x,
                                   enc_dims,
                                   name='encoder',
                                   act=tf.nn.tanh,
                                   is_training=is_training)
    else:  # no training
        encoder_net = lambda x: nn(
            x, enc_dims, name='encoder', act=tf.nn.tanh, is_training=None)
    # GE: returns a lambda function:
    #    lambda x, e: _nf_encoder(x, e, neural_net, dim_z, flow, use_c)
    # GE: where _nf_encoder is "encoder_net"
    # GE: encoder_net: nn, cnn, conv_net
    # GE: encoder_type: nf_encoder, iaf_encoder, ...
    # GE: what is flow? Number of NF layers.
    encoder = encoder_type(encoder_net, dim_z, flow)

    # Build computation graph and operations
    x = tf.placeholder(tf.float32, [None, dim_x], 'x')
    x_w = tf.placeholder(tf.float32, [None, dim_x], 'x_w')
    e = tf.placeholder(tf.float32, (None, dim_z), 'noise')

    z_params, z = encoder(x_w, e)

    x_pred = decoder(z)
    kl_weighting = 1.0 - tf.exp(
        -on_epoch / kl_annealing_rate) if kl_annealing_rate is not None else 1
    monitor_functions = loss(x_pred, x, kl_weighting=kl_weighting, **z_params)
    #monitor_functions_sorted = sorted(monitor_functions.iteritems(), key=lambda x: x[0])  # python 2.x only
    monitor_functions_sorted = sorted(monitor_functions.items(),
                                      key=lambda x: x[0])  #python 2 and 3
    #monitor_output_train = {name: [] for name in monitor_functions.iterkeys()}  # python 2
    #monitor_output_valid = {name: [] for name in monitor_functions.iterkeys()}  # python 2
    monitor_output_train = {name: [] for name in monitor_functions}  # python 3
    monitor_output_valid = {name: [] for name in monitor_functions}  # python 3
    monitor_function_names = [p[0] for p in monitor_functions_sorted]
    monitor_function_list = [p[1] for p in monitor_functions_sorted]

    for i in range(len(monitor_function_names)):
        print(
            "monitor_function_names/list= {0:20s}, ".format(
                monitor_function_names[i]), monitor_function_list[i])
    #print(monitor_functions)

    train_loss, valid_loss = monitor_functions[
        'train_loss'], monitor_functions['valid_loss']

    out_op = x_pred

    # Batch normalization stuff
    # One of the default argumetns to batch_norm: updates_collections=ops.GraphKeys.UPDATE_OPS,
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)

    if update_ops:
        updates = tf.group(*update_ops)
        # https://stackoverflow.com/questions/43060206/what-does-control-flow-ops-with-dependencies-mean-for-tensoflow
        # only evaluate train_loss once updates is updated
        train_loss = control_flow_ops.with_dependencies([updates], train_loss)

    # Optimizer with gradient clipping
    lr = tf.Variable(learning_rate)
    optimizer = optimizer(lr)
    gvs = optimizer.compute_gradients(
        train_loss)  # gvs is a list of dictionaries
    #for k in range(len(gvs)):
    #print("k= ", gvs[k])

    # https://www.tensorflow.org/api_docs/python/tf/clip_by_norm
    capped_gvs = [(tf.clip_by_norm(grad, 1), var) if grad is not None else
                  (grad, var) for grad, var in gvs]
    train_op = optimizer.apply_gradients(capped_gvs)

    # Make training and validation sets
    training_data, validation_data = dataset['train'], dataset['valid']
    n_train_batches = training_data.images.shape[
        0] // batch_size,  # python 3 (// integer division)
    n_valid_batches = validation_data.images.shape[0] // batch_size,
    print('Loaded training and validation data')
    visualized = validation_data.images[:n_view]
    e_visualized = np.random.normal(0, 1, (n_view, dim_z))  ## GE: ???

    # Make summaries
    # rec_summary = tf.image_summary("rec", vec2im(out_op, batch_size, image_width), max_images=10)  # tf 0.12
    # images are 4D: batch, heigh, width, channels (gray, RGB, RGBA)
    rec_summary = tf.summary.image("rec",
                                   vec2im(out_op, batch_size, image_width),
                                   max_outputs=10)  # tf 1.x
    for fn_name, fn in monitor_functions.items():
        #tf.scalar_summary(fn_name, fn) # python 2.x
        tf.summary.scalar(fn_name, fn)  # python 3.x
    #summary_op = tf.merge_all_summaries()  # python 2.x
    summary_op = tf.summary.merge_all()  # python 3.x

    # Create a saver.
    saver = tf.train.Saver(tf.all_variables())

    # Create a session
    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())

    # Use pre-trained weight values
    if saved_variables is not None:
        restore.set_variables(sess, saved_variables)

    #summary_writer = tf.train.SummaryWriter(results_dir, sess.graph)  # TF 0.12
    summary_writer = tf.summary.FileWriter(results_dir, sess.graph)  # TF 1.x
    samples_list = []
    batch_counter = 0
    best_validation_loss = 1e100
    number_of_validation_failures = 0
    feed_dict = {}
    validation_losses, training_losses = [], []
    for epoch in range(max_epochs):
        feed_dict[on_epoch] = epoch
        start_time = time.time()
        l_t = 0
        monitor_output_epoch = {name: 0
                                for name in monitor_function_names}  # GE: ???
        for _ in range(n_train_batches):
            batch_counter += 1
            # whitened: False (
            feed_dict[x], feed_dict[x_w] = training_data.next_batch(
                batch_size, whitened=False)
            feed_dict[e] = np.random.normal(0, 1, (batch_size, dim_z))
            feed_dict[is_training] = True
            output = sess.run([train_op, train_loss] + monitor_function_list,
                              feed_dict=feed_dict)
            l, monitor_output_batch = output[1], output[2:]

            for name, out in zip(monitor_function_names, monitor_output_batch):
                monitor_output_epoch[name] += out

            if batch_counter % 100 == 0:
                summary_str = sess.run(summary_op, feed_dict=feed_dict)
                summary_writer.add_summary(summary_str, batch_counter)

            # Save the model checkpoint periodically.
            if batch_counter % 1000 == 0 or epoch == max_epochs:
                checkpoint_path = os.path.join(results_dir, 'model.ckpt')
                saver.save(sess, checkpoint_path, global_step=global_step)
            l_t += l
        l_t /= n_train_batches

        for name in monitor_function_names:
            monitor_output_train[name].append(monitor_output_epoch[name] /
                                              n_train_batches)

        training_losses.append(l_t)

        # Validation loop
        l_v = 0
        monitor_output_epoch = {name: 0 for name in monitor_function_names}
        #for _ in range(n_valid_batches):
        for _ in range(n_valid_batches):
            feed_dict[x], feed_dict[x_w] = validation_data.next_batch(
                batch_size, whitened=False)
            feed_dict[e] = np.random.normal(0, 1, (batch_size, dim_z))
            feed_dict[is_training] = False
            output = sess.run([valid_loss] + monitor_function_list,
                              feed_dict=feed_dict)
            l_v_batched, monitor_output_batch = output[0], output[1:]
            for name, out in zip(monitor_function_names, monitor_output_batch):
                monitor_output_epoch[name] += out
            l_v += l_v_batched

        l_v /= n_valid_batches
        for name in monitor_function_names:
            monitor_output_valid[name].append(monitor_output_epoch[name] /
                                              n_valid_batches)

        validation_losses.append(l_v)
        duration = time.time() - start_time
        examples_per_sec = (n_valid_batches +
                            n_train_batches) * batch_size * 1.0 / duration
        print(
            'Epoch: {:d}\t Weighted training loss: {:.2f}, Validation loss {:.2f} ({:.1f} examples/sec, {:.1f} sec/epoch)'
            .format(epoch, l, l_v, examples_per_sec, duration))

        samples = sess.run([out_op],
                           feed_dict={
                               x: visualized,
                               x_w: visualized,
                               e: e_visualized,
                               is_training: False
                           })
        samples = np.reshape(samples, (n_view, image_width, image_width))
        samples_list.append(samples)
        # show_samples(samples, image_width)

        # Learning rate annealing
        lr = lr / (1.0 + epoch * 1.0 / learning_rate_temperature
                   ) if learning_rate_temperature is not None else lr

        if epoch % 100 == 0:
            np.save(results_dir + '/validation_losses_{}.npy'.format(epoch),
                    validation_losses)
            np.save(results_dir + '/training_losses_{}.npy'.format(epoch),
                    training_losses)
            np.save(
                results_dir + '/sample_visualizations_{}.npy'.format(epoch),
                np.array(samples_list))
            np.save(results_dir + '/real_visualizations_{}.npy'.format(epoch),
                    np.reshape(visualized, (n_view, image_width, image_width)))
            for name in monitor_function_names:
                np.save(results_dir + '/{}_valid_{}.npy'.format(name, epoch),
                        monitor_output_valid[name])
                np.save(results_dir + '/{}_train_{}.npy'.format(name, epoch),
                        monitor_output_train[name])

    np.save(results_dir + '/validation_losses.npy', validation_losses)
    np.save(results_dir + '/training_losses.npy', training_losses)
    np.save(results_dir + '/sample_visualizations.npy', np.array(samples_list))
    np.save(results_dir + '/real_visualizations.npy',
            np.reshape(visualized, (n_view, image_width, image_width)))
    for name in monitor_function_names:
        np.save(results_dir + '/{}_valid.npy'.format(name),
                monitor_output_valid[name])
        np.save(results_dir + '/{}_train.npy'.format(name),
                monitor_output_train[name])

    visualize = False
    if visualize:
        for samples in samples_list:
            together = np.hstack(
                (np.reshape(visualized, (n_view, image_width, image_width)),
                 samples > 0.5))
            plot_images_together(together)

    sess.close()
Example #22
0
    def maxwalksat_f(self,model):
        model = self.model
        re=''
        max_energy=-sys.maxint
        current_energy=0.0
        max_scored_dimension=-1
        max_scored_point=[]
        self.emin,self.emax =model.normalise_val() 
        list_energy=[]
        a12_small=0.56
        prev_energy=[0 for _ in range(21)]
#print self.emax , self.emin
        for i in range(1,self.max_tries): 
            re=''
            variable = self.model.candidates(0,False,0)
            for j in range (1,self.max_changes):
                append=' .'
                current_energy=model.Energy(variable,self.emax,self.emin)
                if (current_energy > self.threshold): 
                    print "maximum energy is ",current_energy," maximum scored point is ",variable
                    return variable
                
                r= random.random()
                
                if (self.p <r ): 
                    variable,current_energy,max_scored_dimension=self.roll_marbles_everywhere(variable,model)
                    if (current_energy>max_energy):
                        max_scored_point,max_energy=variable,current_energy
                        append=' !'
                    else:
                        append=' +'
                    list_energy.append(current_energy)
                       
                else: 
                    if(max_scored_dimension>-1):
                        variable=self.roll_marbles_one_direction(max_scored_dimension,variable,model)
                        current_energy= model.Energy(variable,self.emax,self.emin)
                        append=' .'
                        if (current_energy>max_energy):
                            max_scored_point,max_energy=variable,current_energy
                        list_energy.append(current_energy)
                  
                re=re+append
                if (j==25):
                    print i*j ,max_energy,re
                    re=''
                    l1=list_energy
                    l2=prev_energy
                           # print l1
                            #print l2
                    a12_result=a12(l2,l1)
                    #print a12_result
                    if (a12_result>a12_small):
                        j =j +5
                    else :
                        j=j -1
                    prev_energy=list_energy
                    list_energy=[]
                    l=''
                    if (i==1):
                        first_energy=prev_energy

        final_energy=prev_energy
        x=loss(final_energy,first_energy)

        global_variable.loss_inter=x

        print "maximum energy is ",max_energy," maximum scored point is ",max_scored_point 
Example #23
0
    def simulated_annealer(self,model):
        self.emin,self.emax =model.normalise_val()
        #print self.emax , self.emin
        sol0= self.model.candidates(0,False,0)
        sol0Energy= model.Energy(sol0,self.emax,self.emin)
        best=sol0
        ebest=sol0Energy
        l=''
        k=1
    #    d_energy=dict()
     #   count_dict=0 
        list_energy=[]
        a12_small=0.56
        prev_energy=[0 for _ in range(21)]
        list_loss= []
       # print prev_energy
        while(k<=self.kmax):
                    new=' .'
                    solNear=self.model.neighbour(sol0)
                    solNearEnergy=model.Energy(solNear,self.emax,self.emin)
                    if (sol0Energy<ebest):
                        new=' !'
                        best,ebest=sol0,sol0Energy
                        sol0=solNear
                    elif (solNearEnergy<sol0Energy):
                        new=' +'
                        sol0,sol0Energy= solNear,solNearEnergy
                        #if (sol0Energy<ebest):
                        #    best,ebest=sol0,sol0Energy
                    elif (self.prob_jump(solNearEnergy,sol0Energy,((float(k)/float(self.kmax)*self.cooling)))): 
                        new=' ?'
                        sol0,sol0Energy= solNear,solNearEnergy  
                        #if (sol0Energy<ebest):
                         #   best,ebest=sol0,sol0Energy
                
                    l=l+new
                    list_energy.append(sol0Energy)
                    if (k>0):
                        if ((k%25)==0):
                            print k,ebest,l 
                        #    d_energy[count_dict]=list_energy
                            l1=list_energy
                            l2=prev_energy
                            # print l1
                            #print l2
                            a12_result=a12(l2,l1)
                            if (a12_result>a12_small):
                                self.kmax =self.kmax +5
                            else :
                               self.kmax=self.kmax -1
                            prev_energy=list_energy
                           # print prev_energy
                            list_energy=[]
                            l='' 
                       #     count_dict=count_dict+1
                            if (k==25):
                                first_energy=prev_energy
                    k=k +1
        final_energy=prev_energy
        print final_energy,first_energy
        x=loss(final_energy,first_energy)


             
        global_variable.loss_inter=x

        
     #   print d_energy[count_dict]
        print "kmax=" , self.kmax  ,"cooling =" ,self.cooling ,"energy_minimum=" , ebest, "best point=" ,best
Example #24
0
    def GeneticAlgorithm_f(self, model, parameters):
        model = self.model

        self.emin, self.emax = self.model.normalise_val()
        self.kmax = parameters[0]
        self.population_Size = parameters[1]
        self.p_crossover = parameters[2]
        self.p_mutation = parameters[3]
        self.frontier_distribution = parameters[4]
        #print self.emin,self.emax
        population_frontier = [
            self.model.candidates(0, False, 0)
            for _ in range(self.population_Size)
        ]

        population_frontier_old = self.calculate_best_frontier(
            population_frontier)
        first_frontier = population_frontier_old
        pop_front_best = population_frontier_old[:]
        #print len(population_frontier_old)
        #print population_frontier_old

        k = 0
        life = 0
        while k < self.kmax:
            i = 0
            children = []
            for i in xrange(self.population_Size):
                parent1, parent2 = self.selectParents(
                    population_frontier_old, len(population_frontier_old))
                child1, child2 = self.crossover(parent1, parent2,
                                                self.p_crossover, model)
                child1 = self.mutate(child1, self.p_mutation, model)
                child2 = self.mutate(child2, self.p_mutation, model)
                if (self.bin_dom(child1, child2)):
                    children.append(child1)
                elif (self.bin_dom(child1, child2)):
                    children.append(child2)
                else:
                    x = random.randint(0, 100)
                    if (x % 2 == 0):
                        children.append(child2)
                    else:
                        children.append(child1)
            population_frontier_new = []
            for can1 in population_frontier:
                flag = True
                for can2 in population_frontier:
                    if (can1 == can2):
                        continue
                    if (self.bin_dom(can1, can2)):
                        flag = False
                        break
                if flag:
                    population_frontier_new.append(can1)
            tmp = []
            new_frontier = False
            for a in population_frontier_new:
                for b in pop_front_best:
                    if self.bin_dom(a, b):
                        tmp.append(a)
                        pop_front_best.remove(b)
            if tmp:
                pop_front_best.extend(tmp)
                new_frontier = True
            if new_frontier:
                life = 0
            else:
                life = life + 1
            if (life == self.lifes):
                break

            population_frontier = children
            population_frontier_old = population_frontier_new

            k = k + 1

    # print population_frontier
    #print first_frontier
        x = loss(population_frontier[0], first_frontier[0])
        global_variable.pop_front_best = pop_front_best
        '''name='Pareto_Fronts/pareto.txt'
        f=open(name,'w')
        i=0
        for i in xrange(len(pop_front_best)):
            k=0
            for j in (self.model.objectives(pop_front_best[i])):
                j=(j - self.emin[k]) / (self.emax[k]- self.emin[k])
                k+=1
                s=str(j)
                f.write(s)
                f.write(" ")
            f.write("\n")
        f.close();

       # hypervol=HyperVolume_wrapper()
        os.remove('./Pareto_Fronts/pareto.txt')'''
        #print hypervol
        return x
batch_size = 128
log_device_placement = False

with tf.Graph().as_default():
    global_step = tf.contrib.framework.get_or_create_global_step()

    # Generating images and its labels
    # build_inputs('cifar10/cifar100', cifar dataset dir, batch size, mode)
    images, labels = cifar_input.build_input(
        'cifar10', '../../cifar/cifar10/data_batch*', batch_size, 'train')

    # Creating graph. NUM_CLASESS=10 (CIFAR-10) or NUM_CLASESS=100 (CIFAR-100)
    logits = inference(images, NUM_CLASSES=10)

    # Loss/Error and Accuracy
    losses = loss(logits, labels)
    accuracies = accuracy(logits, labels)

    # Our train_op (Only minimizing loss)
    train_op = train(losses, global_step, batch_size)

    # SessionRunHook. Logging will be done each x steps.
    class _LoggerHook(tf.train.SessionRunHook):
        def begin(self):
            self._step = -1
            # Creating train_dir if it does not exist and writing to log file
            if not os.path.exists(train_dir):
                os.makedirs(train_dir)
            open(train_dir + 'training_data.csv', 'w').close()
            f = open(train_dir + "log.txt", 'ab')
            f.write('\n\n===============================\n')
Example #26
0
def train_net(args):
    ctx = []
    for ctx_id in [int(x) for x in args.gpus.split(',')]:
        ctx.append(mx.gpu(ctx_id))
    print('gpu num:', len(ctx))
    prefix = args.prefix
    prefix_dir = os.path.dirname(prefix)
    if not os.path.exists(prefix_dir):
        os.makedirs(prefix_dir)
    end_epoch = args.end_epoch
    args.ctx_num = len(ctx)
    args.num_layers = int(args.network[1:])
    print('num_layers', args.num_layers)
    assert args.batch_size % args.ctx_num == 0
    args.per_batch_size = args.batch_size // args.ctx_num
    args.image_channel = 3

    data_dir = args.data_dir
    print('data dir', data_dir)
    path_imgrec = None
    path_imglist = None
    for line in open(os.path.join(data_dir, 'property')):
        vec = line.strip().split(',')
        assert len(vec) == 3
        args.num_classes = int(vec[0])
        image_size = [int(vec[1]), int(vec[2])]
    args.image_h = image_size[0]
    args.image_w = image_size[1]
    print('image_size', image_size)
    assert (args.num_classes > 0)
    print('num_classes', args.num_classes)
    path_imgrec = os.path.join(data_dir, "train.rec")

    print('Called with argument:', args)
    data_shape = (args.image_channel, image_size[0], image_size[1])
    mean = None
    begin_epoch = 0

    #feat_net = fresnet.get(100, 256)
    #margin_block = ArcMarginBlock(args)
    net = TrainBlock(args)
    net.collect_params().reset_ctx(ctx)
    net.hybridize()

    #initializer = mx.init.Xavier(rnd_type='gaussian', factor_type="out", magnitude=2) #resnet style
    #feat_net.initialize(ctx=ctx, init=initializer)
    #feat_net.hybridize()
    #margin_block.initialize(ctx=ctx, init=mx.init.Normal(0.01))
    #margin_block.hybridize()

    ds = FaceDataset(data_shape=(3, 112, 112), path_imgrec=path_imgrec)
    #print(len(ds))
    #img, label = ds[0]
    #print(img.__class__, label.__class__)
    #print(img.shape, label)
    loader = gluon.data.DataLoader(ds,
                                   batch_size=args.batch_size,
                                   shuffle=True,
                                   num_workers=8,
                                   last_batch='discard')

    metric = CompositeEvalMetric([AccMetric()])

    ver_list = []
    ver_name_list = []
    if args.task == '':
        for name in args.eval.split(','):
            path = os.path.join(data_dir, name + ".bin")
            if os.path.exists(path):
                print('loading ver-set:', name)
                data_set = verification.load_bin(path, image_size)
                ver_list.append(data_set)
                ver_name_list.append(name)

    def ver_test(nbatch, tnet):
        results = []
        for i in range(len(ver_list)):
            xnorm, acc, thresh = verification.easytest(
                ver_list[i], tnet, ctx, batch_size=args.batch_size)
            print('[%s][%d]Accuracy-Thresh-XNorm: %.5f - %.5f - %.5f' %
                  (ver_name_list[i], nbatch, acc, thresh, xnorm))
            #print('[%s][%d]Accuracy: %1.5f+-%1.5f' % (ver_name_list[i], nbatch, acc1, std1))
            #print('[%s][%d]Accuracy-Flip: %1.5f+-%1.5f' % (ver_name_list[i], nbatch, acc2, std2))
            results.append(acc)
        return results

    total_time = 0
    num_epochs = 0
    best_acc = [0]
    highest_acc = [0.0, 0.0]  #lfw and target
    global_step = [0]
    save_step = [0]
    lr_steps = [20000, 28000, 32000]
    if args.num_classes >= 20000:
        lr_steps = [100000, 160000, 220000]
    print('lr_steps', lr_steps)

    kv = mx.kv.create('device')
    trainer = gluon.Trainer(net.collect_params(),
                            'sgd', {
                                'learning_rate': args.lr,
                                'wd': args.wd,
                                'momentum': args.mom,
                                'multi_precision': True
                            },
                            kvstore=kv)

    def _batch_callback():
        mbatch = global_step[0]
        global_step[0] += 1
        for _lr in lr_steps:
            if mbatch == _lr:
                args.lr *= 0.1
                if args.mode == 'gluon':
                    trainer.set_learning_rate(args.lr)
                else:
                    opt.lr = args.lr
                print('lr change to', args.lr)
                break

        #_cb(param)
        if mbatch % 1000 == 0:
            print('lr-batch-epoch:', args.lr, mbatch)

        if mbatch > 0 and mbatch % args.verbose == 0:
            save_step[0] += 1
            msave = save_step[0]
            do_save = False
            is_highest = False
            tnet = TestBlock(args, params=net.collect_params())
            tnet.hybridize()
            acc_list = ver_test(mbatch, tnet)
            if len(acc_list) > 0:
                lfw_score = acc_list[0]
                if lfw_score > highest_acc[0]:
                    highest_acc[0] = lfw_score
                if acc_list[-1] >= highest_acc[-1]:
                    highest_acc[-1] = acc_list[-1]
            if args.ckpt == 0:
                do_save = False
            elif args.ckpt == 1:
                do_save = True
                msave = 1
            elif args.ckpt > 1:
                do_save = True
            if do_save:
                print('saving', msave)
                #print('saving gluon params')
                fname = args.prefix + "-gluon.params"
                tnet.save_parameters(fname)
                tnet.export(args.prefix, msave)
                #arg, aux = model.get_params()
                #mx.model.save_checkpoint(prefix, msave, model.symbol, arg, aux)
            print('[%d]Accuracy-Highest: %1.5f' % (mbatch, highest_acc[-1]))
        if args.max_steps > 0 and mbatch > args.max_steps:
            sys.exit(0)

    loss_weight = 1.0
    #loss = gluon.loss.SoftmaxCrossEntropyLoss(weight = loss_weight)
    #loss = nd.SoftmaxOutput
    loss = gluon.loss.SoftmaxCrossEntropyLoss()
    while True:
        #trainer = update_learning_rate(opt.lr, trainer, epoch, opt.lr_factor, lr_steps)
        tic = time.time()
        #train_iter.reset()
        metric.reset()
        btic = time.time()
        #for i, batch in enumerate(train_iter):
        for batch_idx, (x, y) in enumerate(loader):
            #print(x.shape, y.shape)
            _batch_callback()
            #data = gluon.utils.split_and_load(batch.data[0].astype(opt.dtype), ctx_list=ctx, batch_axis=0)
            #label = gluon.utils.split_and_load(batch.label[0].astype(opt.dtype), ctx_list=ctx, batch_axis=0)
            data = gluon.utils.split_and_load(x, ctx_list=ctx, batch_axis=0)
            label = gluon.utils.split_and_load(y, ctx_list=ctx, batch_axis=0)
            outputs = []
            losses = []
            with ag.record():
                for _data, _label in zip(data, label):
                    #print(y.asnumpy())
                    fc7 = net(_data, _label)
                    #print(z[0].shape, z[1].shape)
                    losses.append(loss(fc7, _label))
                    outputs.append(fc7)
            for l in losses:
                l.backward()
            #trainer.step(batch.data[0].shape[0], ignore_stale_grad=True)
            #trainer.step(args.ctx_num)
            n = x.shape[0]
            #print(n,n)
            trainer.step(n)
            metric.update(label, outputs)
            i = batch_idx
            if i > 0 and i % 20 == 0:
                name, acc = metric.get()
                if len(name) == 2:
                    logger.info(
                        'Epoch[%d] Batch [%d]\tSpeed: %f samples/sec\t%s=%f, %s=%f'
                        % (num_epochs, i, args.batch_size /
                           (time.time() - btic), name[0], acc[0], name[1],
                           acc[1]))
                else:
                    logger.info(
                        'Epoch[%d] Batch [%d]\tSpeed: %f samples/sec\t%s=%f' %
                        (num_epochs, i, args.batch_size /
                         (time.time() - btic), name[0], acc[0]))
                #metric.reset()
            btic = time.time()

        epoch_time = time.time() - tic

        # First epoch will usually be much slower than the subsequent epics,
        # so don't factor into the average
        if num_epochs > 0:
            total_time = total_time + epoch_time

        #name, acc = metric.get()
        #logger.info('[Epoch %d] training: %s=%f, %s=%f'%(num_epochs, name[0], acc[0], name[1], acc[1]))
        logger.info('[Epoch %d] time cost: %f' % (num_epochs, epoch_time))
        num_epochs = num_epochs + 1
        #name, val_acc = test(ctx, val_data)
        #logger.info('[Epoch %d] validation: %s=%f, %s=%f'%(epoch, name[0], val_acc[0], name[1], val_acc[1]))

        # save model if meet requirements
        #save_checkpoint(epoch, val_acc[0], best_acc)
    if num_epochs > 1:
        print('Average epoch time: {}'.format(
            float(total_time) / (num_epochs - 1)))
Example #27
0
def train_eval(p_dict, phase='train'):
    ### 传入参数
    epoch = p_dict['epoch']
    model = p_dict['model']  # 模型
    loss = p_dict['loss']  # loss 函数
    if phase == 'train':
        data_loader = p_dict['train_loader']  # 训练数据
        optimizer = p_dict['optimizer']  # 优化器
    else:
        data_loader = p_dict['val_loader']

    ### 局部变量定义
    classification_metric_dict = dict()
    # if args.task == 'case1':

    for i, data in enumerate(tqdm(data_loader)):
        if args.use_visit:
            if args.gpu:
                data = [Variable(x.cuda()) for x in data]
            visits, values, mask, master, labels, times, trends = data
            if i == 0:
                print 'input size', visits.size()
            output = model(visits, master, mask, times, phase, values, trends)
        else:
            inputs = Variable(data[0].cuda())
            labels = Variable(data[1].cuda())
            output = model(inputs)

        # if 0:
        if args.task == 'task2':
            output, mask, time = output
            labels = labels.unsqueeze(-1).expand(output.size()).contiguous()
            labels[mask == 0] = -1
        else:
            time = None

        classification_loss_output = loss(output, labels, args.hard_mining)
        loss_gradient = classification_loss_output[0]
        # 计算性能指标
        function.compute_metric(output, labels, time,
                                classification_loss_output,
                                classification_metric_dict, phase)

        # print(outputs.size(), labels.size(),data[3].size(),segment_line_output.size())
        # print('detection', detect_character_labels.size(), detect_character_output.size())
        # return

        # 训练阶段
        if phase == 'train':
            optimizer.zero_grad()
            loss_gradient.backward()
            optimizer.step()

        # if i >= 10:
        #     break

    print('\nEpoch: {:d} \t Phase: {:s} \n'.format(epoch, phase))
    metric = function.print_metric('classification',
                                   classification_metric_dict, phase)
    if args.phase != 'train':
        print 'metric = ', metric
        print
        print
        return
    if phase == 'val':
        if metric > p_dict['best_metric'][0]:
            p_dict['best_metric'] = [metric, epoch]
            function.save_model(p_dict)
            if 0:
                # if args.task == 'task2':
                preds = classification_metric_dict['preds']
                labels = classification_metric_dict['labels']
                times = classification_metric_dict['times']
                fl = open('../result/tauc_label.csv', 'w')
                fr = open('../result/tauc_result.csv', 'w')
                fl.write('adm_id,last_event_time,mortality\n')
                fr.write('adm_id,probability\n')
                for i, (p, l, t) in enumerate(zip(preds, labels, times)):
                    if i % 30:
                        continue
                    fl.write(str(i) + ',')
                    fl.write(str(t) + ',')
                    fl.write(str(int(l)) + '\n')

                    fr.write(str(i) + ',')
                    fr.write(str(p) + '\n')

        print('valid: metric: {:3.4f}\t epoch: {:d}\n'.format(metric, epoch))
        print('\t\t\t valid: best_metric: {:3.4f}\t epoch: {:d}\n'.format(
            p_dict['best_metric'][0], p_dict['best_metric'][1]))
    else:
        print('train: metric: {:3.4f}\t epoch: {:d}\n'.format(metric, epoch))
Example #28
0
def train_ssd():
    trn_id_fname, trn_id_annotation, trn_id_single_anno, idx_category, category_idx, imgs, imgs_id, imgs_bbox, imgs_class = (
        get_anno_data())
    config = Config("remote")

    test_dataset = VOC_dataset(config.voc2007_root, config.voc2012_root,
                               config.voc2007_test_anno, "test")
    trn_dataset = VOC_dataset(config.voc2007_root, config.voc2012_root,
                              config.anno_path, "trn")
    test_dataloader = DataLoader(
        test_dataset,
        batch_size=1,
        shuffle=False,
        num_workers=8,
        collate_fn=detection_collate_fn,
    )
    trn_dataloader = DataLoader(
        trn_dataset,
        batch_size=32,
        shuffle=True,
        num_workers=8,
        collate_fn=detection_collate_fn,
    )

    ssd_model = get_SSD_model(1, config.vgg_weight_path,
                              config.vgg_reduced_weight_path)

    use_cuda = torch.cuda.is_available()
    device = torch.device("cuda:0" if use_cuda else "cpu")
    ssd_model = ssd_model.to(device)

    prior_box = get_prior_box()
    # prior_box = prior_box.to(device)

    loss_array = []
    val_array = []

    print("success build ssd model to train")
    optimizer = torch.optim.SGD(ssd_model.parameters(),
                                lr=1e-3,
                                momentum=0.9,
                                weight_decay=5 * 1e-4)
    lr_scheduler = optim.lr_scheduler.LambdaLR(optimizer, adjust_lr)

    for epoch in range(120):
        lr_scheduler.step()

        # train
        for i, batch in enumerate(trn_dataloader):
            imgs, bboxes, labels, img_id, ignores, img_scale = batch
            # bboxes, labels, img_id, ignores, img_scale = bboxes[0], labels[0], img_id[0], ignores[0], img_scale[0]
            imgs = imgs.to(device)
            # bboxes = bboxes.to(device)
            cls_preds, loc_preds = ssd_model(imgs)

            ssd_model.zero_grad()
            total_loss = 0
            total_loc_loss, total_cls_loss = 0, 0

            for idx in range(imgs.shape[0]):

                img, bbox, label = imgs[idx], bboxes[idx], labels[idx]
                cls_pred, loc_pred = cls_preds[idx], loc_preds[idx]
                iou = get_iou(bbox, prior_box)

                pos_mask, cls_target, bbox_target = get_target(
                    iou, prior_box, img, bbox, label)
                pos_mask, cls_target, bbox_target = (
                    pos_mask.to(device),
                    cls_target.to(device),
                    bbox_target.to(device),
                )

                loss_loc, loss_cls = loss(cls_pred, loc_pred, pos_mask,
                                          cls_target, bbox_target)
                total_loc_loss += loss_loc
                total_cls_loss += loss_cls

                total_loss += loss_cls + loss_loc

            total_loss /= float(imgs.shape[0])
            total_cls_loss /= float(imgs.shape[0])
            total_loc_loss /= float(imgs.shape[0])

            total_loss.backward()
            optimizer.step()

            cls_loss = round(float(total_cls_loss), 3)
            loc_loss = round(float(total_loc_loss), 3)
            t_loss = round(float(total_loss), 3)
            if i % 5 == 0:
                print(
                    epoch * 515 + i,
                    "cls_loss: {}, loc_loss: {}, loss: {}".format(
                        cls_loss, loc_loss, t_loss),
                )
            loss_array.append(t_loss)

        # val and save every 5 epoch
        if epoch % 5 == 0:
            torch.save(ssd_model.state_dict(), "f_trained_{}_epoch".format(i))
            print("val--------------------------")
            for val_i, batch in enumerate(test_dataloader):
                imgs, bboxes, labels, img_id, ignores, img_scale = batch
                imgs = imgs.to(device)
                cls_preds, loc_preds = ssd_model(imgs)

                total_loss = 0
                total_loc_loss, total_cls_loss = 0, 0

                for idx in range(imgs.shape[0]):
                    img, bbox, label = imgs[idx], bboxes[idx], labels[idx]
                    cls_pred, loc_pred = cls_preds[idx], loc_preds[idx]
                    iou = get_iou(bbox, prior_box)

                    pos_mask, cls_target, bbox_target = get_target(
                        iou, prior_box, img, bbox, label)
                    pos_mask, cls_target, bbox_target = (
                        pos_mask.to(device),
                        cls_target.to(device),
                        bbox_target.to(device),
                    )

                    loss_loc, loss_cls = loss(cls_pred, loc_pred, pos_mask,
                                              cls_target, bbox_target)
                    total_loc_loss += loss_loc
                    total_cls_loss += loss_cls

                    total_loss += loss_cls + loss_loc

                total_loss /= float(imgs.shape[0])
                total_cls_loss /= float(imgs.shape[0])
                total_loc_loss /= float(imgs.shape[0])
                cls_loss = round(float(total_cls_loss), 3)

                loc_loss = round(float(total_loc_loss), 3)
                t_loss = round(float(total_loss), 3)
                if val_i % 100 == 0:
                    print(
                        val_i,
                        "cls_loss: {}, loc_loss: {}, loss: {}".format(
                            cls_loss, loc_loss, t_loss),
                    )
                val_array.append(t_loss)

            # valdiate the mAP
            print("mAP")
            mean_average_precision = mAP(config.voc2007_test_anno)
            for i, batch in tqdm_notebook(enumerate(test_dataloader)):
                imgs, bboxes, labels, img_id, ignores, img_scale = batch
                bboxes, labels, img_id, ignores, img_scale = (
                    bboxes[0],
                    labels[0],
                    img_id[0],
                    ignores[0],
                    img_scale[0],
                )
                imgs = imgs.to(device)
                cls_preds, loc_preds = ssd_model(imgs)

                res_score, res_bbox, res_cls = mean_average_precision.nms(
                    cls_preds, loc_preds, prior_box, conf_threshold=0.01)

                for _ in range(len(bboxes)):
                    bboxes[_][1] *= 300
                    bboxes[_][3] *= 300
                    bboxes[_][0] *= 300
                    bboxes[_][2] *= 300
                for _ in range(len(bboxes)):
                    mean_average_precision.add_single_gt(
                        img_id, bboxes[_], labels[_], ignores[_])

                for _ in range(len(res_score)):
                    mean_average_precision.add_single_pred(
                        img_id,
                        res_score[_].cpu().detach().numpy(),
                        res_bbox[_].cpu().detach().numpy(),
                        res_cls[_],
                    )
            res = mean_average_precision.calculate_mAP()

            # save loss array and map to log
            with open("res.json", "a") as f:
                json.dump({"epoch": epoch, "loss": loss_array, "map": res}, f)
                f.write("\n")
            print("mAP: ", np.mean([res[k] for k in res.keys()]))
            print("finish val--------------------------")
    def DifferentialEvolution_f(self, model):
        self.emin, self.emax = model.normalise_val()
        model = self.model
        re = ""
        frontier = [model.candidates(0, False, 0) for _ in range(self.max_changes)]
        best_energy = model.Energy(frontier[0], self.emax, self.emin)
        best_solution = frontier[0]
        k = 0
        list_energy = []
        a12_small = 0.56
        prev_energy = [0 for _ in range(21)]
        while k < self.kmax:
            re = ""

            if best_energy == self.threshold:
                break

            for i, solution in enumerate(frontier):
                seen = []
                while len(seen) < 3:
                    rand_index = random.randint(0, 99)
                    if rand_index == i:
                        continue
                    if rand_index not in seen:
                        seen.append(rand_index)
                mutation = frontier[seen[0]]
                current_energy = model.Energy(solution, self.emax, self.emin)
                append = " ."
                if self.crossover < random.random():
                    if model.Energy(mutation, self.emax, self.emin) < current_energy:
                        current_energy = model.Energy(mutation, self.emax, self.emin)
                        frontier[i] = mutation
                        append = " +"

                else:
                    mutation = []
                    for j in xrange(model.n):
                        l = model.lo[j]
                        m = model.hi[j]
                        inter = frontier[seen[0]][j] + self.f * (frontier[seen[1]][j] - frontier[seen[2]][j])
                        if inter >= l and inter <= m:
                            mutation.append(inter)
                        else:
                            mutation.append(frontier[seen[random.randint(0, 2)]][j])

                    if model.ok(mutation) and model.Energy(mutation, self.emax, self.emin) < current_energy:
                        frontier[i] = mutation
                        current_energy = model.Energy(mutation, self.emax, self.emin)
                        append = " +"

                if current_energy < best_energy and current_energy >= self.threshold:
                    append = " ?"
                    best_energy = current_energy
                    best_solution = frontier[i]
                list_energy.append(current_energy)
                re = re + append
                k += 1
                if k > 0:
                    if k == 25:
                        first_energy = prev_energy
                    if k % 25 is 0:
                        print k, best_energy, re
                        re = ""

                        l1 = list_energy
                        l2 = prev_energy
                        # print l1,l2
                        # print l1
                        # print l2
                        a12_result = a12(l1, l2)
                        # print a12_result
                        if a12_result > a12_small:
                            k = k + 5
                        else:
                            k = k - 1
                        prev_energy = list_energy
                        list_energy = []
                        l = ""

        final_energy = prev_energy
        x = loss(final_energy, first_energy)

        global_variable.loss_inter = x

        print ("\nBest Solution : " + str(best_solution))
        print ("Best Energy : " + str((model.Energy(best_solution, self.emax, self.emin))))
Example #30
0
def train(
        image_width,
        dim_x,
        dim_z,
        encoder_type,
        decoder,
        dataset,
        learning_rate=0.0001,
        optimizer=tf.train.AdamOptimizer,
        loss=elbo_loss,
        batch_size=100,
        results_dir='results',
        max_epochs=10,
        n_view=10,
        results_file=None,
        bn=False,
        **kwargs
        ):
    saved_variables = kwargs.pop('saved_variables', None)
    anneal_lr = kwargs.pop('anneal_lr', False)
    learning_rate_temperature = kwargs.pop('learning_rate_temperature', None)
    global_step = tf.Variable(0, trainable=False) # for checkpoint saving
    on_epoch = tf.placeholder(tf.float32, name='on_epoch')
    dt = datetime.datetime.now()
    results_file = results_file if results_file is not None else '/{}_{:02d}-{:02d}-{:02d}'.format(dt.date(), dt.hour, dt.minute, dt.second)
    results_dir += results_file
    os.mkdir(results_dir)

    # Get all the settings and save them.
    with open(results_dir + '/settings.txt', 'w') as f:
        args = inspect.getargspec(train).args
        settings = [locals()[arg] for arg in args]
        for s, arg in zip(settings, args):
            setting = '{}: {}'.format(arg, s)
            f.write('{}\n'.format(setting))
            print(setting)
        settings = locals()[inspect.getargspec(train).keywords]
        for kw, val in settings.items():
            setting = '{}: {}'.format(kw, val)
            f.write('{}\n'.format(setting))
            print(setting)

    # Make the neural neural_networks
    is_training = tf.placeholder(tf.bool)
    if bn:
        encoder_net = lambda x: nn(x, enc_dims, name='encoder', act=tf.nn.tanh, is_training=is_training)
    else:
        encoder_net = lambda x: nn(x, enc_dims, name='encoder', act=tf.nn.tanh, is_training=None)
    encoder = encoder_type(encoder_net, dim_z, flow)

    # Build computation graph and operations
    x = tf.placeholder(tf.float32, [None, dim_x], 'x')
    x_w = tf.placeholder(tf.float32, [None, dim_x], 'x_w')
    e = tf.placeholder(tf.float32, (None, dim_z), 'noise')

    z_params, z = encoder(x_w, e)
    x_pred = decoder(z)
    kl_weighting = 1.0 - tf.exp(-on_epoch / kl_annealing_rate) if kl_annealing_rate is not None else 1
    monitor_functions = loss(x_pred, x, kl_weighting=kl_weighting, **z_params)
    monitor_functions_sorted = sorted(monitor_functions.iteritems(), key=lambda x: x[0])
    monitor_output_train = {name: [] for name in monitor_functions.iterkeys()}
    monitor_output_valid = {name: [] for name in monitor_functions.iterkeys()}
    monitor_function_names = [p[0] for p in monitor_functions_sorted]
    monitor_function_list = [p[1] for p in monitor_functions_sorted]

    train_loss, valid_loss = monitor_functions['train_loss'], monitor_functions['valid_loss']

    out_op = x_pred

    # Batch normalization stuff
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    if update_ops:
        updates = tf.group(*update_ops)
        train_loss = control_flow_ops.with_dependencies([updates], train_loss)

    # Optimizer with gradient clipping
    lr = tf.Variable(learning_rate)
    optimizer = optimizer(lr)
    gvs = optimizer.compute_gradients(train_loss)
    capped_gvs = [(tf.clip_by_norm(grad, 1), var) if grad is not None else (grad, var)
                  for grad, var in gvs]
    train_op = optimizer.apply_gradients(capped_gvs)

    # Make training and validation sets
    training_data, validation_data = dataset['train'], dataset['valid']
    n_train_batches, n_valid_batches = training_data.images.shape[0] / batch_size, validation_data.images.shape[0] / batch_size,
    print 'Loaded training and validation data'
    visualized, e_visualized = validation_data.images[:n_view], np.random.normal(0, 1, (n_view, dim_z))

    # Make summaries
    rec_summary = tf.image_summary("rec", vec2im(out_op, batch_size, image_width), max_images=10)
    for fn_name, fn in monitor_functions.items():
        tf.scalar_summary(fn_name, fn)
    summary_op = tf.merge_all_summaries()

    # Create a saver.
    saver = tf.train.Saver(tf.all_variables())

    # Create a session
    sess = tf.InteractiveSession()
    sess.run(tf.initialize_all_variables())

    # Use pre-trained weight values
    if saved_variables is not None:
        restore.set_variables(sess, saved_variables)

    summary_writer = tf.train.SummaryWriter(results_dir, sess.graph)
    samples_list = []
    batch_counter = 0
    best_validation_loss = 1e100
    number_of_validation_failures = 0
    feed_dict = {}
    validation_losses, training_losses = [], []
    for epoch in range(max_epochs):
        feed_dict[on_epoch] = epoch
        start_time = time.time()
        l_t = 0
        monitor_output_epoch = {name: 0 for name in monitor_function_names}
        for _ in xrange(n_train_batches):
            batch_counter += 1
            feed_dict[x], feed_dict[x_w] = training_data.next_batch(batch_size, whitened=False)
            feed_dict[e] = np.random.normal(0, 1, (batch_size, dim_z))
            feed_dict[is_training] = True
            output = sess.run([train_op, train_loss] + monitor_function_list, feed_dict=feed_dict)
            l, monitor_output_batch = output[1], output[2:]

            for name, out in zip(monitor_function_names, monitor_output_batch):
                monitor_output_epoch[name] += out

            if batch_counter % 100 == 0:
                summary_str = sess.run(summary_op, feed_dict=feed_dict)
                summary_writer.add_summary(summary_str, batch_counter)

            # Save the model checkpoint periodically.
            if batch_counter % 1000 == 0 or epoch == max_epochs:
                checkpoint_path = os.path.join(results_dir, 'model.ckpt')
                saver.save(sess, checkpoint_path, global_step=global_step)
            l_t += l
        l_t /= n_train_batches

        for name in monitor_function_names:
            monitor_output_train[name].append(monitor_output_epoch[name] / n_train_batches)

        training_losses.append(l_t)

        # Validation loop
        l_v = 0
        monitor_output_epoch = {name: 0 for name in monitor_function_names}
        for _ in range(n_valid_batches):
            feed_dict[x], feed_dict[x_w] = validation_data.next_batch(batch_size, whitened=False)
            feed_dict[e] = np.random.normal(0, 1, (batch_size, dim_z))
            feed_dict[is_training] = False
            output = sess.run([valid_loss] + monitor_function_list, feed_dict=feed_dict)
            l_v_batched, monitor_output_batch = output[0], output[1:]
            for name, out in zip(monitor_function_names, monitor_output_batch):
                monitor_output_epoch[name] += out
            l_v += l_v_batched

        l_v /= n_valid_batches
        for name in monitor_function_names:
            monitor_output_valid[name].append(monitor_output_epoch[name] / n_valid_batches)

        validation_losses.append(l_v)
        duration = time.time() - start_time
        examples_per_sec = (n_valid_batches + n_train_batches) * batch_size * 1.0 / duration
        print('Epoch: {:d}\t Weighted training loss: {:.2f}, Validation loss {:.2f} ({:.1f} examples/sec, {:.1f} sec/epoch)'.format(epoch, l, l_v, examples_per_sec, duration))

        samples = sess.run([out_op], feed_dict={x: visualized, x_w: visualized, e: e_visualized, is_training: False})
        samples = np.reshape(samples, (n_view, image_width, image_width))
        samples_list.append(samples)
        # show_samples(samples, image_width)

        # Learning rate annealing
        lr = lr / (1.0 + epoch * 1.0 / learning_rate_temperature) if learning_rate_temperature is not None else lr

        if epoch % 100 == 0:
            np.save(results_dir + '/validation_losses_{}.npy'.format(epoch), validation_losses)
            np.save(results_dir + '/training_losses_{}.npy'.format(epoch), training_losses)
            np.save(results_dir + '/sample_visualizations_{}.npy'.format(epoch), np.array(samples_list))
            np.save(results_dir + '/real_visualizations_{}.npy'.format(epoch), np.reshape(visualized, (n_view,image_width, image_width)))
            for name in monitor_function_names:
                np.save(results_dir + '/{}_valid_{}.npy'.format(name, epoch), monitor_output_valid[name])
                np.save(results_dir + '/{}_train_{}.npy'.format(name, epoch), monitor_output_train[name])

    np.save(results_dir + '/validation_losses.npy', validation_losses)
    np.save(results_dir + '/training_losses.npy', training_losses)
    np.save(results_dir + '/sample_visualizations.npy', np.array(samples_list))
    np.save(results_dir + '/real_visualizations.npy', np.reshape(visualized, (n_view,image_width, image_width)))
    for name in monitor_function_names:
        np.save(results_dir + '/{}_valid.npy'.format(name), monitor_output_valid[name])
        np.save(results_dir + '/{}_train.npy'.format(name), monitor_output_train[name])

    visualize = False
    if visualize:
        for samples in samples_list:
            together = np.hstack((np.reshape(visualized, (n_view,image_width, image_width)), samples > 0.5))
            plot_images_together(together)

    sess.close()
Example #31
0
                     tf.reverse(input_image, [3]),
                     collections=['train'])
    tf.summary.image('input_image',
                     tf.reverse(input_image, [3]),
                     collections=['test'])
    tf.summary.image(
        'predictions',
        tf.expand_dims(tf.cast(fcn_vgg.pred_up, tf.uint8), -1),
        collections=[
            'test'
        ])  # display the predictions for the test image at index 'test_iter-1'

# define loss
with tf.name_scope('Loss'):
    weights = tf.cast(gt_label != ignore_label, dtype=tf.float32)
    unnormalized_loss = loss(fcn_vgg.upscore, gt_label_onehot, num_classes,
                             weights)
    batch_loss, update_op_batchloss, reset_op_batchloss = streamingLoss(
        unnormalized_loss)

    # scalar summary
    tf.summary.scalar("loss", batch_loss, collections=['loss'])

# define accuracy
# Note: tf.metrics are inherently tricky due to their streaming properties, see https://github.com/tensorflow/tensorflow/issues/9498
with tf.variable_scope('Metrics'):
    # confusion matrix
    confusion_matrix, update_op_confmat = streamingConfusionMatrix(
        gt_label, fcn_vgg.pred_up, num_classes)
    tf.summary.image('confusion_matrix',
                     tf.reshape(tf.cast(confusion_matrix, tf.float32),
                                [1, num_classes, num_classes, 1]),
Example #32
0
def read_config(filename, verbose=False):
    """
    Takes filename of config file and runs

    1) Training of network with data as requested (printing real time loss)
    2) Testing
    3) Print test metrics

    """

    config = configparser.ConfigParser()
    config.read(filename)

    net = get_net(config['LAYERS'])
    loss, reg, num_epochs, batch_size, validation, optimization_method, optimization_params = get_training_vars(
        config['TRAIN'])
    data_train, labels_train, data_test, labels_test, size, type = get_data(
        config['DATA'])

    print("Samples of the training data")
    if type == "2D":
        plot_data(data_test[:, 0:labels_test.shape[0]])
    elif type == "1D":
        plt.imshow(data_train)
        plt.show()

    print("Epoch nr | Loss")

    train(net,
          inputs=data_train,
          targets=labels_train,
          num_epochs=num_epochs,
          batch_size=batch_size,
          loss=loss(),
          optimizer=Optimizer(optimization_method, optimization_params),
          regularizer=reg,
          validation=validation,
          verbose=verbose)

    if type == "2D":
        compare_test(net, data_test, labels_test)

        def plot_prediction(i):
            labels = {
                0: "cross",
                1: "circle",
                2: "triangle",
                3: "square",
                4: "pentagon"
            }
            pred = net.forward(data_test)
            print(pred.shape)

            pred_label = np.where(pred[:, i] == np.max(pred[:, i]))[0][0]
            plot_title = labels[int(pred_label)] + " prob : " + str(
                round(np.max(pred[:, i]), 2))
            plt.title(plot_title)
            plt.imshow(data_test[:, i].reshape(size, size), cmap="Greys")

            plot_img_derivative(net, loss(), data_test[:, i], labels_test[:,
                                                                          i])
            plt.colorbar()

            plt.show()

        return plot_prediction, net

    elif type == "1D":
        plt.figure()
        pred = net.forward(data_test)
        x = np.arange(0, len(labels_test[0]))
        plt.title("Error of 1D prediction")
        plt.plot(x, labels_test[0] - pred[0], '.')
        plt.show()
Example #33
0
def train(opt):
    # Init Model
    generator = Generator().cuda()
    # generator.load_state_dict(torch.load('checkpoint.pt'))
    discriminator = Discriminator().cuda()
    discriminator.train()

    # Load Dataset
    train_dataset = MNISTDataset('train')
    train_data_loader = MNISTDataloader('train', opt, train_dataset)

    # test_dataset = MNISTDataset('test')
    # test_data_loader = MNISTDataloader('test', opt, test_dataset)

    # Set Optimizer
    optim_gen = torch.optim.Adam(generator.parameters(), lr=0.0002)
    optim_dis = torch.optim.Adam(discriminator.parameters(), lr=0.0002)

    # Set Loss
    loss = Loss().cuda()

    writer = SummaryWriter()

    for epoch in range(opt.epoch):
        for i in range(len(train_data_loader.data_loader)):
            step = epoch * len(train_data_loader.data_loader) + i + 1
            # load dataset only batch_size
            image, label = train_data_loader.next_batch()

            batch_size = image.shape[0] // 2
            real_rand = np.random.random(batch_size)
            batch_l = image[:batch_size, :, :, :]
            batch_r = image[batch_size:, :, :, :]
            image = torch.cat((batch_l, batch_r), dim=3).cuda()
            label[:batch_size][real_rand < 0.5] = 10
            label[batch_size:][real_rand >= 0.5] = 10
            label = label.unsqueeze(1)
            real_label = torch.cat(
                (label[:batch_size, :], label[batch_size:, :]), dim=1).cuda()

            # train generator
            generator.train()
            optim_gen.zero_grad()

            noise = Variable(torch.randn(batch_size, 100).cuda())
            fake_label = Variable(
                torch.LongTensor(torch.randint(10, (batch_size, 2))).cuda())
            fake_rand = np.random.random(batch_size)
            fake_label[fake_rand < 0.5, 0] = 10
            fake_label[fake_rand >= 0.5, 1] = 10
            gen = generator(noise, fake_label)
            validity = discriminator(gen, fake_label)
            loss_gen_l = loss(validity[fake_rand < 0.5, 0],
                              torch.ones(batch_size)[fake_rand < 0.5].cuda())
            loss_gen_r = loss(validity[fake_rand >= 0.5, 1],
                              torch.ones(batch_size)[fake_rand >= 0.5].cuda())

            loss_gen_l.backward(retain_graph=True)
            loss_gen_r.backward()
            loss_gen = loss_gen_l + loss_gen_r
            optim_gen.step()

            # train discriminator
            optim_dis.zero_grad()

            validity_real = discriminator(image, real_label)
            loss_dis_real_l = loss(
                validity_real[real_rand < 0.5, 0],
                torch.ones(batch_size)[real_rand < 0.5].cuda())
            loss_dis_real_r = loss(
                validity_real[real_rand >= 0.5, 1],
                torch.ones(batch_size)[real_rand >= 0.5].cuda())

            validity_fake = discriminator(gen.detach(), fake_label)
            loss_dis_fake_l = loss(
                validity_fake[fake_rand < 0.5, 0],
                torch.zeros(batch_size)[fake_rand < 0.5].cuda())
            loss_dis_fake_r = loss(
                validity_fake[fake_rand >= 0.5, 1],
                torch.zeros(batch_size)[fake_rand >= 0.5].cuda())

            loss_dis_l = (loss_dis_real_l + loss_dis_fake_l) / 2
            loss_dis_r = (loss_dis_real_r + loss_dis_fake_r) / 2
            loss_dis_l.backward(retain_graph=True)
            loss_dis_r.backward()
            loss_dis = loss_dis_l + loss_dis_r
            optim_dis.step()

            writer.add_scalar('loss/gen', loss_gen, step)
            writer.add_scalar('loss/dis', loss_dis, step)

            if step % opt.display_step == 0:
                writer.add_images('image', image[0][0], step, dataformats="HW")
                writer.add_images('result', gen[0][0], step, dataformats="HW")

                print('[Epoch {}] G_loss : {:.2} | D_loss : {:.2}'.format(
                    epoch + 1, loss_gen, loss_dis))

                generator.eval()
                noise = torch.randn(9, 100).cuda()
                label = torch.LongTensor(torch.randint(10, (9, 2))).cuda()
                sample_images = generator(noise, label)
                grid = make_grid(sample_images, nrow=3, normalize=True)
                writer.add_image('sample_image', grid, step)

                torch.save(generator.state_dict(), 'checkpoint.pt')
Example #34
0
 def f(theta):
     return loss(theta, self.x, self.y)
Example #35
0
def train(opt):
    # Init Modeil
    generator = Generator().cuda()
    discriminator = Discriminator().cuda()
    discriminator.train()

    # Load Dataset
    train_dataset = MNISTDataset('train')
    train_data_loader = MNISTDataloader('train', opt, train_dataset)

    # Set Optimizer
    optim_gen = torch.optim.Adam(generator.parameters(), lr=0.0001)
    optim_dis = torch.optim.Adam(discriminator.parameters(), lr=0.0001)

    # Set Loss
    loss = Loss()

    writer = SummaryWriter()

    for epoch in range(opt.epoch):
        for i in range(len(train_data_loader.data_loader)):
            step = epoch * len(train_data_loader.data_loader) + i + 1
            # load dataset only batch_size
            image, label = train_data_loader.next_batch()
            image = image.cuda()

            # train generator
            generator.train()
            optim_gen.zero_grad()

            noise = Variable(torch.randn(opt.batch_size, 100)).cuda()

            gen = generator(noise)
            validity = discriminator(gen)
            loss_gen = loss(validity, torch.ones(opt.batch_size, 1).cuda())
            loss_gen.backward()
            optim_gen.step()

            # train discriminator
            optim_dis.zero_grad()

            validity_real = discriminator(image)
            loss_dis_real = loss(
                validity_real,
                Variable(torch.ones(opt.batch_size, 1)).cuda())

            validity_fake = discriminator(gen.detach())
            loss_dis_fake = loss(
                validity_fake,
                Variable(torch.zeros(opt.batch_size, 1)).cuda())

            loss_dis = loss_dis_real + loss_dis_fake
            loss_dis.backward()
            optim_dis.step()

            loss_tot = loss_gen + loss_dis

            writer.add_scalar('loss/total', loss_tot, step)
            writer.add_scalar('loss/gen', loss_gen, step)
            writer.add_scalar('loss/dis', loss_dis, step)
            writer.add_scalar('loss/dis_real', loss_dis_real, step)
            writer.add_scalar('loss/dis_fake', loss_dis_fake, step)

            if step % opt.display_step == 0:
                writer.add_images('image', image[0][0], step, dataformats="HW")
                writer.add_images('result', gen[0][0], step, dataformats="HW")

                print(
                    '[Epoch {}] Total : {:.2} | G_loss : {:.2} | D_loss : {:.2}'
                    .format(epoch + 1, loss_gen + loss_dis, loss_gen,
                            loss_dis))

                generator.eval()
                z = Variable(torch.randn(10, 100)).cuda()
                sample_images = generator(z)
                grid = make_grid(sample_images, nrow=5, normalize=True)
                writer.add_image('sample_image', grid, step)

                torch.save(generator.state_dict(), 'checkpoint.pt')
Example #36
0
    def GeneticAlgorithm_f(self,model,parameters):
        model=self.model

        self.emin,self.emax=self.model.normalise_val()
        self.kmax = parameters[0]
        self.population_Size = parameters[1]
        self.p_crossover=parameters[2]
        self.p_mutation=parameters[3]
        self.frontier_distribution=parameters[4]
        #print self.emin,self.emax
        population_frontier=[self.model.candidates(0,False,0) for _ in range(self.population_Size)]

        population_frontier_old=self.calculate_best_frontier(population_frontier)
        first_frontier=population_frontier_old
        pop_front_best=population_frontier_old[:]
        #print len(population_frontier_old)
        #print population_frontier_old

        k=0
        life=0
        while k<self.kmax :
            i=0
            children=[]
            for i in xrange(self.population_Size):
                parent1,parent2= self.selectParents(population_frontier_old,len(population_frontier_old))
                child1,child2=self.crossover(parent1, parent2,self.p_crossover,model)
                child1=self.mutate(child1,self.p_mutation,model)
                child2=self.mutate(child2,self.p_mutation,model)
                if(self.bin_dom(child1,child2)):
                    children.append(child1)
                elif(self.bin_dom(child1,child2)):
                    children.append(child2)
                else:
                    x=random.randint(0,100)
                    if(x%2==0):
                        children.append(child2)
                    else:
                        children.append(child1)
            population_frontier_new=[]
            for can1 in population_frontier:
                flag=True
                for can2 in population_frontier:
                    if(can1==can2):
                        continue
                    if(self.bin_dom(can1,can2)):
                        flag=False
                        break
                if flag:
                    population_frontier_new.append(can1)
            tmp=[]
            new_frontier=False
            for a in population_frontier_new:
                for b in pop_front_best:
                    if self.bin_dom(a,b):
                        tmp.append(a)
                        pop_front_best.remove(b)
            if tmp:
                pop_front_best.extend(tmp)
                new_frontier=True
            if new_frontier:
                life=0
            else:
                life=life+1
            if(life==self.lifes):
                break

            population_frontier=children
            population_frontier_old=population_frontier_new

            k=k+1
       # print population_frontier
        #print first_frontier
        x=loss(population_frontier[0],first_frontier[0])
        global_variable.pop_front_best=pop_front_best
        '''name='Pareto_Fronts/pareto.txt'
        f=open(name,'w')
        i=0
        for i in xrange(len(pop_front_best)):
            k=0
            for j in (self.model.objectives(pop_front_best[i])):
                j=(j - self.emin[k]) / (self.emax[k]- self.emin[k])
                k+=1
                s=str(j)
                f.write(s)
                f.write(" ")
            f.write("\n")
        f.close();

       # hypervol=HyperVolume_wrapper()
        os.remove('./Pareto_Fronts/pareto.txt')'''
        #print hypervol
        return x