Skip to content

Commit 4c1a18e

Browse files
author
Yoon, Hong-Jun
committed
Add new benchmark P3B3: MT-CNN
1 parent 9117e7f commit 4c1a18e

File tree

4 files changed

+385
-0
lines changed

4 files changed

+385
-0
lines changed

Pilot3/P3B3/keras_mt_shared_cnn.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
Code to export keras architecture/placeholder weights for MT CNN
3+
Written by Mohammed Alawad
4+
Date: 10_20_2017
5+
"""
6+
import numpy as np
7+
#np.random.seed(1337)
8+
from keras.models import Model
9+
from keras.layers import Dense, Activation, Dropout, Flatten, Input, Embedding
10+
from keras.layers import merge as Merge
11+
from keras.layers import GlobalMaxPooling1D, Convolution1D
12+
#from keras.layers.convolutional import Conv1D
13+
from keras.layers.merge import Concatenate
14+
from keras import optimizers
15+
import keras.backend as K
16+
from keras.regularizers import l2
17+
import pickle
18+
import argparse
19+
import os
20+
from keras.initializers import RandomUniform,lecun_uniform
21+
22+
def init_export_network(num_classes,
23+
in_seq_len,
24+
vocab_size,
25+
wv_space,
26+
filter_sizes,
27+
num_filters,
28+
concat_dropout_prob,
29+
emb_l2,
30+
w_l2,
31+
optimizer):
32+
33+
34+
# define network layers ----------------------------------------------------
35+
input_shape = tuple([in_seq_len])
36+
model_input = Input(shape=input_shape, name= "Input")
37+
# embedding lookup
38+
emb_lookup = Embedding(vocab_size,
39+
wv_space,
40+
input_length=in_seq_len,
41+
name="embedding",
42+
#embeddings_initializer=RandomUniform,
43+
embeddings_regularizer=l2(emb_l2))(model_input)
44+
# convolutional layer and dropout
45+
conv_blocks = []
46+
for ith_filter,sz in enumerate(filter_sizes):
47+
conv = Convolution1D(filters=num_filters[ ith_filter ],
48+
kernel_size=sz,
49+
padding="same",
50+
activation="relu",
51+
strides=1,
52+
# kernel_initializer ='lecun_uniform,
53+
name=str(ith_filter) + "_thfilter")(emb_lookup)
54+
conv_blocks.append(GlobalMaxPooling1D()(conv))
55+
concat = Concatenate()(conv_blocks) if len(conv_blocks) > 1 else conv_blocks[0]
56+
concat_drop = Dropout(concat_dropout_prob)(concat)
57+
58+
# different dense layer per tasks
59+
FC_models = []
60+
for i in range(len(num_classes)):
61+
outlayer = Dense(num_classes[i], name= "Dense"+str(i), activation='softmax')( concat_drop )#, kernel_regularizer=l2(0.01))( concat_drop )
62+
FC_models.append(outlayer)
63+
64+
65+
# the multitsk model
66+
model = Model(inputs=model_input, outputs = FC_models)
67+
model.compile( loss= "sparse_categorical_crossentropy", optimizer= optimizer, metrics=[ "acc" ] )
68+
69+
return model
70+
71+
if __name__ == '__main__':
72+
main()
73+

Pilot3/P3B3/p3b3.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import os
4+
import sys
5+
import argparse
6+
try:
7+
import configparser
8+
except ImportError:
9+
import ConfigParser as configparser
10+
11+
file_path = os.path.dirname(os.path.realpath(__file__))
12+
lib_path = os.path.abspath(os.path.join(file_path, '..', 'common'))
13+
sys.path.append(lib_path)
14+
lib_path2 = os.path.abspath(os.path.join(file_path, '..', '..', 'common'))
15+
sys.path.append(lib_path2)
16+
17+
import p3_common
18+
19+
def common_parser(parser):
20+
21+
parser.add_argument("--config_file", dest='config_file', type=str,
22+
default=os.path.join(file_path, 'p3b3_default_model.txt'),
23+
help="specify model configuration file")
24+
25+
# Parse has been split between arguments that are common with the default neon parser
26+
# and all the other options
27+
parser = p3_common.get_default_neon_parse(parser)
28+
parser = p3_common.get_p3_common_parser(parser)
29+
30+
# Arguments that are applicable just to p3b1
31+
parser = p3b3_parser(parser)
32+
33+
return parser
34+
35+
def p3b3_parser(parser):
36+
### Hyperparameters and model save path
37+
38+
# these are leftover from other models but don't conflict so leave for now
39+
parser.add_argument("--train", action="store_true",dest="train_bool",default=True,help="Invoke training")
40+
parser.add_argument("--evaluate", action="store_true",dest="eval_bool",default=False,help="Use model for inference")
41+
parser.add_argument("--home-dir",help="Home Directory",dest="home_dir",type=str,default='.')
42+
parser.add_argument("--save-dir",help="Save Directory",dest="save_path",type=str,default=None)
43+
parser.add_argument("--config-file",help="Config File",dest="config_file",type=str,default=os.path.join(file_path, 'p3b3_default_model.txt'))
44+
parser.add_argument("--memo",help="Memo",dest="base_memo",type=str,default=None)
45+
parser.add_argument("--seed", action="store_true",dest="seed",default=False,help="Random Seed")
46+
parser.add_argument("--case",help="[Full, Center, CenterZ]",dest="case",type=str,default='CenterZ')
47+
parser.add_argument("--fig", action="store_true",dest="fig_bool",default=False,help="Generate Prediction Figure")
48+
49+
# MTL_run params start here
50+
parser.add_argument("-v", "--verbose", action="store_true",
51+
default= True,
52+
help="increase output verbosity")
53+
54+
parser.add_argument("--dropout", action="store",
55+
default=argparse.SUPPRESS, # DROPOUT, type=float,
56+
help="ratio of dropout used in fully connected layers")
57+
parser.add_argument("--learning_rate", action='store',
58+
default=argparse.SUPPRESS, # LEARNING_RATE, type=float,
59+
help='learning rate')
60+
61+
parser.add_argument("--train_features", action="store",
62+
default='data/train_X.npy',
63+
help='training feature data filenames')
64+
parser.add_argument("--train_truths", action="store",
65+
default='data/train_Y.npy',
66+
help='training truth data filenames')
67+
68+
parser.add_argument("--valid_features", action="store",
69+
default='data/test_X.npy',
70+
help='validation feature data filenames')
71+
parser.add_argument("--valid_truths", action="store",
72+
default='data/test_Y.npy',
73+
help='validation truth data filenames')
74+
75+
parser.add_argument("--output_files", action="store",
76+
default='result.csv',
77+
help="output filename")
78+
79+
# parser.add_argument("--shared_nnet_spec", action="store",
80+
# default=argparse.SUPPRESS, # DEF_SHARED_NNET_SPEC,
81+
# help='network structure of shared layer')
82+
# parser.add_argument("--individual_nnet_spec", action="store",
83+
# default=argparse.SUPPRESS, # DEF_INDIV_NNET_SPEC,
84+
# help='network structore of task-specific layer')
85+
86+
return parser
87+
88+
89+
def read_config_file(File):
90+
config=configparser.ConfigParser()
91+
config.read(File)
92+
section=config.sections()
93+
Global_Params={}
94+
95+
Global_Params['learning_rate'] =eval(config.get(section[0],'learning_rate'))
96+
Global_Params['batch_size'] =eval(config.get(section[0],'batch_size'))
97+
Global_Params['epochs'] =eval(config.get(section[0],'epochs'))
98+
Global_Params['dropout'] =eval(config.get(section[0],'dropout'))
99+
100+
Global_Params['optimizer'] =eval(config.get(section[0],'optimizer'))
101+
102+
Global_Params['wv_len'] =eval(config.get(section[0],'wv_len'))
103+
Global_Params['filter_sizes'] =eval(config.get(section[0],'filter_sizes'))
104+
Global_Params['filter_sets'] =eval(config.get(section[0],'filter_sets'))
105+
Global_Params['num_filters'] =eval(config.get(section[0],'num_filters'))
106+
107+
Global_Params['emb_l2'] =eval(config.get(section[0],'emb_l2'))
108+
Global_Params['w_l2'] =eval(config.get(section[0],'w_l2'))
109+
110+
111+
# note 'cool' is a boolean
112+
#Global_Params['cool'] =config.get(section[0],'cool')
113+
return Global_Params
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
from __future__ import print_function
2+
import numpy as np
3+
import os, sys, gzip
4+
import urllib, zipfile
5+
TIMEOUT=1800 # in sec; set this to -1 for no timeout
6+
7+
import keras
8+
from keras import backend as K
9+
import math
10+
from keras.layers.core import Dense, Dropout
11+
from keras import optimizers
12+
13+
from keras.layers import Input
14+
from keras.models import Model
15+
16+
from sklearn.metrics import f1_score
17+
18+
import argparse
19+
20+
import p3b3
21+
import p3_common as p3c
22+
import p3_common_keras as p3ck
23+
from solr_keras import CandleRemoteMonitor, compute_trainable_params, TerminateOnTimeOut
24+
25+
import keras_mt_shared_cnn
26+
27+
28+
29+
def get_p3b3_parser():
30+
parser = argparse.ArgumentParser(prog='p3b3_baseline',
31+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
32+
description='Multi-task CNN for data extraction from clinical reports - Pilot 3 Benchmark 3')
33+
34+
return p3b3.common_parser(parser)
35+
36+
def initialize_parameters():
37+
parser = get_p3b3_parser()
38+
args = parser.parse_args()
39+
print('Args', args)
40+
41+
GP=p3b3.read_config_file(args.config_file)
42+
print(GP)
43+
44+
GP = p3c.args_overwrite_config(args, GP)
45+
return GP
46+
47+
48+
49+
def run_cnn( GP, train_x, train_y, test_x, test_y,
50+
learning_rate = 0.01,
51+
batch_size = 10,
52+
epochs = 10,
53+
dropout = 0.5,
54+
optimizer = 'adam',
55+
wv_len = 300,
56+
filter_sizes = [3,4,5],
57+
num_filters = [300,300,300],
58+
emb_l2 = 0.001,
59+
w_l2 = 0.01
60+
):
61+
62+
max_vocab = np.max( train_x )
63+
max_vocab2 = np.max( test_x )
64+
if max_vocab2 > max_vocab:
65+
max_vocab = max_vocab2
66+
67+
wv_mat = np.random.randn( max_vocab + 1, wv_len ).astype( 'float32' ) * 0.1
68+
69+
num_classes = []
70+
num_classes.append( np.max( train_y[ :, 0 ] ) + 1 )
71+
num_classes.append( np.max( train_y[ :, 1 ] ) + 1 )
72+
num_classes.append( np.max( train_y[ :, 2 ] ) + 1 )
73+
num_classes.append( np.max( train_y[ :, 3 ] ) + 1 )
74+
75+
76+
kerasDefaults = p3c.keras_default_config()
77+
optimizer = p3ck.build_optimizer( optimizer, learning_rate, kerasDefaults )
78+
79+
80+
cnn = keras_mt_shared_cnn.init_export_network(
81+
num_classes= num_classes,
82+
in_seq_len= 1500,
83+
vocab_size= len( wv_mat ),
84+
wv_space= wv_len,
85+
filter_sizes= filter_sizes,
86+
num_filters= num_filters,
87+
concat_dropout_prob = dropout,
88+
emb_l2= emb_l2,
89+
w_l2= w_l2,
90+
optimizer= optimizer )
91+
92+
print( cnn.summary() )
93+
94+
validation_data = ( { 'Input': test_x },
95+
{ 'Dense0': test_y[ :, 0 ],
96+
'Dense1': test_y[ :, 1 ],
97+
'Dense2': test_y[ :, 2 ],
98+
'Dense3': test_y[ :, 3 ] } )
99+
100+
candleRemoteMonitor = CandleRemoteMonitor(params= GP)
101+
timeoutMonitor = TerminateOnTimeOut(TIMEOUT)
102+
103+
history = cnn.fit(
104+
x= np.array( train_x ),
105+
y= [ np.array( train_y[ :, 0 ] ),
106+
np.array( train_y[ :, 1 ] ),
107+
np.array( train_y[ :, 2 ] ),
108+
np.array( train_y[ :, 3 ] ) ],
109+
batch_size= batch_size,
110+
epochs= epochs,
111+
verbose= 2,
112+
validation_data= validation_data,
113+
callbacks = [candleRemoteMonitor, timeoutMonitor]
114+
)
115+
116+
return history
117+
118+
119+
def run( GP ):
120+
filter_sizes = []
121+
num_filters = []
122+
123+
start = GP[ 'filter_sizes' ]
124+
end = start + GP[ 'filter_sets' ]
125+
n_filters = GP[ 'num_filters' ]
126+
for k in range( start, end ):
127+
filter_sizes.append( k )
128+
num_filters.append( n_filters )
129+
130+
learning_rate = GP[ 'learning_rate' ]
131+
batch_size = GP[ 'batch_size' ]
132+
epochs = GP[ 'epochs' ]
133+
dropout = GP[ 'dropout' ]
134+
optimizer = GP[ 'optimizer' ]
135+
136+
wv_len = GP[ 'wv_len' ]
137+
emb_l2 = GP[ 'emb_l2' ]
138+
w_l2 = GP[ 'w_l2' ]
139+
140+
141+
'''
142+
## Read files
143+
file_path = os.path.dirname(os.path.realpath(__file__))
144+
print(file_path)
145+
lib_path = os.path.abspath(os.path.join(file_path, '..', '..', 'common'))
146+
sys.path.append(lib_path)
147+
148+
from data_utils import get_file
149+
origin = 'http://ftp.mcs.anl.gov/pub/candle/public/benchmarks/P3B1/P3B1_data.tar.gz'
150+
data_set = 'P3B1_data'
151+
data_path = get_file(data_set, origin, untar=True, md5_hash=None, cache_subdir='P3B1')
152+
153+
print('Data downloaded and stored at: ' + os.path.dirname(data_path))
154+
print('Data path:' + data_path)
155+
'''
156+
data_path = '/lustre/atlas/proj-shared/csc249/yoonh/Benchmarks/Data/Pilot3'
157+
158+
train_x = np.load( data_path + '/train_X.npy' )
159+
train_y = np.load( data_path + '/train_Y.npy' )
160+
test_x = np.load( data_path + '/test_X.npy' )
161+
test_y = np.load( data_path + '/test_Y.npy' )
162+
163+
164+
ret = run_cnn(
165+
GP,
166+
train_x, train_y, test_x, test_y,
167+
learning_rate = learning_rate,
168+
batch_size = batch_size,
169+
epochs = epochs,
170+
dropout = dropout,
171+
optimizer = optimizer,
172+
wv_len = wv_len,
173+
filter_sizes = filter_sizes,
174+
num_filters = num_filters,
175+
emb_l2 = emb_l2,
176+
w_l2 = w_l2
177+
)
178+
179+
print( 'Average loss:', str( ret.history['val_loss'] ) )
180+
return ret
181+
182+
183+
if __name__ == "__main__":
184+
gParameters=initialize_parameters()
185+
avg_loss = run(gParameters)
186+

Pilot3/P3B3/p3b3_default_model.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
[Global_Params]
2+
learning_rate = 0.01
3+
batch_size = 10
4+
epochs = 10
5+
dropout = 0.5
6+
optimizer = 'adam'
7+
wv_len = 300
8+
filter_sizes = 3
9+
filter_sets = 3
10+
num_filters = 300
11+
emb_l2 = 0.001
12+
w_l2 = 0.01
13+

0 commit comments

Comments
 (0)