test_understand_sentiment_lstm.py 3.2 KB
Newer Older
Q
Qiao Longfei 已提交
1
import numpy as np
Y
Yang Yang(Tony) 已提交
2
import paddle.v2 as paddle
Q
Qiao Longfei 已提交
3
import paddle.v2.fluid.core as core
4
import paddle.v2.fluid.framework as framework
Q
Qiao Longfei 已提交
5
import paddle.v2.fluid.layers as layers
Q
Qiao Longfei 已提交
6
from paddle.v2.fluid.executor import Executor
Q
Qiao Longfei 已提交
7
from paddle.v2.fluid.optimizer import AdamOptimizer
Y
Yang Yang(Tony) 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34


def lstm_net(dict_dim, class_dim=2, emb_dim=32, seq_len=80, batch_size=50):
    data = layers.data(
        name="words",
        shape=[seq_len * batch_size, 1],
        append_batch_size=False,
        data_type="int64")
    label = layers.data(
        name="label",
        shape=[batch_size, 1],
        append_batch_size=False,
        data_type="int64")

    emb = layers.embedding(input=data, size=[dict_dim, emb_dim])
    emb = layers.reshape(x=emb, shape=[batch_size, seq_len, emb_dim])
    emb = layers.transpose(x=emb, axis=[1, 0, 2])

    c_pre_init = layers.fill_constant(
        dtype=emb.data_type, shape=[batch_size, emb_dim], value=0.0)
    layer_1_out = layers.lstm(emb, c_pre_init=c_pre_init, hidden_dim=emb_dim)
    layer_1_out = layers.transpose(x=layer_1_out, axis=[1, 0, 2])

    prediction = layers.fc(input=layer_1_out, size=class_dim, act="softmax")
    cost = layers.cross_entropy(input=prediction, label=label)

    avg_cost = layers.mean(x=cost)
Q
Qiao Longfei 已提交
35
    adam_optimizer = AdamOptimizer(learning_rate=0.002)
Y
Yang Yang(Tony) 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    opts = adam_optimizer.minimize(avg_cost)
    acc = layers.accuracy(input=prediction, label=label)

    return avg_cost, acc


def to_lodtensor(data, place):
    seq_lens = [len(seq) for seq in data]
    cur_len = 0
    lod = [cur_len]
    for l in seq_lens:
        cur_len += l
        lod.append(cur_len)
    flattened_data = np.concatenate(data, axis=0).astype("int64")
    flattened_data = flattened_data.reshape([len(flattened_data), 1])
    res = core.LoDTensor()
    res.set(flattened_data, place)
    res.set_lod([lod])
    return res


def chop_data(data, chop_len=80, batch_len=50):
    data = [(x[0][:chop_len], x[1]) for x in data if len(x[0]) >= chop_len]

    return data[:batch_len]


def prepare_feed_data(data, place):
    tensor_words = to_lodtensor(map(lambda x: x[0], data), place)

    label = np.array(map(lambda x: x[1], data)).astype("int64")
    label = label.reshape([50, 1])
    tensor_label = core.LoDTensor()
    tensor_label.set(label, place)

    return tensor_words, tensor_label


def main():
    word_dict = paddle.dataset.imdb.word_dict()
    cost, acc = lstm_net(dict_dim=len(word_dict), class_dim=2)

    batch_size = 100
    train_data = paddle.batch(
        paddle.reader.buffered(
            paddle.dataset.imdb.train(word_dict), size=batch_size * 10),
        batch_size=batch_size)

    data = chop_data(next(train_data()))

    place = core.CPUPlace()
    tensor_words, tensor_label = prepare_feed_data(data, place)
    exe = Executor(place)
89
    exe.run(framework.default_startup_program())
Y
Yang Yang(Tony) 已提交
90 91

    while True:
92
        outs = exe.run(framework.default_main_program(),
Y
Yang Yang(Tony) 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105
                       feed={"words": tensor_words,
                             "label": tensor_label},
                       fetch_list=[cost, acc])
        cost_val = np.array(outs[0])
        acc_val = np.array(outs[1])

        print("cost=" + str(cost_val) + " acc=" + str(acc_val))
        if acc_val > 0.9:
            break


if __name__ == '__main__':
    main()