-
Notifications
You must be signed in to change notification settings - Fork 1
/
mlp.py
executable file
·76 lines (60 loc) · 2.2 KB
/
mlp.py
1
2
3
4
5
6
7
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
35
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
#!/usr/bin/env python3
import sys
import argparse
import numpy as np
from chainer import Chain, cuda, optimizers, Variable, serializers
from chainn import functions as UF
from chainn.model import MLP
from chainn.util import Vocabulary
from chainn.util import ModelFile
xp = None
def parse_args():
parser = argparse.ArgumentParser("Program for multi-class classification using multi layered perceptron")
parser.add_argument("--batch", type=int, help="Minibatch size", default=64)
parser.add_argument("--init_model", required=True, type=str, help="Initiate the model from previous")
parser.add_argument("--use_cpu", action="store_true")
return parser.parse_args()
def main():
args = parse_args()
init_program_state(args)
# Variable
batch_size = args.batch
# Setup model
UF.trace("Setting up classifier")
model = load_model(args)
if not args.use_cpu: model = model.to_gpu()
# data
UF.trace("Loading corpus + dictionary")
test = load_data(sys.stdin, model._feat, model._input)
for i in range(0, len(test), batch_size):
x_data = Variable(test[i:i+batch_size])
y_data = model(x_data)
UF.print_classification(y_data.data, model._trg)
def load_model(args):
with ModelFile(open(args.init_model)) as model_in:
return MLP.load(model_in)
def load_data(fp, x_ids, input_size):
holder = []
# Reading in the data
for line in fp:
sent = line.strip().lower().split()
for i, feat in enumerate(sent):
feat_name, feat_score = feat.split("_:_")
feat_score = float(feat_score)
if feat_name in x_ids:
sent[i] = (x_ids[feat_name], feat_score)
holder.append(sent)
# Creating an appropriate data structure
num, dim = len(holder), input_size
data = xp.zeros(num * dim, dtype = np.float32).reshape((num, dim))
for i, sent in enumerate(holder):
for item in sent:
if type(item) == tuple:
feat_name, feat_score = item
data[i][feat_name] += feat_score
return data
def init_program_state(args):
global xp
xp = np if args.use_cpu else cuda.cupy
if __name__ == "__main__":
main()