def test_semantic_model(weights_path, file_path, transfer=False): _, _, _, _, test_X, test_y, embedding_matrix = load_data() embedding_matrix = normalize(embedding_matrix, axis=1, norm='l2', copy=False) shape = test_X[0].shape if transfer: model = cnn_bidirectional_lstm_model(13, shape, embedding_matrix, 150) model.layers.pop() model.add(kl.Dense(test_y.shape[1], activation='sigmoid')) model.load_weights(weights_path) else: model = cnn_bidirectional_lstm_model(test_y.shape[1], shape, embedding_matrix, 150) model.load_weights(weights_path) opt = k.optimizers.Adam(lr=0.001, amsgrad=True) model.compile(optimizer=opt, loss='binary_crossentropy') preds = model.predict(test_X, verbose=True) preds[preds >= 0.4] = 1 preds[preds < 0.4] = 0 score = [ accuracy_score(test_y, preds), precision_score(test_y, preds, average='micro'), recall_score(test_y, preds, average='micro'), f1_score(test_y, preds, average='micro'), precision_score(test_y, preds, average='macro'), recall_score(test_y, preds, average='macro'), f1_score(test_y, preds, average='macro') ] print(score) np.savetxt(file_path, np.array(score))
def train_semantic_sentiment_merged_model(): model_filepath = 'models/multi_emotion_sentiment_semantic_merged_model-{epoch:02d}-{val_loss:.2f}.h5' logs_filepath = 'logs/multi_emotion_sentiment_semantic_merged_model.log' train_X, train_y, val_X, val_y, _, _, embedding_matrix = load_data() train_X2, val_X2, _, lexicon_matrix = load_sentiment_data() train_X = np.vstack((train_X, val_X)) train_X2 = np.vstack((train_X2, val_X2)) train_y = np.vstack((train_y, val_y)) embedding_matrix = normalize(embedding_matrix, axis=1, norm='l2', copy=False) shape1 = train_X[0].shape shape2 = train_X2[0].shape model1 = cnn_bidirectional_lstm_model(train_y.shape[1], shape1, embedding_matrix, 150) model1.load_weights('models/multi_emotion_semantic_model-w2v-emoji.h5') model1.pop() model2 = cnn_bidirectional_lstm_model(train_y.shape[1], shape2, lexicon_matrix, 150) model2.load_weights('models/multi_emotion_semantic_lexicon_model.h5') model2.pop() merged_out = kl.Add()([model1.output, model2.output]) merged_out = kl.Dense(128, activation='relu')(merged_out) merged_out = kl.Dropout(0.1)(merged_out) merged_out = kl.Dense(train_y.shape[1], activation='sigmoid')(merged_out) model = k.Model(inputs=[model1.input, model2.input], outputs=[merged_out]) opt = k.optimizers.Adam(lr=0.001, amsgrad=True) model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) # checkpoint checkpoint = k.callbacks.ModelCheckpoint(model_filepath, monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=True, mode='min') csv_logger = k.callbacks.CSVLogger(logs_filepath) model.fit([train_X, train_X2], train_y, epochs=200, batch_size=1000, shuffle=True, callbacks=[checkpoint, csv_logger], validation_split=0.1)
def train_semantic_lexicon_model(): model_filepath = 'models/multi_emotion_semantic_lexicon_model-{epoch:02d}-{val_loss:.2f}.h5' logs_filepath = 'logs/multi_emotion_semantic_lexicon_model.log' train_X, train_y, val_X, val_y, _, _, _ = load_data() train_X, val_X, _, lexicon_matrix = load_sentiment_data() train_X = np.vstack((train_X, val_X)) train_y = np.vstack((train_y, val_y)) shape = train_X[0].shape model = cnn_bidirectional_lstm_model(train_y.shape[1], shape, lexicon_matrix, 150) opt = k.optimizers.Adam(lr=0.001, amsgrad=True) model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) checkpoint = k.callbacks.ModelCheckpoint(model_filepath, monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=True, mode='min') csv_logger = k.callbacks.CSVLogger(logs_filepath) model.fit(train_X, train_y, epochs=200, batch_size=1000, shuffle=True, callbacks=[checkpoint, csv_logger], validation_split=0.1)
def test_semantic_sentiment_merged_model(weights_path, file_name): _, _, _, _, test_X, test_y, embedding_matrix = load_data() embedding_matrix = normalize(embedding_matrix, axis=1, norm='l2', copy=False) shape1 = test_X[0].shape _, _, test_X2, lexicon_matrix = load_sentiment_data() shape2 = test_X2[0].shape model1 = cnn_bidirectional_lstm_model(test_y.shape[1], shape1, embedding_matrix, 150) model1.pop() model2 = cnn_bidirectional_lstm_model(test_y.shape[1], shape2, lexicon_matrix, 150) model2.pop() merged_out = kl.Add()([model1.output, model2.output]) merged_out = kl.Dense(128, activation='relu')(merged_out) merged_out = kl.Dropout(0.1)(merged_out) merged_out = kl.Dense(test_y.shape[1], activation='sigmoid')(merged_out) model = k.Model(inputs=[model1.input, model2.input], outputs=[merged_out]) opt = k.optimizers.Adam(lr=0.001, amsgrad=True) model.compile(optimizer=opt, loss='binary_crossentropy') model.load_weights(weights_path) preds = model.predict([test_X, test_X2], verbose=True) preds[preds >= 0.4] = 1 preds[preds < 0.4] = 0 score = [ accuracy_score(test_y, preds), precision_score(test_y, preds, average='micro'), recall_score(test_y, preds, average='micro'), f1_score(test_y, preds, average='micro'), precision_score(test_y, preds, average='macro'), recall_score(test_y, preds, average='macro'), f1_score(test_y, preds, average='macro') ] print(score) np.savetxt(file_name, np.array(score))
def transfer_learning_semantic_model(): model_filepath = 'models/multi_emotion_semantic_model_transfer-{epoch:02d}-{val_loss:.2f}.h5' logs_filepath = 'logs/multi_emotion_semantic_model_transfer.log' model_weights = 'models/emotion_bi_lstm_semantic_model.h5' train_X, train_y, val_X, val_y, _, _, embedding_matrix = load_data() train_X = np.vstack((train_X, val_X)) train_y = np.vstack((train_y, val_y)) embedding_matrix = normalize(embedding_matrix, axis=1, norm='l2', copy=False) shape = train_X[0].shape model = cnn_bidirectional_lstm_model(13, shape, embedding_matrix, 150) model.load_weights(model_weights) model.layers.pop() for layer in model.layers: layer.trainable = False model.add(kl.Dense(train_y.shape[1], activation='sigmoid')) opt = k.optimizers.Adam(lr=0.01, amsgrad=True) model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy']) checkpoint = k.callbacks.ModelCheckpoint(model_filepath, monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=True, mode='min') csv_logger = k.callbacks.CSVLogger(logs_filepath) model.fit(train_X, train_y, epochs=250, batch_size=500, shuffle=True, callbacks=[checkpoint, csv_logger], validation_split=0.1)