├── README.md └── Keras_TextCNN.py /README.md: -------------------------------------------------------------------------------- 1 | # Keras_TextCNN 2 | Use python to learn how to use Keras to define the TextCNN model 3 | -------------------------------------------------------------------------------- /Keras_TextCNN.py: -------------------------------------------------------------------------------- 1 | from keras.layers import Input, Dense, Embedding, Conv2D, MaxPool2D, Conv1D, MaxPooling1D, concatenate 2 | from keras.layers import Reshape, Flatten, Dropout, Concatenate 3 | from keras.callbacks import ModelCheckpoint 4 | from keras.optimizers import Adam 5 | from keras.models import Model 6 | from keras import backend as K 7 | import keras.layers as L 8 | import keras 9 | 10 | from sklearn.model_selection import train_test_split 11 | 12 | def text_cnn(sequence_length, num_classes, vocab_size, embedding_size, 13 | filter_sizes, num_filters, embedding_matrix, drop_out=0.5 ,l2_reg_lambda=0.0): 14 | input_x = L.Input(shape=(sequence_length,), name='input_x') 15 | 16 | # embedding layer 17 | if embedding_matrix is None: 18 | embedding = L.Embedding(vocab_size, embedding_size, name='embedding')(input_x) 19 | else: 20 | embedding = L.Embedding(vocab_size, embedding_size, weights=[embedding_matrix], name='embedding')(input_x) 21 | expend_shape = [embedding.get_shape().as_list()[1], embedding.get_shape().as_list()[2], 1] 22 | # embedding_chars = K.expand_dims(embedding, -1) 23 | # 4D tensor [batch_size, seq_len, embeding_size, 1] seems like a gray picture 24 | embedding_chars = L.Reshape(expend_shape)(embedding) 25 | 26 | # conv->max pool 27 | pooled_outputs = [] 28 | for i, filter_size in enumerate(filter_sizes): 29 | conv = L.Conv2D(filters=num_filters, 30 | kernel_size=[filter_size, embedding_size], 31 | strides=1, 32 | padding='valid', 33 | activation='relu', 34 | kernel_initializer=keras.initializers.TruncatedNormal(mean=0.0, stddev=0.1), 35 | bias_initializer=keras.initializers.constant(value=0.1), 36 | name=('conv_%d' % filter_size))(embedding_chars) 37 | # print("conv-%d: " % i, conv) 38 | max_pool = L.MaxPool2D(pool_size=[sequence_length - filter_size + 1, 1], 39 | strides=(1, 1), 40 | padding='valid', 41 | name=('max_pool_%d' % filter_size))(conv) 42 | pooled_outputs.append(max_pool) 43 | # print("max_pool-%d: " % i, max_pool) 44 | 45 | # combine all the pooled features 46 | num_filters_total = num_filters * len(filter_sizes) 47 | h_pool = L.Concatenate(axis=3)(pooled_outputs) 48 | h_pool_flat = L.Reshape([num_filters_total])(h_pool) 49 | # add dropout 50 | dropout = L.Dropout(drop_out)(h_pool_flat) 51 | 52 | # output layer 53 | output = L.Dense(num_classes, 54 | kernel_initializer='glorot_normal', 55 | bias_initializer=keras.initializers.constant(0.1), 56 | activation='softmax', 57 | name='output')(dropout) 58 | 59 | model = keras.models.Model(inputs=input_x, outputs=output) 60 | print('Use TextCNN model') 61 | return model --------------------------------------------------------------------------------