| """Main function for the sentiment analysis model. | |
| The model makes use of concatenation of two CNN layers with | |
| different kernel sizes. See `sentiment_model.py` | |
| for more details about the models. | |
| """ | |
| from __future__ import absolute_import | |
| from __future__ import division | |
| from __future__ import print_function | |
| import argparse | |
| import os | |
| import tensorflow as tf | |
| from data import dataset | |
| import sentiment_model | |
| _DROPOUT_RATE = 0.95 | |
| def run_model(dataset_name, emb_dim, voc_size, sen_len, | |
| hid_dim, batch_size, epochs, model_save_dir): | |
| """Run training loop and an evaluation at the end. | |
| Args: | |
| dataset_name: Dataset name to be trained and evaluated. | |
| emb_dim: The dimension of the Embedding layer. | |
| voc_size: The number of the most frequent tokens | |
| to be used from the corpus. | |
| sen_len: The number of words in each sentence. | |
| Longer sentences get cut, shorter ones padded. | |
| hid_dim: The dimension of the Embedding layer. | |
| batch_size: The size of each batch during training. | |
| epochs: The number of the iteration over the training set for training. | |
| """ | |
| model = sentiment_model.CNN(emb_dim, voc_size, sen_len, | |
| hid_dim, dataset.get_num_class(dataset_name), | |
| _DROPOUT_RATE) | |
| model.summary() | |
| model.compile(loss="categorical_crossentropy", | |
| optimizer="rmsprop", | |
| metrics=["accuracy"]) | |
| tf.logging.info("Loading the data") | |
| x_train, y_train, x_test, y_test = dataset.load( | |
| dataset_name, voc_size, sen_len) | |
| if not os.path.exists(model_save_dir): | |
| os.makedirs(model_save_dir) | |
| filepath=model_save_dir+"/model-{epoch:02d}.hdf5" | |
| checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(filepath, monitor='val_accuracy', | |
| verbose=1,save_best_only=True, | |
| save_weights_only=True,mode='auto') | |
| model.fit(x_train, y_train, batch_size=batch_size, | |
| validation_split=0.4, epochs=epochs, callbacks=[checkpoint_callback]) | |
| score = model.evaluate(x_test, y_test, batch_size=batch_size) | |
| model.save(os.path.join(model_save_dir, "full-model.h5")) | |
| tf.logging.info("Score: {}".format(score)) | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("-d", "--dataset", help="Dataset to be trained " | |
| "and evaluated.", | |
| type=str, choices=["imdb"], default="imdb") | |
| parser.add_argument("-e", "--embedding_dim", | |
| help="The dimension of the Embedding layer.", | |
| type=int, default=512) | |
| parser.add_argument("-v", "--vocabulary_size", | |
| help="The number of the words to be considered " | |
| "in the dataset corpus.", | |
| type=int, default=6000) | |
| parser.add_argument("-s", "--sentence_length", | |
| help="The number of words in a data point." | |
| "Entries of smaller length are padded.", | |
| type=int, default=600) | |
| parser.add_argument("-c", "--hidden_dim", | |
| help="The number of the CNN layer filters.", | |
| type=int, default=512) | |
| parser.add_argument("-b", "--batch_size", | |
| help="The size of each batch for training.", | |
| type=int, default=500) | |
| parser.add_argument("-p", "--epochs", | |
| help="The number of epochs for training.", | |
| type=int, default=55) | |
| parser.add_argument("-f", "--folder", | |
| help="folder/dir to save trained model", | |
| type=str, default=None) | |
| args = parser.parse_args() | |
| if args.folder is None: | |
| parser.error("-f argument folder/dir to save is None,provide path to save model.") | |
| run_model(args.dataset, args.embedding_dim, args.vocabulary_size, | |
| args.sentence_length, args.hidden_dim, | |
| args.batch_size, args.epochs, args.folder) | |