-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathcnn_model.py
More file actions
100 lines (78 loc) · 4.21 KB
/
Copy pathcnn_model.py
File metadata and controls
100 lines (78 loc) · 4.21 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
from keras.layers import Input, Dense, Embedding, Conv2D, MaxPool2D
from keras.layers import Reshape, Flatten, Dropout, Concatenate
from keras.callbacks import ModelCheckpoint
from keras.optimizers import Adam
from keras.models import Model
from sklearn.model_selection import train_test_split
from data_helpers import load_data, load_data_pre_split
# x.shape -> (10662, 56)
# y.shape -> (10662, 2)
# len(vocabulary) -> 18765
# len(vocabulary_inv) -> 18765
print('Loading data...')
# x, y, vocabulary, vocabulary_inv = load_data()
#
# X_train, X_test, y_train, y_test = train_test_split( x, y, test_size=0.2, random_state=42)
path_train = 'webkb/data/my_WEBKB_train.txt'
path_test = 'webkb/data/my_WEBKB_test.txt'
categories = ['student', 'faculty','course','project']
# path_train = 'reuters/data/my_reuters_train.txt'
# path_test = 'reuters/data/my_reuters_test.txt'
# categories = ['acq', 'crude', 'earn', 'grain', 'interest', 'money-fx', 'ship', 'trade']
# path_train = 'subject/data/my_subject_train.txt'
# path_test = 'subject/data/my_subject_test.txt'
# categories = ['subjective','objective']
# path_train = 'amazon/data/my_amazon_train.txt'
# path_test = 'amazon/data/my_amazon_test.txt'
# categories = ['negative','positive']
# path_train = '20newsgroup/data/my_20NG_train.txt'
# path_test = '20newsgroup/data/my_20NG_test.txt'
# categories = ['comp.graphics','comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware','comp.sys.mac.hardware','comp.windows.x','rec.autos','rec.motorcycles','rec.sport.baseball','rec.sport.hockey','sci.crypt','sci.electronics','sci.med','sci.space','misc.forsale','talk.politics.misc','talk.politics.guns','talk.politics.mideast','talk.religion.misc','alt.atheism','soc.religion.christian']
#
# path_train = 'imdb/data/my_IMDB_train.txt'
# path_test = 'imdb/data/my_IMDB_test.txt'
# categories = ['negative','positive']
units = 2
loss = 'binary_crossentropy'
if len(categories)>2:
loss = 'categorical_crossentropy'
units = len(categories)
X_train, X_test, y_train, y_test, vocabulary, vocabulary_inv = load_data_pre_split(path_train,path_test,categories)
# X_train.shape -> (8529, 56)
# y_train.shape -> (8529, 2)
# X_test.shape -> (2133, 56)
# y_test.shape -> (2133, 2)
print(X_train.shape)
print(X_test.shape)
sequence_length = X_train.shape[1] # 56
vocabulary_size = len(vocabulary_inv) # 18765
print(vocabulary_size)
embedding_dim = 256
filter_sizes = [3,4,5]
# num_filters = 512
num_filters = 32
drop = 0.5
epochs = 5
batch_size = 30
# this returns a tensor
print("Creating Model...")
inputs = Input(shape=(sequence_length,), dtype='int32')
embedding = Embedding(input_dim=vocabulary_size, output_dim=embedding_dim, input_length=sequence_length)(inputs)
reshape = Reshape((sequence_length,embedding_dim,1))(embedding)
conv_0 = Conv2D(num_filters, kernel_size=(filter_sizes[0], embedding_dim), padding='valid', kernel_initializer='normal', activation='relu')(reshape)
conv_1 = Conv2D(num_filters, kernel_size=(filter_sizes[1], embedding_dim), padding='valid', kernel_initializer='normal', activation='relu')(reshape)
conv_2 = Conv2D(num_filters, kernel_size=(filter_sizes[2], embedding_dim), padding='valid', kernel_initializer='normal', activation='relu')(reshape)
maxpool_0 = MaxPool2D(pool_size=(sequence_length - filter_sizes[0] + 1, 1), strides=(1,1), padding='valid')(conv_0)
maxpool_1 = MaxPool2D(pool_size=(sequence_length - filter_sizes[1] + 1, 1), strides=(1,1), padding='valid')(conv_1)
maxpool_2 = MaxPool2D(pool_size=(sequence_length - filter_sizes[2] + 1, 1), strides=(1,1), padding='valid')(conv_2)
concatenated_tensor = Concatenate(axis=1)([maxpool_0, maxpool_1, maxpool_2])
flatten = Flatten()(concatenated_tensor)
dropout = Dropout(drop)(flatten)
output = Dense(units=units, activation='softmax')(dropout)
# this creates a model that includes
model = Model(inputs=inputs, outputs=output)
# checkpoint = ModelCheckpoint('weights.{epoch:03d}-{val_acc:.4f}.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='auto')
adam = Adam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(optimizer=adam, loss=loss, metrics=['accuracy'])
print("Training Model...")
model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test, y_test)) # starts training