예제 #1
0
    def k_fold(k, label, epochs, params, load_best_weigth, verbose, TensorB,
               name_of_best_weight, base_model):
        flag = params['agumentation']
        data = ld.load_data(
            label, phase="aug_evaluation") if flag == True else ld.load_data(
                label, phase="evaluation")
        results = []
        size = len(data['x']) // k
        tmp_idx = np.arange(data['x'].shape[0])
        np.random.shuffle(tmp_idx)
        x = data['x'][tmp_idx]
        y = data['y'][tmp_idx]
        np.save("x.npy", x)
        np.save("y.npy", y)
        acc_vec = []
        for i in range(k):
            x_test = x[i * size:(i + 1) * size]
            y_test = y[i * size:(i + 1) * size]
            x_train = np.append(x[0:i * size], x[(i + 1) * size:], axis=0)
            y_train = np.append(y[0:i * size], y[(i + 1) * size:], axis=0)
            tmp = random.sample(range(len(x_train)), 232)
            x_val = []
            y_val = []
            for j in tmp:
                x_val.append(x_train[j])
                y_val.append(y_train[j])
            x_val = np.array(x_val)
            y_val = np.array(y_val)
            x_train = np.delete(x_train, tmp, axis=0)
            y_train = np.delete(y_train, tmp, axis=0)

            ##########fixing data#########
            data = ld.fix_data(flag, x_train, y_train, x_val, y_val, x_test,
                               y_test)

            model = DTL(params=params,
                        base_model=base_model,
                        label=label,
                        data=data)
            model.train(epochs, load_best_weigth, verbose, TensorB,
                        name_of_best_weight + str(i) + ".h5", "k_fold")
            results.append(model.evaluate())
            print(results[-1])
            model.clear()
            del model
        return results
    def k_fold(k, epochs, params1, params2, load_best_weigth, verbose, TensorB,
               name_of_best_weight, base_model):
        data_tmp = [None, None, None]
        flag = None
        if params2['agumentation']:
            data_tmp[0] = ld.load_data('a', phase="aug_evaluation")
            data_tmp[1] = ld.load_data('v', phase="aug_evaluation")
            data_tmp[2] = ld.load_data('h', phase="aug_evaluation")
            flag = True
        else:
            data_tmp[0] = ld.load_data('a', phase="evaluation")
            data_tmp[1] = ld.load_data('v', phase="evaluation")
            data_tmp[2] = ld.load_data('h', phase="evaluation")
            flag = False
        data = {}
        data['x'] = data_tmp[0]['x']
        data['y'] = [data_tmp[0]['y'], data_tmp[1]['y'], data_tmp[2]['y']]
        size = len(data['x']) // k
        tmp_idx = np.arange(data['x'].shape[0])
        np.random.shuffle(tmp_idx)
        x = data['x'][tmp_idx]
        y = [
            data['y'][0][tmp_idx], data['y'][1][tmp_idx], data['y'][2][tmp_idx]
        ]
        acc_vec = []
        np.save("x.npy", x)
        np.save("y.npy", y)
        for i in range(k):
            x_test = x[i * size:(i + 1) * size]

            y_test = [
                y[0][i * size:(i + 1) * size], y[1][i * size:(i + 1) * size],
                y[2][i * size:(i + 1) * size]
            ]
            x_train = np.append(x[0:i * size], x[(i + 1) * size:], axis=0)
            y_train = [
                np.append(y[0][0:i * size], y[0][(i + 1) * size:], axis=0),
                np.append(y[1][0:i * size], y[1][(i + 1) * size:], axis=0),
                np.append(y[2][0:i * size], y[2][(i + 1) * size:], axis=0)
            ]

            y_test1 = np.array([[y[0][i][0], y[1][i][0], y[2][i][0]]
                                for i in range(i * size, (i + 1) * size)])
            y_train1 = [[y[0][i][0], y[1][i][0], y[2][i][0]]
                        for i in range(i * size)
                        ] + [[y[0][i][0], y[1][i][0], y[2][i][0]]
                             for i in range((i + 1) * size, len(y[2]))]
            y_train1 = np.array(y_train1)
            tmp = random.sample(range(len(x_train)), 232)
            x_val = []
            y_val = [[], [], []]
            y_val1 = []
            for j in tmp:
                x_val.append(x_train[j])
                y_val[0].append(y_train[0][j])
                y_val[1].append(y_train[1][j])
                y_val[2].append(y_train[2][j])
                y_val1.append(
                    [y_train[0][j][0], y_train[1][j][0], y_train[2][j][0]])
            y_val1 = np.array(y_val1)
            x_val = np.array(x_val)

            x_train = np.delete(x_train, tmp, axis=0)
            y_train[0] = np.delete(y_train[0], tmp, axis=0)
            y_train[1] = np.delete(y_train[1], tmp, axis=0)
            y_train[2] = np.delete(y_train[2], tmp, axis=0)
            y_train1 = np.delete(y_train1, tmp, axis=0)
            for j in range(3):
                y_val[j] = np.array(y_val[j])
            ##########fixing data#########
            data2 = ld.fix_data(flag, x_train, y_train, x_val, y_val, x_test,
                                y_test)
            data1 = ld.fix_data(flag, x_train, y_train1, x_val, y_val1, x_test,
                                y_test1)

            model = DMTL(params=params1,
                         base_model=base_model,
                         label="",
                         loss='binary_crossentropy',
                         second_model=None,
                         phase=1,
                         data=data1)

            model.train(1,
                        False,
                        verbose,
                        TensorB,
                        name_of_best_weight + str(i) + ".h5",
                        "k_fold",
                        save_m=True)

            epochs = [1, 1, 1]
            labels = ['a', 'v', 'h']
            for l in range(3):
                second_model = load_model("model_" + name_of_best_weight +
                                          str(i) + ".h5",
                                          custom_objects={
                                              "a": Meric.a,
                                              "v": Meric.v,
                                              "h": Meric.h,
                                              "loss_a": Meric.loss_a,
                                              "loss_v": Meric.loss_v,
                                              "loss_h": Meric.loss_h
                                          })

                model = DMTL(params=params2,
                             base_model=base_model,
                             label=labels[l],
                             loss='binary_crossentropy',
                             second_model=second_model,
                             phase=2,
                             data=data2)
                model.train(epochs[l],
                            load_best_weigth,
                            verbose,
                            TensorB,
                            name_of_best_weight + str(i) + ".h5",
                            "k_fold",
                            save_m=False)
                ans = model.evaluate()
                acc_vec.append(ans)
                print(ans)
                model.clear()
                del model
        return acc_vec