Spaces:
Running
Running
File size: 4,063 Bytes
0b8359d |
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
"""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)
|