text_classification_dnn.py 4.3 KB
Newer Older
1
import sys
F
fengjiayi 已提交
2
import math
3 4 5 6 7
import paddle.v2 as paddle
import gzip


def fc_net(input_dim, class_dim=2, emb_dim=256):
F
fengjiayi 已提交
8
    # input layers
9 10 11 12
    data = paddle.layer.data("word",
                             paddle.data_type.integer_value_sequence(input_dim))
    lbl = paddle.layer.data("label", paddle.data_type.integer_value(class_dim))

F
fengjiayi 已提交
13
    # embedding layer
14
    emb = paddle.layer.embedding(input=data, size=emb_dim)
F
fengjiayi 已提交
15
    # max pooling
16 17 18
    seq_pool = paddle.layer.pooling(
        input=emb, pooling_type=paddle.pooling.Max())

F
fengjiayi 已提交
19
    # two hidden layers
F
fengjiayi 已提交
20 21
    hd_layer_size = [128, 32]
    hd_layer_init_std = [1.0 / math.sqrt(s) / 3.0 for s in hd_layer_size]
22 23
    hd1 = paddle.layer.fc(
        input=seq_pool,
F
fengjiayi 已提交
24
        size=hd_layer_size[0],
25
        act=paddle.activation.Tanh(),
F
fengjiayi 已提交
26
        param_attr=paddle.attr.Param(initial_std=hd_layer_init_std[0]))
27 28
    hd2 = paddle.layer.fc(
        input=hd1,
F
fengjiayi 已提交
29
        size=hd_layer_size[1],
30
        act=paddle.activation.Tanh(),
F
fengjiayi 已提交
31
        param_attr=paddle.attr.Param(initial_std=hd_layer_init_std[1]))
32

F
fengjiayi 已提交
33
    # output layer
34 35 36 37
    output = paddle.layer.fc(
        input=hd2,
        size=class_dim,
        act=paddle.activation.Softmax(),
F
fengjiayi 已提交
38 39
        param_attr=paddle.attr.Param(initial_std=1.0 / math.sqrt(class_dim) /
                                     3.0))
40 41 42

    cost = paddle.layer.classification_cost(input=output, label=lbl)

F
fengjiayi 已提交
43
    return cost, output, lbl
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61


def train_dnn_model(num_pass):
    # load word dictionary
    print 'load dictionary...'
    word_dict = paddle.dataset.imdb.word_dict()

    dict_dim = len(word_dict)
    class_dim = 2
    # define data reader
    train_reader = paddle.batch(
        paddle.reader.shuffle(
            lambda: paddle.dataset.imdb.train(word_dict), buf_size=1000),
        batch_size=100)
    test_reader = paddle.batch(
        lambda: paddle.dataset.imdb.test(word_dict), batch_size=100)

    # network config
F
fengjiayi 已提交
62 63
    [cost, output, label] = fc_net(dict_dim, class_dim=class_dim)

64 65 66 67 68 69 70 71
    # create parameters
    parameters = paddle.parameters.create(cost)
    # create optimizer
    adam_optimizer = paddle.optimizer.Adam(
        learning_rate=2e-3,
        regularization=paddle.optimizer.L2Regularization(rate=8e-4),
        model_average=paddle.optimizer.ModelAverage(average_window=0.5))

F
fengjiayi 已提交
72 73 74
    # add auc evaluator
    paddle.evaluator.auc(input=output, label=label)

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    # create trainer
    trainer = paddle.trainer.SGD(
        cost=cost, parameters=parameters, update_equation=adam_optimizer)

    # Define end batch and end pass event handler
    def event_handler(event):
        if isinstance(event, paddle.event.EndIteration):
            if event.batch_id % 100 == 0:
                print "\nPass %d, Batch %d, Cost %f, %s" % (
                    event.pass_id, event.batch_id, event.cost, event.metrics)
            else:
                sys.stdout.write('.')
                sys.stdout.flush()
        if isinstance(event, paddle.event.EndPass):
            result = trainer.test(reader=test_reader, feeding=feeding)
            print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
F
fengjiayi 已提交
91 92
            with gzip.open("dnn_params_pass" + str(event.pass_id) + ".tar.gz",
                           'w') as f:
93 94 95 96 97 98 99 100 101 102 103 104 105
                parameters.to_tar(f)

    # begin training network
    feeding = {'word': 0, 'label': 1}
    trainer.train(
        reader=train_reader,
        event_handler=event_handler,
        feeding=feeding,
        num_passes=num_pass)

    print("Training finished.")


F
fengjiayi 已提交
106
def dnn_infer(file_name):
107 108 109 110 111 112
    print("Begin to predict...")

    word_dict = paddle.dataset.imdb.word_dict()
    dict_dim = len(word_dict)
    class_dim = 2

F
fengjiayi 已提交
113
    [_, output, _] = fc_net(dict_dim, class_dim=class_dim)
F
fengjiayi 已提交
114
    parameters = paddle.parameters.Parameters.from_tar(gzip.open(file_name))
115 116

    infer_data = []
F
fengjiayi 已提交
117
    infer_data_label = []
118 119
    for item in paddle.dataset.imdb.test(word_dict):
        infer_data.append([item[0]])
F
fengjiayi 已提交
120
        infer_data_label.append(item[1])
121 122 123 124 125 126 127

    predictions = paddle.infer(
        output_layer=output,
        parameters=parameters,
        input=infer_data,
        field=['value'])
    for i, prob in enumerate(predictions):
F
fengjiayi 已提交
128
        print prob, infer_data_label[i]
129 130 131 132


if __name__ == "__main__":
    paddle.init(use_gpu=False, trainer_count=4)
F
fengjiayi 已提交
133 134 135 136
    num_pass = 5
    train_dnn_model(num_pass=num_pass)
    param_file_name = "dnn_params_pass" + str(num_pass - 1) + ".tar.gz"
    dnn_infer(file_name=param_file_name)