Esempio n. 1
0
def construct_tree(tree):
    # tree: {index1:{'parent':, 'maxL':, 'vec':}

    # 1. ini tree node
    index2node = {}
    for i in tree:
        node = BU_RvNN.NodeTweet(idx=i)
        index2node[i] = node

    # 2. construct tree
    _j = 0
    root = None
    for _j in tree:
        index_c = _j
        index_p = tree[_j]['parent']
        node_c = index2node[index_c]
        word_freq, word_index = str2matrix(tree[_j]['vec'], tree[_j]['maxL'])
        node_c.index = word_index
        node_c.word = word_freq

        # not root node
        if not index_p == 'None':
            node_p = index2node[int(index_p)]
            node_c.parent = node_p
            node_p.children.append(node_c)
        # root node
        else:
            root = node_c

    # 3. convert tree to DNN input
    degree = tree[_j]['max_degree']
    x_word, x_index, tree = BU_RvNN.gen_nn_inputs(root, max_degree=degree, only_leaves_have_vals=False)
    return x_word, x_index, tree
Esempio n. 2
0
def constructTree(tree):
    ## 1. ini tree node
    index2node = {}
    for i in tree:
        node = BU_RvNN.Node_tweet(idx=i)
        index2node[i] = node
    ## 2. construct tree
    for j in tree:
        indexC = j
        indexP = tree[j]['parent']
        nodeC = index2node[indexC]
        wordFreq, wordIndex = str2matrix(tree[j]['vec'], tree[j]['maxL'])
        nodeC.index = wordIndex
        nodeC.word = wordFreq
        ## not root node ##
        if not indexP == 'None':
            nodeP = index2node[int(indexP)]
            nodeC.parent = nodeP
            nodeP.children.append(nodeC)
        ## root node ##
        else:
            root = nodeC
    ## 3. convert tree to DNN input
    degree = tree[j]['max_degree']
    x_word, x_index, tree = BU_RvNN.gen_nn_inputs(root, max_degree=degree, only_leaves_have_vals=False)
    return x_word, x_index, tree
Esempio n. 3
0
        c += 1
    print (l1,l2,l3,l4)
    print ("train no:", len(tree_train), len(word_train), len(index_train),len(y_train)) 
    print ("test no:", len(tree_test), len(word_test), len(index_test), len(y_test))
    print ("dim1 for 0:", len(tree_train[0]), len(word_train[0]), len(index_train[0]))
    print ("case 0:", tree_train[0][0], word_train[0][0], index_train[0][0])
    #exit(0)
    return tree_train, word_train, index_train, y_train, tree_test, word_test, index_test, y_test

##################################### MAIN ####################################        
## 1. load tree & word & index & label
tree_train, word_train, index_train, y_train, tree_test, word_test, index_test, y_test = loadData()

## 2. ini RNN model
t0 = time.time()
model = BU_RvNN.RvNN(vocabulary_size, hidden_dim, Nclass)
t1 = time.time()
print ('Recursive model established,', (t1-t0)/60)

#if os.path.isfile(modelPath):
#   load_model_Recursive_gruEmb(modelPath, model) 
######debug here######
#print len(tree_test[121]), len(index_test[121]), len(word_test[121])
#print tree_test[121]
#exit(0)
#loss, pred_y = model.train_step_up(word_test[121], index_test[121], tree_test[121], y_test[121], lr)
#print loss, pred_y
#exit(0)
######################

## 3. looping SGD
Esempio n. 4
0
def run(_vocabulary_size, _hidden_dim, _n_class, _n_epoch, _learning_rate,
        _label_path, _tree_path, _train_path, _test_path, _eid_pool):
    
    # 1. load tree & word & index & label
    tree_train, word_train, index_train, y_train, tree_test, word_test, index_test, y_test = load_data(
        _label_path, _tree_path, _train_path, _test_path, _eid_pool
    )

    # 2. ini RNN model
    t0 = time.time()
    model = BU_RvNN.RvNN(_vocabulary_size, _hidden_dim, _n_class)
    t1 = time.time()
    print('Recursive model established,', (t1 - t0) / 60)

    # if os.path.isfile(modelPath):
    #   load_model_Recursive_gruEmb(modelPath, model) 
    # debug here
    # print len(tree_test[121]), len(index_test[121]), len(word_test[121])
    # print tree_test[121]
    # exit(0)
    # loss, pred_y = model.train_step_up(word_test[121], index_test[121], tree_test[121], y_test[121], lr)
    # print loss, pred_y
    # exit(0)

    # 3. looping SGD
    losses_5, losses = [], []
    num_examples_seen = 0
    for epoch in range(_n_epoch):

        # one SGD
        indexes = [i for i in range(len(y_train))]
        random.shuffle(indexes)
        for i in indexes:
            # print i,
            loss, pred_y = model.train_step_up(word_train[i], index_train[i], tree_train[i], y_train[i], _learning_rate)

            # print loss, pred_y
            losses.append(loss)
            num_examples_seen += 1

        print("epoch=%d: loss=%f" % (epoch, np.mean(losses)))
        # floss.write(str(time)+": epoch="+str(epoch)+" loss="+str(loss) +'\n')
        sys.stdout.flush()

        # cal loss & evaluate
        if epoch % 5 == 0:
            losses_5.append((num_examples_seen, np.mean(losses)))
            time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            print(
                "%s: Loss after num_examples_seen=%d epoch=%d: %f" %
                (time_now, num_examples_seen, epoch, np.mean(losses))
            )
            # floss.write(str(time)+": epoch="+str(epoch)+" loss="+str(loss) +'\n')
            # floss.flush()
            sys.stdout.flush()
            prediction = []
            for j in range(len(y_test)):
                # print j
                prediction.append(model.predict_up(word_test[j], index_test[j], tree_test[j]))
            res = evaluation_4class(prediction, y_test)
            print('results:', res)
            # floss.write(str(res)+'\n')
            # floss.flush()
            sys.stdout.flush()

            # Adjust the learning rate if loss increases
            if len(losses_5) > 1 and losses_5[-1][1] > losses_5[-2][1]:
                _learning_rate = _learning_rate * 0.5
                print("Setting learning rate to %f" % _learning_rate)
                # floss.write("Setting learning rate to:"+str(lr)+'\n')
                # floss.flush()
                sys.stdout.flush()
            # save_model_Recursive_gruEmb(modelPath, model)
        sys.stdout.flush()
        losses = []