Esempio n. 1
0
    for ds in datasets:
        dataloader = DataLoader(dataset = ds,
                                batch_size = BATCH_SIZE,
                                shuffle = True,
                                num_workers = 0)
        dataloader_list.append(dataloader)

    data_num = dataset.data_num

    sample_data_num = int(data_num/CV_NUM)

    params = (QUERY_DIM,KEY_DIM,FEATURE_DIM)

    ## Attention Net
    if NET == ATTENTION:
        net = Attention_Net(dataset, params, activation = ACT)
    ## Linear Net
    elif NET == LINEAR:
        net = Linear_Net(dataset, FEATURE_DIM)



    ## Optimizer
    if OPTIMIZER == SGD:
        optimizer = torch.optim.SGD(net.parameters(), lr = LEARNING_RATE, momentum = MOMENTUM)
    elif OPTIMIZER == ADAM:
        optimizer = torch.optim.Adam(net.parameters(), lr = LEARNING_RATE, betas = BETAS)

    ## Loss
    loss_function = torch.nn.MSELoss()
def grad_search(dataset, data_loader_list, grad_search_path, params=(1, 1, 1)):

    QUERY_DIM = params[0]
    KEY_DIM = params[1]
    FEATURE_DIM = params[2]

    ############## Data Preparation ###################
    model_path = "/home/li/torch/model/attention_net_Q_" + str(
        QUERY_DIM) + "_K_" + str(KEY_DIM) + "_F_" + str(
            FEATURE_DIM) + "_CV.model"

    this_search_path = grad_search_path + "Q_" + str(QUERY_DIM) + "_K_" + str(
        KEY_DIM) + "_F_" + str(FEATURE_DIM) + "/"

    if not os.path.exists(this_search_path):
        os.mkdir(this_search_path)

    data_file_path = "/home/li/datasets/lifelog/data/Group1_li_mofei_no_20_20190520.csv"
    user = "******"

    train_log_file_path = this_search_path + "train_log.txt"

    name_list = dataset.item_list
    input_dim = len(name_list)

    data_num = dataset.data_num

    sample_data_num = int(data_num / CV_NUM)

    ## Attention Net
    attention_net = Attention_Net(dataset, params, activation=ACT)

    ## Optimizer
    if OPT == SGD:
        optimizer = torch.optim.SGD(attention_net.parameters(),
                                    lr=LEARNING_RATE,
                                    momentum=MOMENTUM)
    elif OPT == ADAM:
        optimizer = torch.optim.Adam(attention_net.parameters(),
                                     lr=LEARNING_RATE,
                                     betas=BETAS)

    ## Train Log
    with open(train_log_file_path, 'w') as train_f:
        train_f.write("Optimizer: " + OPT + "\r\n")
        train_f.write("Learning Rate: " + str(LEARNING_RATE) + "\r\n")
        if OPT == SGD:
            train_f.write("Momentum: " + str(MOMENTUM) + "\r\n")
        elif OPT == ADAM:
            train_f.write("Betas: " + str(BETAS) + "\r\n")
        train_f.write("Regularization: " + str(REG) + "\r\n")
        train_f.write("Loss: " + str(LOSS) + "\r\n")
        train_f.write("Parameters: \r\n")
        for name, param in attention_net.named_parameters():
            if param.requires_grad:
                train_f.write(str(name) + "\r\n")

    train_log_file = open(train_log_file_path, 'a')

    ## Loss
    if LOSS == MSE:
        loss_function = torch.nn.MSELoss()

    #### Print Parameters
    #for name,param in attention_net.named_parameters():
    #    if param.requires_grad:
    #        print(name)
    #print(param)

    ###################### Training ############### Cross Validation
    #attention_net.train()

    #print(dataloader)
    train_loss_list = []
    test_loss_list = []

    class_1_distance_list = []
    class_2_distance_list = []
    class_1_star_distance_list = []
    class_2_star_distance_list = []
    inter_distance_list = []
    coeff_1_list = []
    coeff_2_list = []
    coeff_3_list = []

    for epoch in range(EPOCH):
        train_loss_each_epoch_list = []
        test_loss_each_epoch_list = []

        for i in range(CV_NUM):
            test_dataloader = dataloader_list[i]
            train_dataloader_list = dataloader_list[:i] + dataloader_list[i +
                                                                          1:]
            attention_net.train()
            #print(len(train_dataloader_list))
            ###### Train
            train_loss_each_sample_list = []
            for dataloader in train_dataloader_list:

                train_loss_each = 0
                for im, label in dataloader:
                    l0_regularization = torch.tensor(0).float()
                    l1_regularization = torch.tensor(0).float()
                    l2_regularization = torch.tensor(0).float()

                    out, dis = attention_net.forward(im)
                    mse_loss = loss_function(out, label)

                    ## Regularization
                    for param in attention_net.parameters():
                        l1_regularization += WEIGHT_DECAY * torch.norm(
                            param, 1)
                        l2_regularization += WEIGHT_DECAY * torch.norm(
                            param, 2)

                    if REG == L0:
                        loss = mse_loss + l0_regularization
                    elif REG == L1:
                        loss = mse_loss + l1_regularization
                    elif REG == L2:
                        loss = mse_loss + l2_regularization

                    train_loss_each += mse_loss.item() / sample_data_num

                    optimizer.zero_grad()
                    loss.backward()
                    optimizer.step()

                train_loss_each_sample_list.append(train_loss_each)
                #print(len(train_loss_each_sample_list))
            #print(len(train_loss_each_sample_list))
            train_loss_each_epoch_list.append(
                np.mean(train_loss_each_sample_list))

            ############ Test
            test_loss_each = 0
            attention_net.eval()
            for im, label in test_dataloader:
                out, dis = attention_net.forward(im)
                mse_loss = loss_function(out, label)
                test_loss_each += mse_loss.item() / sample_data_num

            test_loss_each_epoch_list.append(test_loss_each)

        train_loss = np.mean(train_loss_each_epoch_list)
        test_loss = np.mean(test_loss_each_epoch_list)
        train_loss_list.append(train_loss)
        test_loss_list.append(test_loss)

        ######################## Evaluation
        info1 = "Epoch: " + str(epoch) + " , Train Loss: " + str(train_loss)
        info2 = "Epoch: " + str(epoch) + " , Test Loss: " + str(test_loss)

        class_1_distance, class_2_distance, class_1_star_distance, class_2_star_distance, inter_distance = evaluate_model_inner_inter_distance(
            attention_net, sample_number=EVA_SAMPLE_NUMBER, order=ORDER)
        class_1_distance_list.append(class_1_distance)
        class_2_distance_list.append(class_2_distance)
        class_1_star_distance_list.append(class_1_star_distance)
        class_2_star_distance_list.append(class_2_star_distance)
        inter_distance_list.append(inter_distance)
        coeff_1 = float(class_1_star_distance / class_1_distance)
        coeff_2 = float(class_2_star_distance / class_2_distance)
        coeff_3 = float((class_1_star_distance + class_2_star_distance) /
                        (2 * inter_distance))
        coeff_1_list.append(coeff_1)
        coeff_2_list.append(coeff_2)
        coeff_3_list.append(coeff_3)

        info3 = "Epoch: " + str(epoch) + " , D11: " + str(
            class_1_distance) + " , D22: " + str(class_2_distance)
        info4 = "Epoch: " + str(epoch) + " , D11*: " + str(
            class_1_star_distance) + ", D22*: " + str(
                class_2_star_distance) + ", D12*: " + str(inter_distance)
        info5 = "Epoch: " + str(epoch) + " , Coefficient 1: " + str(
            coeff_1) + " , Coefficient 2: " + str(
                coeff_2) + " , Coefficient 3: " + str(coeff_3)

        train_log_file.write(info1 + "\r\n")
        train_log_file.write(info2 + "\r\n")
        train_log_file.write(info3 + "\r\n")
        train_log_file.write(info4 + "\r\n")
        train_log_file.write(info5 + "\r\n")

    #torch.save(attention_net, model_path)
    ##################################### Get Output
    #attention_net.eval()
    #final_input = torch.from_numpy(np.ones(input_dim)).float().unsqueeze(0)
    #final_output = attention_net.forward(final_input)
    #final_matrix = attention_net.get_output_matrix(final_input, final_output,pandas = True)
    #csv_output_file = "/home/li/torch/result/test_result_" + str(user) + ".csv"
    #final_matrix.to_csv(csv_output_file)
    #print(loss_list)

    ############################### Get Training Curve
    extra = "_Optim_SGD_WD_L1_lr_05_epoach_50_"
    figure = "train_curve"
    plt_file = this_search_path + "Q_" + str(QUERY_DIM) + "_K_" + str(
        KEY_DIM) + "_F_" + str(FEATURE_DIM) + str(extra) + str(figure) + ".png"
    plt.plot(range(len(train_loss_list)), train_loss_list, label="train loss")
    plt.plot(range(len(test_loss_list)), test_loss_list, label="test loss")
    plt.legend(loc='upper right')
    #plt.ylim(bottom = 0, top = 0.02)
    plt.savefig(plt_file)
    #plt.show()
    plt.close('all')

    ############################ Get Distance Curve
    figure = "distance_curve"
    plt_file = this_search_path + "Q_" + str(QUERY_DIM) + "_K_" + str(
        KEY_DIM) + "_F_" + str(FEATURE_DIM) + str(extra) + str(figure) + ".png"

    plt.plot(range(len(class_1_distance_list)),
             class_1_distance_list,
             label="D11")
    plt.plot(range(len(class_2_distance_list)),
             class_2_distance_list,
             label="D22")
    plt.plot(range(len(class_1_star_distance_list)),
             class_1_star_distance_list,
             label="D11*")
    plt.plot(range(len(class_2_star_distance_list)),
             class_2_star_distance_list,
             label="D22*")
    plt.plot(range(len(inter_distance_list)),
             inter_distance_list,
             label="D12*")
    plt.legend(loc='upper right')
    plt.savefig(plt_file)
    #plt.show()
    plt.close('all')

    ############################ Get Coeff Curve
    figure = "coefficient_curve"
    plt_file = this_search_path + "Q_" + str(QUERY_DIM) + "_K_" + str(
        KEY_DIM) + "_F_" + str(FEATURE_DIM) + str(extra) + str(figure) + ".png"

    plt.plot(range(len(coeff_1_list)), coeff_1_list, label="C1")
    plt.plot(range(len(coeff_2_list)), coeff_2_list, label="C2")
    plt.plot(range(len(coeff_3_list)), coeff_3_list, label="C3")
    plt.legend(loc='upper right')
    plt.savefig(plt_file)
    #plt.show()
    plt.close('all')

    ############################ Get Coeff Scatter Plot Versus Loss
    figure = "coefficient_scatter_plot"
    plt_file = this_search_path + "Q_" + str(QUERY_DIM) + "_K_" + str(
        KEY_DIM) + "_F_" + str(FEATURE_DIM) + str(extra) + str(figure) + ".png"

    plt.scatter(train_loss_list,
                coeff_1_list,
                c="blue",
                marker="o",
                label="C1")
    plt.scatter(train_loss_list,
                coeff_2_list,
                c="green",
                marker="X",
                label="C2")
    plt.scatter(train_loss_list, coeff_3_list, c="red", marker="v", label="C3")
    plt.legend(loc='upper right')
    plt.savefig(plt_file)
    #plt.show()
    plt.close('all')

    return_tuple = (train_loss_list[-1], test_loss_list[-1],
                    class_1_distance_list[-1], class_2_distance_list[-1],
                    class_1_star_distance_list[-1],
                    class_2_star_distance_list[-1], inter_distance_list[-1],
                    coeff_1_list[-1], coeff_2_list[-1], coeff_3_list[-1])

    return return_tuple
