def add_model(self, fname, mtype, n_inputs):
     rnn = RNN(self.model_dir + fname)
     rnn.build_model(self.maxlen, self.embedding_matrix, mtype, n_inputs)
     self.models[fname] = rnn
Пример #2
0
def train(inputs_train, inputs_test, hidden_dim=None, update='adam2', sq_loss=False,
          lamb=0., drop=0., model='lstml', share=False, category=False, num_epoch=40, num_class=None, early_stop=False):

    Xs_train, y_train, start_batches_train, end_batches_train, len_batches_train = inputs_train
    Xs_test, y_test, start_batches_test, end_batches_test, len_batches_test = inputs_test

    n_train = Xs_train.shape[0]
    input_dim = Xs_train.shape[2]
    Xs_train = Xs_train.transpose([1, 0, 2])
    Xs_test = Xs_test.transpose([1, 0, 2])

    Xs_train_shared = theano.shared(Xs_train, borrow=True)
    y_train_shared = theano.shared(y_train, borrow=True)
    Xs_test_shared = theano.shared(Xs_test, borrow=True)
    y_test_shared = theano.shared(y_test, borrow=True)

    if category:
        n_class = num_class
    else:
        n_class = 1

    ra = RNN(input_dim, hidden_dim, [n_class], lamb=lamb, model=model, share=share, update=update, drop=drop,
             sq_loss=sq_loss)
    symbols = ra.build_model()

    X_batch, y_batch, is_train = symbols['X_batch'], symbols['y_batch'], symbols['is_train']
    att, pred, loss = symbols['att'], symbols['pred'], symbols['loss']
    cost, updates = symbols['cost'], symbols['updates']
    loss_krip, acc = symbols['loss_krip'], symbols['acc']

    print 'Compiling function'

    start_symbol, end_symbol = T.lscalar(), T.lscalar()
    len_symbol = T.iscalar()
    if category:
        outputs = [cost, acc, pred]
    else:
        outputs = [cost, loss_krip, pred]

    train_model = theano.function(inputs=[start_symbol, end_symbol, len_symbol, is_train],
                                  outputs=outputs, updates=updates,
                                  givens={
                                      X_batch: Xs_train_shared[:len_symbol, start_symbol: end_symbol, :],
                                      y_batch: y_train_shared[start_symbol: end_symbol]},
                                  on_unused_input='ignore', mode='FAST_RUN')
    print 'Compilation done 1'
    test_model = theano.function(inputs=[start_symbol, end_symbol, len_symbol, is_train],
                                 outputs=outputs,
                                 givens={
                                     X_batch: Xs_test_shared[:len_symbol, start_symbol: end_symbol, :],
                                     y_batch: y_test_shared[start_symbol: end_symbol]},
                                 on_unused_input='ignore', mode='FAST_RUN')
    print 'Compilation done 2'

    costs_train, costs_test = [], []
    best_acc = None
    best_actual_test = None
    best_pred_test = None
    best_epoch = 0
    num_iter = len(start_batches_train)
    for epoch_index in xrange(num_epoch):
        cost_avg = 0.
        all_actual, all_pred = [], []
        print 'Epoch = %d' % (epoch_index + 1)
        for iter_index in xrange(num_iter):
            start, end = start_batches_train[iter_index], end_batches_train[iter_index]
            length = len_batches_train[iter_index]
            if length == 0:
                continue
            cost, tmp, pred = train_model(start, end, length, 1)
            cost_avg += cost * (end - start)
            all_actual += y_train[start: end].tolist()
            all_pred += pred.tolist()
            if (iter_index + 1) % 100 == 0:
                print iter_index + 1, '/', num_iter
        cost_avg /= n_train
        costs_train.append(cost_avg)
        y_actual = numpy.asarray(all_actual)
        y_predicted = numpy.asarray(all_pred)

        acc = eval(y_actual, y_predicted, category=category)
        print '\tTrain cost = %f,\tAccuracy = %f' % (cost_avg, acc)
        acc_test, actual_test, pred_test = test(test_model, start_batches_test, end_batches_test, len_batches_test,
                                                    y_test, costs_test, category=category)
        if best_acc is None:
            best_acc = acc_test
            best_actual_test = actual_test
            best_pred_test = pred_test
            best_epoch = epoch_index
        elif acc_test > best_acc:
            best_acc = acc_test
            best_actual_test = actual_test
            best_pred_test = pred_test
            best_epoch = epoch_index
        # Early Stopping
        if early_stop and epoch_index - best_epoch >= 3 and epoch_index >= num_epoch // 4:
            break
    print 'Best Epoch = %d, Best ACC in Test = %f' % (best_epoch + 1, best_acc)
    return best_actual_test, best_pred_test