commit 460b51bca7f44c113ae61709d6ab4bdb2c26dca3 parent 8007635cfc785c00bcf471202b09dfb0f272b318 Author: MTRNord <mtrnord1@gmail.com> Date: Tue, 27 Sep 2022 08:02:20 +0200 Improve building in v2.py Diffstat:
18 files changed, 117 insertions(+), 34 deletions(-)
diff --git a/model.py b/model.py @@ -188,13 +188,13 @@ class SpamDectionModel(kt.HyperModel): print("[Step 5/9] Tuning hypervalues") tuner = kt.Hyperband(SpamDectionModel(), objective='val_accuracy', - max_epochs=750, + max_epochs=350, factor=3, directory='hyper_tuning', project_name='spam-keras') -stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10) -tuner.search(padded, training_labels_final, epochs=800, verbose=0, +stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5) +tuner.search(padded, training_labels_final, epochs=400, verbose=0, validation_data=(testing_padded, testing_labels_final), callbacks=[hypertuner_tensorboard_callback, stop_early, progress_bar]) # Get the optimal hyperparameters best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] diff --git a/model_v2.py b/model_v2.py @@ -49,11 +49,11 @@ class SpamDectionModel(tf.keras.Model): def __init__(self, vocab_size, embedding_dim, max_length, hp_units, hp_dropout, hp_l2): super(SpamDectionModel, self).__init__() self.embedding = tf.keras.layers.Embedding( - vocab_size, embedding_dim, input_length=max_length, name="text_input"), - self.glob_average_pooling_1d = tf.keras.layers.GlobalAveragePooling1D(), - self.dropout = tf.keras.layers.Dropout(hp_dropout,), + vocab_size, embedding_dim, input_length=max_length, name="text_input") + self.glob_average_pooling_1d = tf.keras.layers.GlobalAveragePooling1D() + self.dropout = tf.keras.layers.Dropout(hp_dropout,) self.dense1 = tf.keras.layers.Dense(units=hp_units, activation='relu', - kernel_regularizer=tf.keras.regularizers.l2(hp_l2)), + kernel_regularizer=tf.keras.regularizers.l2(hp_l2)) # tf.keras.layers.Dense(6, activation='relu', # kernel_regularizer=tf.keras.regularizers.l2(0.0001)), self.dense2 = tf.keras.layers.Dense( @@ -115,20 +115,47 @@ def remove_stopwords(input_text): def change_labels(x): return 1 if x == "spam" else 0 -def tokenize_data(training_sentences, testing_sentences): - tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok) +def tokenize_data(data, training_sentences, testing_sentences): + #tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok) - tokenizer.fit_on_texts(training_sentences) + # tokenizer.fit_on_texts(training_sentences) - sequences = tokenizer.texts_to_sequences(training_sentences) - padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, - truncating=trunc_type) + #sequences = tokenizer.texts_to_sequences(training_sentences) + # padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, + # truncating=trunc_type) - testing_sequences = tokenizer.texts_to_sequences(testing_sentences) - testing_padded = pad_sequences(testing_sequences, maxlen=max_length, - padding=padding_type, truncating=trunc_type) + #testing_sequences = tokenizer.texts_to_sequences(testing_sentences) + # testing_padded = pad_sequences(testing_sequences, maxlen=max_length, + # padding=padding_type, truncating=trunc_type) - return padded, testing_padded, tokenizer + vectorize_layer = tf.keras.layers.TextVectorization( + max_tokens=vocab_size, + output_mode='int', + output_sequence_length=max_length) + + # Now that the vocab layer has been created, call `adapt` on the text-only + # dataset to create the vocabulary. You don't have to batch, but for large + # datasets this means we're not keeping spare copies of the dataset. + vectorize_layer.adapt(data) + + # Create the model that uses the vectorize text layer + model = tf.keras.models.Sequential() + # Start by creating an explicit input layer. It needs to have a shape of + # (1,) (because we need to guarantee that there is exactly one string + # input per batch), and the dtype needs to be 'string'. + model.add(tf.keras.Input(shape=(1,), dtype=tf.string)) + + # The first layer in our model is the vectorization layer. After this + # layer, we have a tensor of shape (batch_size, max_len) containing vocab + # indices. + model.add(vectorize_layer) + + # Now, the model can map strings to integers, and you can add an embedding + # layer to map these integers to learned embeddings. + padded = model.predict(training_sentences) + testing_padded = model.predict(testing_sentences) + + return padded, testing_padded # , tokenizer def load_data(): @@ -159,14 +186,15 @@ def load_data(): # Make labels into numpy arrays for use with the network later training_labels_final = np.array(training_labels) testing_labels_final = np.array(testing_labels) - - return tokenize_data(training_sentences, testing_sentences), training_labels_final, testing_labels_final + padded, testing_padded = tokenize_data( + sentences, training_sentences, testing_sentences) + return padded, testing_padded, training_labels_final, testing_labels_final, sentences def train_hyperparamters(padded, training_labels_final, testing_padded, testing_labels_final, tuner): stop_early = tf.keras.callbacks.EarlyStopping( - monitor='val_loss', patience=10) - tuner.search(padded, training_labels_final, epochs=800, verbose=0, + monitor='val_loss', patience=5) + tuner.search(padded, training_labels_final, epochs=5, verbose=1, validation_data=(testing_padded, testing_labels_final), callbacks=[hypertuner_tensorboard_callback, stop_early, progress_bar]) # Get the optimal hyperparameters @@ -214,7 +242,7 @@ def train_model(padded, training_labels_final, testing_padded, testing_labels_fi return hypermodel -def test_model(tokenizer, model): +def test_model(sentences, model): # Use the model to predict whether a message is spam text_messages = ['Greg, can you call me back once you get this?', 'Congrats on your new iPhone! Click here to claim your prize...', @@ -240,11 +268,19 @@ def test_model(tokenizer, model): # Create the sequences padding_type = 'post' - sample_sequences = tokenizer.texts_to_sequences(text_messages) - fakes_padded = pad_sequences( - sample_sequences, padding=padding_type, maxlen=max_length) - - classes = model.predict(fakes_padded) + #sample_sequences = tokenizer.texts_to_sequences(text_messages) + # fakes_padded = pad_sequences( + # sample_sequences, padding=padding_type, maxlen=max_length) + + vectorize_layer = tf.keras.layers.TextVectorization( + output_mode='int', + output_sequence_length=max_length) + vectorize_layer.adapt(sentences) + vectorize_model = tf.keras.models.Sequential() + vectorize_model.add(tf.keras.Input(shape=(1,), dtype=tf.string)) + vectorize_model.add(vectorize_layer) + sequences = vectorize_model.predict(text_messages) + classes = model.predict(sequences) # The closer the class is to 1, the more likely that the message is spam for x in range(len(text_messages)): @@ -255,14 +291,13 @@ def test_model(tokenizer, model): def main(): print("[Step 1/6] Loading data") - padded, testing_padded, tokenizer, training_labels_final, testing_labels_final = load_data() + padded, testing_padded, training_labels_final, testing_labels_final, sentences = load_data() model = SpamDectionHyperModel() - print("[Step 2/6] Plotting model") - tf.keras.utils.plot_model(model, rankdir="LR", show_shapes=True) - tuner = kt.Hyperband(model, + #print("[Step 2/6] Plotting model") + #tf.keras.utils.plot_model(model, rankdir="LR", show_shapes=True) + tuner = kt.Hyperband(model, hyperband_iterations=2, objective='val_accuracy', - max_epochs=750, - factor=3, + max_epochs=200, directory='hyper_tuning', project_name='spam-keras') print("[Step 3/6] Tuning hypervalues") @@ -279,7 +314,7 @@ def main(): model.save(export_path) print("[Step 6/6] Testing model") - test_model(tokenizer, model) + test_model(sentences, model) if __name__ == "__main__": diff --git a/models/spam_keras_1664201513.8239765/keras_metadata.pb b/models/spam_keras_1664201513.8239765/keras_metadata.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7119bb1163518479050d76e8ebd3b8f8d70a5818667e0a11fc657107318756fe +size 11605 diff --git a/models/spam_keras_1664201513.8239765/saved_model.pb b/models/spam_keras_1664201513.8239765/saved_model.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0073f72cc7505ddda9cf2df006dd86828a38dc06bb1931b88bed48ada1302fb +size 126151 diff --git a/models/spam_keras_1664201513.8239765/variables/variables.data-00000-of-00001 b/models/spam_keras_1664201513.8239765/variables/variables.data-00000-of-00001 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1d5d35421695939c6653cd4b64dcd40105da2dfd9942f98c9346c9b39a79e26 +size 270611 diff --git a/models/spam_keras_1664201513.8239765/variables/variables.index b/models/spam_keras_1664201513.8239765/variables/variables.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ac6ac21b7daf56e051d336431d976e4120a5d749112e58f16397db43a7768f5 +size 1654 diff --git a/models/spam_keras_1664201971.5876567/keras_metadata.pb b/models/spam_keras_1664201971.5876567/keras_metadata.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7119bb1163518479050d76e8ebd3b8f8d70a5818667e0a11fc657107318756fe +size 11605 diff --git a/models/spam_keras_1664201971.5876567/saved_model.pb b/models/spam_keras_1664201971.5876567/saved_model.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:564e13b17db9e0be955445940d38418f5cf61f905933a3b814ffd059aa164310 +size 126151 diff --git a/models/spam_keras_1664201971.5876567/variables/variables.data-00000-of-00001 b/models/spam_keras_1664201971.5876567/variables/variables.data-00000-of-00001 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:141b607775eff6509bda1f0d76c3af997c498690b0dfc3210e8665f702f9c167 +size 270611 diff --git a/models/spam_keras_1664201971.5876567/variables/variables.index b/models/spam_keras_1664201971.5876567/variables/variables.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a7c53620a31154302ed726d1ba6bbbced47aca26ca26505b3910b2ef501692c +size 1654 diff --git a/models/spam_keras_1664202934.3720422/keras_metadata.pb b/models/spam_keras_1664202934.3720422/keras_metadata.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7119bb1163518479050d76e8ebd3b8f8d70a5818667e0a11fc657107318756fe +size 11605 diff --git a/models/spam_keras_1664202934.3720422/saved_model.pb b/models/spam_keras_1664202934.3720422/saved_model.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:433e8af9792316e4939689941751e146b707e7860a4b25bb0b5d23bf39fb8239 +size 126151 diff --git a/models/spam_keras_1664202934.3720422/variables/variables.data-00000-of-00001 b/models/spam_keras_1664202934.3720422/variables/variables.data-00000-of-00001 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af9c75b84963877361fd02f12c4e0860efd79c6bf8c0ae91330a85b4f2b7d2d4 +size 270611 diff --git a/models/spam_keras_1664202934.3720422/variables/variables.index b/models/spam_keras_1664202934.3720422/variables/variables.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72361cbf43890fa2a3dd5194b078dc2cdd663c3ae06b1116f29fa903b701e448 +size 1654 diff --git a/models/spam_keras_1664243106.732267/keras_metadata.pb b/models/spam_keras_1664243106.732267/keras_metadata.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25c72070889b01d22f200a7341b3b1a468a8c09a1441d4ddda179328b4407cea +size 6338 diff --git a/models/spam_keras_1664243106.732267/saved_model.pb b/models/spam_keras_1664243106.732267/saved_model.pb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:950c4ce51688eb3b4a59780c33c7ad63109400aa45f5b6b34d32484b2379e3f1 +size 248911 diff --git a/models/spam_keras_1664243106.732267/variables/variables.data-00000-of-00001 b/models/spam_keras_1664243106.732267/variables/variables.data-00000-of-00001 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbcfefa17c4867cead7e46ab683530dd8bb68bd0d3faa8f26a27f2a4baaff64b +size 262040 diff --git a/models/spam_keras_1664243106.732267/variables/variables.index b/models/spam_keras_1664243106.732267/variables/variables.index @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9a8239fd5de5b960bcf55e337093d6aa60328d2d727823b4b9941fbe0ee675e +size 1625