Esempio n. 3
0
def run_cross_validation(input_csv,output_csv,weight_csv,username,K_FOLDER,BATCH_NORM,MOMENTUM,ARTIFICIAL,DATE,EPOCH,KEY_DIM,FEATURE_DIM,QUERY_DIM,REG,LEARNING_RATE,WEIGHT_DECAY,LOSS,ACT,BATCH_SIZE,OPTIMIZER,NET,w_f,w_f_type,VALIDATE_NUMBER,WD,extra_msg,ATTENTION_REG, ATTENTION_REG_WEIGHT):
        ############### Data Preparation ##############
    extra = "CV_" + str(extra_msg) + str(DATE) + "_Epoch_"+ str(EPOCH) + "_Net_" + str(NET) + "_u_" + str(username) + "_Q_" + str(QUERY_DIM) + "_K_" + str(KEY_DIM) + "_F_" + str(FEATURE_DIM) + "_REG_" + str(REG) + "_ACT_" + str(ACT) + "_WD_" + str(WD) + "w_f" + str(w_f_type)
    #model_path = "/home/li/food/model/" + str(extra) + ".model"

    ## Artificial
    dataset = FoodDataset(input_csv,output_csv)
    
    print(weight_csv)
    weights_df = pd.read_csv(weight_csv)


    model_path = "/home/li/food/model/" + str(DATE) + "/"
    
    plot_path = "/home/li/food/plot/" + str(DATE) + "/"
    if not os.path.exists(plot_path):
        os.mkdir(plot_path)
    plot_path = plot_path + "CV/"
    train_log_path = plot_path + "train_log/"
    train_log_file_path = train_log_path + str(extra) + ".txt"
    
    if not os.path.exists(plot_path):
        os.mkdir(plot_path)
    
    if not os.path.exists(model_path):
        os.mkdir(model_path)

    if not os.path.exists(train_log_path):
        os.mkdir(train_log_path)
    

    data_num = dataset.data_num
    valid_data_num = int(data_num/K_FOLDER)
    train_data_num = int(data_num - valid_data_num)
    sample_data_num = int(valid_data_num)

    print(train_data_num)
    print(valid_data_num)

    splits_list = []
    for i in range(K_FOLDER):
        splits_list.append(sample_data_num)
    splits_list = tuple(splits_list)
    print(splits_list)

    datasets = torch.utils.data.random_split(dataset,splits_list)
    dataloader_list = []
    dataloader_bs1_list = []
    #### DEBUG
    #for ds in datasets:
        #print(ds.__len__())

    for ds in datasets:
        dataloader = DataLoader(dataset = ds,
                                batch_size = BATCH_SIZE,
                                shuffle = True,
                                num_workers = 0)
        dataloader_list.append(dataloader)

        dataloader_bs1 = DataLoader(dataset = ds,
                                    batch_size = 1,
                                    shuffle = True,
                                    num_workers = 0)
        dataloader_bs1_list.append(dataloader_bs1)

        

    params = (QUERY_DIM,KEY_DIM,FEATURE_DIM)

    net_list = []
    ## NET

    if NET == ATTENTION:
        for i in range(K_FOLDER):
            if w_f == "FIXED":
                net = Attention_Net(dataset, params, activation = ACT, w_f = "Fixed", w_f_type = w_f_type)
            elif w_f == "TRAIN":
                net = Attention_Net(dataset, params, activation = ACT, w_f = "Train")
            net_list.append(net)
    elif NET == LINEAR:
        for i in range(K_FOLDER):
            net = Linear_Net(dataset, params = KEY_DIM, activation = ACT)
            net_list.append(net)
    elif NET == LINEAR_NOHIDDEN:
        for i in range(K_FOLDER):
            net = Linear_NoHidden_Net(dataset)
            net_list.append(net)
            
    ### TEST
    
    for k in range(K_FOLDER):
        model_save = model_path + str(extra) + "_CV_Model_" + str(k) + "initial.model"
        torch.save(net_list[k].state_dict(), model_save)
        print(model_save)
    

    optimizer_list = []
    ## OPTIMIZER
    if OPTIMIZER == SGD:
        for i in range(K_FOLDER):
            optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, net_list[i].parameters()), lr = LEARNING_RATE, momentum = MOMENTUM)
            optimizer_list.append(optimizer)
    elif OPTIMIZER == ADAM:
        for i in range(K_FOLDER):
            optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, net_list[i].parameters()), lr = LEARNING_RATE, betas = BETAS)
            optimizer_list.append(optimizer)
            
    ## LOSS
    if LOSS == MSE:
        loss_function = torch.nn.MSELoss()
    elif LOSS == CEL:
        loss_function = torch.nn.CrossEntropyLoss()

    ########## TRAINING
    train_loss_list = []
    train_loss_log_list = []
    valid_loss_list = []
    valid_loss_log_list = []
    valid_accurate_rate_list = []
    train_accurate_rate_list = []

    train_average_accuracy_list = []
    valid_average_accuracy_list = []

    for k in range(K_FOLDER):
        train_loss_list.append([])
        train_loss_log_list.append([])
        valid_loss_list.append([])
        valid_loss_log_list.append([])
        valid_accurate_rate_list.append([])
        train_accurate_rate_list.append([])
    

    for epoch in range(EPOCH):
        #dist_list = []
        #valid_dist_list = []
        #test_output_list = []
        train_average_accuracy = 0
        valid_average_accuracy = 0
        for k in range(K_FOLDER):
            valid_dataloader = dataloader_list[k]
            train_dataloader = dataloader_list[:k] + dataloader_list[k+1:]

            valid_dataloader_bs1 = dataloader_bs1_list[k]
            train_dataloader_bs1 = dataloader_bs1_list[:k] + dataloader_bs1_list[k+1:]
            net = net_list[k]
            optimizer = optimizer_list[k]
        
            
            net.eval()
            
            
            train_loss_list_each_epoch = []
            valid_loss_list_each_epoch = []
            
            
            accurate_number = 0
            for im,label in valid_dataloader_bs1:
                if NET == ATTENTION:
                    out,dist_origin = net.forward(im,batch_norm = BATCH_NORM)
                    accurate_number += match_output(out,label.float())
                else:
                    out = net.forward(im,batch_norm = BATCH_NORM)
                    accurate_number += match_output(out,label.float())

                org_loss = loss_function(out, torch.max(label,1)[1])
                valid_loss_list_each_epoch.append(org_loss.item())
                    
            
            valid_accurate_rate = float(accurate_number)/ valid_data_num
            valid_accurate_rate_list[k].append(valid_accurate_rate)
            valid_average_accuracy += valid_accurate_rate
            valid_loss = np.mean(valid_loss_list_each_epoch)
            valid_loss_list[k].append(valid_loss)
            valid_loss_log_list[k].append(math.log(valid_loss))
            
                    
            accurate_number = 0
            #counter = 0
            for dataloader in train_dataloader_bs1:
                train_loss_each = 0
                    
                for im,label in dataloader:
                    #counter += 1
                    if NET == ATTENTION:
                        out,dist_origin = net.forward(im,batch_norm = BATCH_NORM)
                        accurate_number += match_output(out,label.float())
                        #print(accurate_number)
                    else:
                        out = net.forward(im,batch_norm = BATCH_NORM)
                        accurate_number += match_output(out,label.float())
                        
                    org_loss = loss_function(out, torch.max(label,1)[1])
                    train_loss_list_each_epoch.append(org_loss.item())
                                   
                                   
                                   
                                   
            train_accurate_rate = float(accurate_number)/ train_data_num
            train_accurate_rate_list[k].append(train_accurate_rate)
            train_average_accuracy += train_accurate_rate
            train_loss = np.mean(train_loss_list_each_epoch)
            train_loss_list[k].append(train_loss)
            train_loss_log_list[k].append(math.log(train_loss))

            net.train()
            
            for dataloader in train_dataloader:
                for im,label in dataloader:
                    l0_regularization = torch.tensor(0).float()
                    l1_regularization = torch.tensor(0).float()
                    l2_regularization = torch.tensor(0).float()
                    attention_regularization = torch.tensor(0).float()

                    if NET == ATTENTION:
                        out,dist_origin = net.forward(im,batch_norm = BATCH_NORM)
                        #for dist in dist_origin:
                            #dist_list.append(list(dist.detach().numpy()))
                        if ATTENTION_REG:
                            for dist in dist_origin:
                                attention_regularization += ATTENTION_REG_WEIGHT * torch.norm(dist,0.5)
                                #print(attention_regularization)
                                
                            
                    else:
                        out = net.forward(im,batch_norm = BATCH_NORM)

                    org_loss = loss_function(out, torch.max(label,1)[1])

                    ## Regularization
                    for param in net.parameters():
                        l1_regularization += WEIGHT_DECAY * torch.norm(param,1)
                        l2_regularization += WEIGHT_DECAY * torch.norm(param,2)

                    if REG == L0:
                        loss = org_loss + l0_regularization
                    elif REG == L1:
                        loss = org_loss + l1_regularization
                    elif REG == L2:
                        loss = org_loss + l2_regularization
                    
                    if ATTENTION_REG:
                        loss = loss + attention_regularization

                    optimizer.zero_grad()
                    loss.backward()
                    optimizer.step()


            ### Train LOG
            info1 = "Epoch: " + str(epoch) + " , CV_Model: " + str(k) + " , Train Loss: " + str(train_loss)
            info2 = "Epoch: " + str(epoch) + " , CV_Model: " + str(k) + " , valid Loss: " + str(valid_loss)
            info3 = "Epoch: " + str(epoch) + " , CV_Model: " + str(k) + " , Train Accuracy: " + str(train_accurate_rate) + " , Test Accuracy: " + str(valid_accurate_rate) 
            #print(info3)
            info5 = "Epoch: " + str(epoch) + " , Output: " + str(out)
            #print(info5)
            if epoch % 50 == 0 or epoch == (EPOCH - 1):
                print(info3)
            for para in net.parameters():
                info6 = "Epoch: " + str(epoch) + " , Parameters: " + str(para)
                #print(info6)
            

        train_average_accuracy_list.append(train_average_accuracy/K_FOLDER)
        valid_average_accuracy_list.append(valid_average_accuracy/K_FOLDER)
        
        if epoch % 100 == 0:
            for k in range(K_FOLDER):
                model_save = model_path + str(extra) + "_CV_Model_" + str(k) + ".model"
                torch.save(net_list[k].state_dict(), model_save)

        

    #### Model Save
    #print(model_path)
    for k in range(K_FOLDER):
        model_save = model_path + str(extra) + "_CV_Model_" + str(k) + ".model"
        torch.save(net_list[k].state_dict(), model_save)
        print(model_save)


    #### PLOT
    
                                   
                                   
    figure = "Learning_Curve"
    for k in range(K_FOLDER):
        plt.figure()
        title = "F_" + str(FEATURE_DIM) + "_K_"+ str(KEY_DIM) + "_wf_" + str(w_f) + "_Model_" + str(k)
        plt_file = plot_path + str(extra) + "_" + str(figure) + "_CV_Model_" + str(k) + ".png"
        #plt.plot(range(len(train_loss_list)), train_loss_list, label = "train loss")
        plt.plot(range(len(train_loss_log_list[k])), train_loss_log_list[k], label = "log train loss")
        plt.plot(range(len(valid_loss_log_list[k])), valid_loss_log_list[k], label = "log valid loss")
                                   
        plt.title(title)
        plt.legend(loc = "upper right")
        plt.show()
        plt.savefig(plt_file)
        plt.close('all')


    figure = "Accuracy_Curve"
    for k in range(K_FOLDER):
        plt.figure()
        title = "F_" + str(FEATURE_DIM) + "_K_"+ str(KEY_DIM) + "_wf_" + str(w_f) + "_Model_" + str(k)
        plt_file = plot_path + str(extra) + "_" + str(figure) + "_CV_Model_" + str(k) + ".png"
        plt.plot(range(len(valid_accurate_rate_list[k])), valid_accurate_rate_list[k], label = "Valid Accurate Rate")
        plt.plot(range(len(train_accurate_rate_list[k])), train_accurate_rate_list[k], label = "Train Accurate Rate")
        plt.title(title)
        plt.legend(loc = "lower right")
        plt.show()
        plt.savefig(plt_file)
        plt.close('all')

    figure = "Accuracy_Average_Curve"
    title = "F_" + str(FEATURE_DIM) + "_K_"+ str(KEY_DIM) + "_wf_" + str(w_f)
    plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
    plt.figure()
    #plt.plot(range(len(train_loss_list)), train_loss_list, label = "train loss")
    plt.plot(range(len(valid_average_accuracy_list)), valid_average_accuracy_list, label = "Valid Accurate Average")
    plt.plot(range(len(train_average_accuracy_list)), train_average_accuracy_list, label = "Train Accurate Average")
                                   
    plt.title(title)
    plt.legend(loc = "lower right")
    plt.savefig(plt_file)
    plt.show()
    plt.close('all')

    figure = "Accuracy_Scatter"
    plt.figure()
    
    plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
    x = ["Train Accuracy","Test Accuracy"]
    for k in range(K_FOLDER):
        
        y = []
        y.append(train_accurate_rate_list[k][-1])
        y.append(valid_accurate_rate_list[k][-1])
        label = "Model_" + str(k)
        plt.scatter(x,y,s = 600, c = "blue", alpha = float(1)/K_FOLDER * (k+1), linewidths = "2", marker = "o", label = label)

    y = []
    y.append(train_average_accuracy_list[-1])
    y.append(valid_average_accuracy_list[-1])
    plt.scatter(x,y,s = 600, c = "yellow", alpha = 1, linewidths = "2", marker = "*", label = "Average")
    plt.title(title)
    plt.legend(loc = "best")
    plt.show()
    plt.savefig(plt_file)
    plt.close('all')
    
    
    if NET != ATTENTION:
        return


    data_list = []
    counter = 0
    for data in dataloader_bs1_list[0]:
        counter += 1
        data_list.append(data)
        if counter >= VALIDATE_NUMBER:
            break

            
    
    
    for k in range(K_FOLDER):
        net = net_list[k]
        net.eval()
        valid_dist_list = []
        #valid_dataloader = dataloader_bs1_list[k]
        for data in data_list:
            out,dist_origin = net.forward(data[0],batch_norm = BATCH_NORM)
            for dist in dist_origin:
                valid_dist_list.append(list(dist.detach().numpy()))

        pca = PCA(n_components = 2)
        pca.fit(valid_dist_list)
        valid_feature = pca.transform(valid_dist_list)
        print("Model " + str(k))
        print(pca.explained_variance_ratio_)
        
        if len(pca.explained_variance_ratio_) >= 2:

            figure = "PCA_Artificial_Train_Model_" + str(k)
            title = "F_" + str(FEATURE_DIM) + "_K_"+ str(KEY_DIM) + "_wf_" + str(w_f) + "_Model_" + str(k)
            plt.figure()
            print(len(valid_feature[:,0]))
            plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
            plt.scatter(valid_feature[:,0], valid_feature[:,1])
            plt.grid()
            plt.xlim(-1,1)
            plt.ylim(-1,1)
            plt.title(title)
            plt.savefig(plt_file)
            plt.show()
            plt.close('all')
            
        if FEATURE_DIM == 32:
            matrix_value_csv = plot_path + str(extra) + "_value_matrix_Model_" + str(k) + ".csv"
            matrix_value = []
            for n,p in net_list[k].named_parameters():
                if n == "value_matrix":
                    for i in range(KEY_DIM):
                        p_i = list(p[i].detach().numpy())
                        sortp = list(np.argsort(p_i))
                        matrix_value.append(p_i)
                        sort_index = []
                        for j in range(len(p_i)):
                            sort_index.append(int(sortp.index(j)))
                        matrix_value.append(sort_index)
                    matrix_value_df = pd.DataFrame(np.array(matrix_value).transpose())
                    matrix_value_df.to_csv(matrix_value_csv)

    return
