예제 #1
0
from FLAGS import *
from DataSet import DataSet
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as grid
plt.interactive(False)

LOG_PATH = '../straight/driving_log.csv'
IMG_PATH = '../straight/imgs/'
FILE_NAME = '../straight.p'

data = DataSet(LOG_PATH, IMG_PATH, sequence=TIME_STEPS)

features, labels = data.build_train_data()
pickle.dump({'features': features, 'labels': labels}, open(FILE_NAME, 'wb'))

fig = plt.figure(figsize=(40, 40))
idx = 6
gs = grid.GridSpec(idx, idx)

# VISUALIZE FRAME + STEER VALUES for i in range():
for i in range(idx):
    for j in range(idx):
        r = np.random.choice(len(features))
        img = features[r]
        ax = fig.add_subplot(gs[i * idx + j])
        title = "ID: {} Steer {:5.3f}  Speed {:5.3f} ".format(
            r, labels[r][0], labels[r][1])
        ax.set_title(title)
예제 #2
0
class Train(object):
    def __init__(self):
        os.environ["CUDA_VISIBLE_DEVICES"] = "1"
        self._set_args()
        self.args.dim = 6144
        self.args.disLayer = [6144, 6144]
        self.args.geneLayer = [6144, 6144]
        self.args.disLayer_s = [4096, 4096]
        self.args.geneLayer_s = [4096, 4096]
        self.args.maxEpochs = 100
        self.args.negNum = 50
        self.args.l2_weight = 1e-5
        self.data_set = DataSet()
        self.train()


    def _set_args(self):
        parser = argparse.ArgumentParser(description="Options")
        parser.add_argument('-negNum', action='store', dest='negNum', default=70, type=int)
        parser.add_argument('-dim', action='store', dest='dim', default=1024)
        parser.add_argument('-disLayer', action='store', dest='disLayer', default=[8192, 8192])
        parser.add_argument('-geneLayer', action='store', dest='geneLayer', default=[8192, 8192])
        parser.add_argument('-disLayer_s', action='store', dest='disLayer_s', default=[8192, 8192])
        parser.add_argument('-geneLayer_s', action='store', dest='geneLayer_s', default=[8192, 8192])
        parser.add_argument('-lr', action='store', dest='lr', default=0.000001)
        parser.add_argument('-maxEpochs', action='store', dest='maxEpochs', default=50, type=int)
        parser.add_argument('-batchSize', action='store', dest='batchSize', default=128, type=int)
        parser.add_argument('-earlyStop', action='store', dest='earlyStop', default=10)
        parser.add_argument('-checkPoint', action='store', dest='checkPoint', default='./checkPoint/')
        parser.add_argument('-testDisNum', action='store', dest='nTestDis', default=200)
        parser.add_argument('-l2_weight', action='store', dest='l2_weight', default=1e-5)
        parser.add_argument('-simPlus', action='store', dest='simPlus', default=0.2)
        parser.add_argument('-train_interval', action='store', dest='train_interval', default=2)

        self.args = parser.parse_args()

        # setting gpu
        self.config = tf.ConfigProto()
        self.config.gpu_options.allow_growth = True
        self.config.allow_soft_placement = True


    def train(self):
        print('train model...')
        dis_matrix = self.data_set.dis_matrix
        gene_matrix = self.data_set.gene_matrix
        n_dis = self.data_set.n_dis
        n_gene = self.data_set.n_gene

        data = [dis_matrix, gene_matrix, n_dis, n_gene,
                self.data_set.dis_symp_matrix,
                self.data_set.gene_go_matrix]
        model = Model(self.args, data)
        best_ap = 0
        best_epoch = -1
        best_pr = 0
        with tf.Session(config=self.config) as sess:
            sess.run(tf.global_variables_initializer())
            for epoch in range(self.args.maxEpochs):
                print("=" * 20 + "Epoch ", epoch, "=" * 20)
                self.run_epoch(sess, model)
                print('=' * 50)
                print("Start Evaluation!")

                prf_summary, ap, n_total_hit, n_total_test = self.evaluate(sess, model)
                top3_pr = prf_summary[0]
                top10_pr = prf_summary[6]
                print 'epoch:', epoch, '; AP:', ap, '; top@3 pr:', top3_pr, '; top@10 pr:', top10_pr
                result = [n_total_test, n_total_hit, ap] + prf_summary
                result = [str(x) for x in result]
                if best_ap < ap and best_pr < top3_pr:
                    best_ap = ap
                    best_pr = top3_pr
                    best_epoch = epoch

                print('\t'.join(result))
                if epoch - best_epoch > self.args.earlyStop:    # early stop
                    print("Normal Early stop!")
                    break
                print("=" * 20 + "Epoch ", epoch, "End" + "=" * 20)
            print("Training complete!")


    def run_epoch(self, sess, model):
        # train dis-gene network
        self.train_dg_net(sess, model)

    def train_dg_net(self, sess, model, verbose=1000):

        # train_dis, train_gene, label = self.data_set.train_data
        train_dis, train_gene, label = self.data_set.build_train_data(self.args.negNum)

        train_len = len(train_dis)
        shuffled_idx = np.random.permutation(np.arange(train_len))
        train_dis = train_dis[shuffled_idx]
        train_gene = train_gene[shuffled_idx]
        label = label[shuffled_idx]

        num_batches = train_len // self.args.batchSize + 1

        losses = []
        for i in range(num_batches):
            # if i > 1000: break
            min_idx = i * self.args.batchSize
            max_idx = np.min([train_len, (i + 1) * self.args.batchSize])
            train_d_batch = train_dis[min_idx: max_idx]
            train_g_batch = train_gene[min_idx: max_idx]
            train_l_batch = label[min_idx: max_idx]

            feed_dict = {model.dis: train_d_batch,
                         model.gene: train_g_batch,
                         model.dg_label: train_l_batch}

            _, loss, y = model.train_dg_net(sess, feed_dict)
            losses.append(loss)
            if verbose and i % verbose == 0:
                sys.stdout.write('\r{} / {} : loss = {}'.format(
                    i, num_batches, np.mean(losses[-verbose:])
                ))
                sys.stdout.flush()
        loss = np.mean(losses)
        print("\nMean loss in DG net is: {}".format(loss))
        return loss

    def evaluate(self, sess, model):
        evaluation = Evaluation()
        test_dis, test_gene, test_label = self.data_set.test_data

        n_total_hit = 0.0
        n_total_test = 0.0
        dis_num = len(test_dis)
        all_hit_list = list()
        for i in range(dis_num):
            if i % 100 == 0:
                print i, '/', dis_num
            feed_dict = {model.dis: test_dis[i],
                         model.gene: test_gene[i]}
            predict = model.predict_dg(sess, feed_dict)
            hit_list, n_known_genes, n_topk_hit = evaluation.get_top_genes(test_gene[i], predict[0], test_label[i])
            n_total_hit += n_topk_hit
            n_total_test += n_known_genes
            all_hit_list.append(hit_list)

        ap = n_total_hit / n_total_test
        prf_summary = evaluation.cal_prf(all_hit_list, n_total_test)

        return prf_summary, ap, n_total_hit, n_total_test