Esempio n. 4
0
def run_normal(input_csv,output_csv,weight_csv,username,ARTIFICIAL,BATCH_NORM,DATE,EPOCH,KEY_DIM,FEATURE_DIM,QUERY_DIM,REG,LEARNING_RATE,WEIGHT_DECAY,LOSS,ACT,BATCH_SIZE,OPTIMIZER,NET,w_f,w_f_type,WD,MOMENTUM,extra_msg):

    ############### Data Preparation ##############
    extra = str(extra_msg) + str(DATE) + "_Epoch_"+ str(EPOCH) + "_Net_" + str(NET) + "_u_" + str(username) + "_Q_" + str(QUERY_DIM) + "_K_" + str(KEY_DIM) + "_F_" + str(FEATURE_DIM) + "_REG_" + str(REG) + "_ACT_" + str(ACT) + "WD" + str(WD) + "_wf_" + str(w_f_type)
    
    model_path = "/home/li/food/model/" + str(extra) + ".model"

    valid_input_csv = "/home/li/food/data/20190903_limofei_100_input_validation.csv"
    valid_output_csv = "/home/li/food/data/20190903_limofei_100_output_validation.csv"
    valid_dataset = FoodDataset(valid_input_csv, valid_output_csv)
    valid_dataloader = DataLoader(dataset = valid_dataset,
                                batch_size = 1,
                                shuffle = False,
                                num_workers = 0)

    valid_data_num = valid_dataset.data_num
    dataset = FoodDataset(input_csv,output_csv)
    plot_path = "/home/li/food/plot/" + str(DATE) + "/"
    train_log_path = plot_path + "train_log/"
    train_log_file_path = train_log_path + str(extra) + ".txt"
    
    if not os.path.exists(plot_path):
        os.mkdir(plot_path)

    if not os.path.exists(train_log_path):
        os.mkdir(train_log_path)
    
    data_num = dataset.data_num
    train_data_num = data_num

    dataloader = DataLoader(dataset = dataset,
                            batch_size = BATCH_SIZE,
                            shuffle = False,
                            num_workers = 0)

    train_dataloader = DataLoader(dataset = dataset,
                                  batch_size = 1,
                                  shuffle = False,
                                  num_workers = 0)

    params = (QUERY_DIM,KEY_DIM,FEATURE_DIM)

    ## NET

    if NET == ATTENTION:
        if w_f == "FIXED":
            net = Attention_Net(dataset, params, activation = ACT, w_f = "Fixed", w_f_type = w_f_type)
        elif w_f == "TRAIN":
            net = Attention_Net(dataset, params, activation = ACT, w_f = "Train")
        
    elif NET == LINEAR:
        net = Linear_Net(dataset, params = FEATURE_DIM, activation = ACT)


    #for i in filter(lambda p: p.requires_grad, net.parameters()):
    #    print(i)
    #for i in filter(lambda p: not p.requires_grad, net.parameters()):
    #    print(i)


    ## OPTIMIZER
    if OPTIMIZER == SGD:
        optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, net.parameters()), lr = LEARNING_RATE, momentum = MOMENTUM)
        #optimizer = torch.optim.SGD(net.parameters(), lr = LEARNING_RATE, momentum = MOMENTUM)
    elif OPTIMIZER == ADAM:
        optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, net.parameters()), lr = LEARNING_RATE, betas = BETAS)

    ## LOSS
    if LOSS == MSE:
        loss_function = torch.nn.MSELoss()
    elif LOSS == CEL:
        loss_function = torch.nn.CrossEntropyLoss()


    ########## TRAINING
    train_loss_list = []
    train_loss_log_list = []
    train_accurate_rate_list = []

    if not ARTIFICIAL:
        test_loss_list = []
        test_loss_log_list = []
        test_accurate_rate_list = []
    

    for epoch in range(EPOCH):
        net.train()
        dist_list = []
        valid_dist_list = []

        if not ARTIFICIAL:
            test_output_list = []
            test_loss_list_each_epoch = []
            
        train_loss_list_each_epoch = []
        
        if not ARTIFICIAL:
            accurate_number = 0
            for im,label in valid_dataloader:
                if NET == ATTENTION:
                    out,dist_origin = net.forward(im,batch_norm = BATCH_NORM)
                    for dist in dist_origin:
                        valid_dist_list.append(list(dist.detach().numpy()))
                    output_array = list(out.detach().numpy())
                    test_output_list.append(output_array)
                    accurate_number += match_output(out,label.float())
                elif NET == LINEAR:
                    out = net.forward(im,batch_norm = BATCH_NORM)
                    output_array = list(out.detach().numpy())
                    test_output_list.append(output_array)
                    accurate_number += match_output(out,label.float())

                org_loss = loss_function(out, torch.max(label,1)[1])
                test_loss_list_each_epoch.append(org_loss.item())

            valid_accurate_rate = float(accurate_number) / valid_data_num
            test_accurate_rate_list.append(valid_accurate_rate)

            
        if not ARTIFICIAL:
            test_loss = np.mean(test_loss_list_each_epoch)
            test_loss_list.append(test_loss)
            test_loss_log_list.append(math.log(test_loss))

        accurate_number = 0
        for im,label in train_dataloader:
            if NET == ATTENTION:
                out,dist_origin = net.forward(im,batch_norm = BATCH_NORM)
                for dist in dist_origin:
                    dist_list.append(list(dist.detach().numpy()))
                output_array = list(out.detach().numpy())
                #test_output_list.append(output_array)
                accurate_number += match_output(out,label.float())
            elif NET == LINEAR:
                out = net.forward(im,batch_norm = BATCH_NORM)
                output_array = list(out.detach().numpy())
                #test_output_list.append(output_array)
                accurate_number += match_output(out,label.float())

            #org_loss = loss_function(out, torch.max(label,1)[1])
            #test_loss_list_each_epoch.append(org_loss.item())

        train_accurate_rate = float(accurate_number)/ train_data_num
        train_accurate_rate_list.append(train_accurate_rate)

        train_loss = np.mean(train_loss_list_each_epoch)
        train_loss_list.append(train_loss)
        train_loss_log_list.append(math.log(train_loss))
            
        for im,label in dataloader:
            l0_regularization = torch.tensor(0).float()
            l1_regularization = torch.tensor(0).float()
            l2_regularization = torch.tensor(0).float()

            if NET == ATTENTION:
                out,dist_origin = net.forward(im,masked = MASK,batch_norm = BATCH_NORM)
            elif NET == LINEAR:
                out = net.forward(im,batch_norm = BATCH_NORM)
            elif NET == LINEAR_NOHIDDEN:
                out = net.forward(im,batch_norm = BATCH_NORM)

            #print(out)
            #print(label)
            #print(out.shape)
            #print(label.shape)

            org_loss = loss_function(out, torch.max(label,1)[1])
            #print(torch.max(label,1)[1])
            #print(org_loss)

            ## Regularization
            for param in filter(lambda p: p.requires_grad, net.parameters()):
                l1_regularization += WEIGHT_DECAY * torch.norm(param,1)
                l2_regularization += WEIGHT_DECAY * torch.norm(param,2)

            if REG == L0:
                loss = org_loss + l0_regularization
            elif REG == L1:
                loss = org_loss + l1_regularization
            elif REG == L2:
                loss = org_loss + l2_regularization

            train_loss_list_each_epoch.append(org_loss.item())

            optimizer.zero_grad()
            #print(loss)
            loss.backward()
            optimizer.step()

        info1 = "Epoch: " + str(epoch) + " , Train Loss: " + str(train_loss)
        print(info1)
        if not ARTIFICIAL:
            info2 = "Epoch: " + str(epoch) + " , Test Loss: " + str(test_loss)
            print(info2)

        if NET == ATTENTION:
            info3 = "Epoch: " + str(epoch) + " , Distribution: " + str(dist_origin)
            print(info3)
        info4 = "Epoch: " + str(epoch) + " , Train Accuracy: " + str(train_accurate_rate)
        print(info4)

        if not ARTIFICIAL:
            info5 = "Epoch: " + str(epoch) + " , Test Accuracy: " + str(valid_accurate_rate)
            print(info5)
        
        for para in net.parameters():
            info6 = "Epoch: " + str(epoch) + " , Parameters: " + str(para)
            #print(info6)

    print(model_path)
    torch.save(net.state_dict(), model_path)

    model = net

    #### PLOT
    figure = "Learning_Curve" 
    plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
    #plt.plot(range(len(train_loss_list)), train_loss_list, label = "train loss")
    plt.plot(range(len(train_loss_log_list)), train_loss_log_list, label = "log train loss")
    if not ARTIFICIAL:
        plt.plot(range(len(test_loss_log_list)), test_loss_log_list, label = "log test loss")    
    plt.legend(loc = "upper right")
    plt.savefig(plt_file)
    plt.close('all')


    figure = "Accurate_Rate_Curve" 
    plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
    #plt.plot(range(len(train_loss_list)), train_loss_list, label = "train loss")
    if not ARTIFICIAL:
        plt.plot(range(len(test_accurate_rate_list)), test_accurate_rate_list, label = "Valid Accurate Rate")
    plt.plot(range(len(train_accurate_rate_list)), train_accurate_rate_list, label = "Train Accurate Rate")
    
    plt.legend(loc = "lower right")
    plt.savefig(plt_file)
    plt.close('all')

    ##### TEST

    if NET == ATTENTION:
        pca = PCA(n_components = 'mle')
        pca.fit(dist_list)
    
        feature = pca.transform(dist_list)
        print(pca.explained_variance_ratio_)
    
        figure = "PCA_train"
        plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
        plt.scatter(feature[:,0], feature[:,1])
        plt.grid()
        plt.xlim(-1,1)
        plt.ylim(-1,1)
        plt.savefig(plt_file)
        plt.close('all')

        pca_valid = PCA(n_components = 'mle')
        pca_valid.fit(valid_dist_list)
        valid_feature = pca_valid.transform(valid_dist_list)
        print(pca_valid.explained_variance_ratio_)

        figure = "PCA_valid"
        print(len(valid_feature[:,0]))
        plt_file = plot_path + str(extra) + "_" + str(figure) + ".png"
        plt.scatter(valid_feature[:,0], valid_feature[:,1])
        plt.grid()
        plt.xlim(-1,1)
        plt.ylim(-1,1)
        plt.savefig(plt_file)
        plt.close('all')


    with open(train_log_file_path,"w") as log_f:
        log_f.write(info1 + "\r\n")
        log_f.write(info2 + "\r\n")
        if NET == ATTENTION:
            log_f.write(info3 + "\r\n")
        log_f.write(info4 + "\r\n")
        if NET == ATTENTION:
            log_f.write("Variance Ratio Train:" + str(pca.explained_variance_ratio_) + "\r\n")
            log_f.write("Variance Ratio Test:" + str(pca_valid.explained_variance_ratio_) + "\r\n")
    
    return
        dataloader_bs1 = DataLoader(dataset = ds,
                                    batch_size = 1,
                                    shuffle = True,
                                    num_workers = 0)
        dataloader_bs1_list.append(dataloader_bs1)

        

    params = (QUERY_DIM,KEY_DIM,FEATURE_DIM)

    net_list = []
    ## NET

    if NET == ATTENTION:
        for i in range(K_FOLDER):
            net = Attention_Net(dataset, params, activation = ACT)
            net_list.append(net)
    elif NET == LINEAR:
        for i in range(K_FOLDER):
            net = Linear_Net(dataset, params = FEATURE_DIM, activation = ACT)
            net_list.append(net)



    optimizer_list = []
    ## OPTIMIZER
    if OPTIMIZER == SGD:
        for i in range(K_FOLDER):
            optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, net_list[i].parameters()), lr = LEARNING_RATE, momentum = MOMENTUM)
            optimizer_list.append(optimizer)
    elif OPTIMIZER == ADAM:
Esempio n. 6
0
    dataloader = DataLoader(dataset=dataset,
                            batch_size=BATCH_SIZE,
                            shuffle=True,
                            num_workers=0)

    train_dataloader = DataLoader(dataset=dataset,
                                  batch_size=1,
                                  shuffle=False,
                                  num_workers=0)

    params = (QUERY_DIM, KEY_DIM, FEATURE_DIM)

    ## NET

    if NET == ATTENTION:
        net = Attention_Net(dataset, params, activation=ACT)
    elif NET == LINEAR:
        net = Linear_Net(dataset, params=FEATURE_DIM, activation=ACT)

    for i in filter(lambda p: p.requires_grad, net.parameters()):
        print(i)
    for i in filter(lambda p: not p.requires_grad, net.parameters()):
        print(i)

    ## OPTIMIZER
    if OPTIMIZER == SGD:
        optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad,
                                           net.parameters()),
                                    lr=LEARNING_RATE,
                                    momentum=MOMENTUM)
        #optimizer = torch.optim.SGD(net.parameters(), lr = LEARNING_RATE, momentum = MOMENTUM)
        username) + "_output_mds_figure.png"
    csv_path = "/home/li/torch/evaluation/" + str(extra) + "_object_8_" + str(
        username) + "_output_distance.csv"

    bar_path = "/home/li/torch/evaluation/" + str(extra) + "_bar_graph_" + str(
        username) + ".png"
    item_name_path = "/home/li/torch/evaluation/" + str(
        extra) + "_item_name_" + str(username) + ".txt"

    coeff_path = "/home/li/torch/artificial_data/coefficient_log_30000_test_L2_WD_00001.txt"

    dataset = GlobalModelDataset(input_csv, output_csv)

    params = (9, 6, 5)

    model = Attention_Net(dataset, params, activation=ACT)
    model.load_state_dict(torch.load(model_path))
    model.eval()

    for name, param in model.named_parameters():
        if param.requires_grad:
            print(name, param.data)

    item_list = model.item_list

    class_1_list = item_list[:32]
    class_2_list = item_list[32:]

    print(item_list)

    embedding = MDS(n_components=2, dissimilarity="precomputed")
    for ds in datasets:
        dataloader = DataLoader(dataset=ds,
                                batch_size=BATCH_SIZE,
                                shuffle=True,
                                num_workers=0)
        dataloader_list.append(dataloader)

    data_num = dataset.data_num

    sample_data_num = int(data_num / CV_NUM)

    params = (QUERY_DIM, KEY_DIM, FEATURE_DIM)

    ## Attention Net
    if NET == ATTENTION:
        net = Attention_Net(dataset, params, activation=ACT)
    ## Linear Net
    elif NET == LINEAR:
        net = Linear_Net(dataset, FEATURE_DIM)

    ## Optimizer
    if OPTIMIZER == SGD:
        optimizer = torch.optim.SGD(net.parameters(),
                                    lr=LEARNING_RATE,
                                    momentum=MOMENTUM)
    elif OPTIMIZER == ADAM:
        optimizer = torch.optim.Adam(net.parameters(),
                                     lr=LEARNING_RATE,
                                     betas=BETAS)

    ## Loss
Esempio n. 9
0
    output_csv = "/home/li/food/artificial_data/Artificial_20191007_ITEM_NO_32_CLASS_NO_2_DATA_NO_100000_CHOICE_NO_4_CONDITION_NO32output.csv"
    dataset = FoodDataset(input_csv, output_csv)
    #print(dataset[:100])

    plot_path = "/home/li/food/plot/" + str(DATE) + "/CV/"
    model_path = "/home/li/food/model/"
    if not os.path.exists(plot_path):
        os.mkdir(plot_path)

    params = (QUERY_DIM, KEY_DIM, FEATURE_DIM)
    net_list = []
    for i in range(K_FOLDER):
        model_file = model_path + "Data_1000_Epoch_20191007_100_Net_attention_net_u_artificial_Q_9_K_6_F_5_REG_L2_ACT_sigmoid_WD_0005_MASK_True_CV_Model_" + str(
            i) + ".model"
        if NET == ATTENTION:
            net = Attention_Net(dataset, params, activation=ACT)
            net_list.append(net)

    dataloader = DataLoader(dataset=dataset,
                            batch_size=1,
                            shuffle=True,
                            num_workers=0)

    counter = 0
    data_list = []
    for i in dataloader:
        counter += 1
        data_list.append(i)
        if counter >= VALIDATE_NUMBER:
            break
        #print(i[0])