Hands-on 08: Model Compression#
! pip install --user --quiet tensorflow-model-optimization
from tensorflow.keras.utils import to_categorical
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
seed = 42
np.random.seed(seed)
import tensorflow as tf
tf.random.set_seed(seed)
2024-03-31 18:32:06.398355: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
Fetch the jet tagging dataset from Open ML#
data = fetch_openml("hls4ml_lhc_jets_hlf", parser="auto")
X, y = data["data"], data["target"]
le = LabelEncoder()
y_onehot = le.fit_transform(y)
y_onehot = to_categorical(y_onehot, 5)
classes = le.classes_
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_val = scaler.fit_transform(X_train_val)
X_test = scaler.transform(X_test)
Now construct a model#
We’ll use the same architecture as in part 1: 3 hidden layers with 64, then 32, then 32 neurons. Each layer will use relu
activation.
Add an output layer with 5 neurons (one for each class), then finish with Softmax activation.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, BatchNormalization
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.regularizers import l1
from callbacks import all_callbacks
model = Sequential()
model.add(Dense(64, input_shape=(16,), name="fc1", kernel_initializer="lecun_uniform"))
model.add(Activation(activation="relu", name="relu1"))
model.add(Dense(32, name="fc2", kernel_initializer="lecun_uniform"))
model.add(Activation(activation="relu", name="relu2"))
model.add(Dense(32, name="fc3", kernel_initializer="lecun_uniform"))
model.add(Activation(activation="relu", name="relu3"))
model.add(Dense(5, name="output", kernel_initializer="lecun_uniform"))
model.add(Activation(activation="softmax", name="softmax"))
Train the unpruned model#
adam = Adam(learning_rate=0.0001)
model.compile(optimizer=adam, loss=["categorical_crossentropy"], metrics=["accuracy"])
callbacks = all_callbacks(
stop_patience=1000,
lr_factor=0.5,
lr_patience=10,
lr_epsilon=0.000001,
lr_cooldown=2,
lr_minimum=0.0000001,
outputDir="unpruned_model",
)
model.fit(
X_train_val, y_train_val, batch_size=1024, epochs=30, validation_split=0.25, shuffle=True, callbacks=callbacks.callbacks
)
Epoch 1/30
1/487 [..............................] - ETA: 3:55 - loss: 1.7058 - accuracy: 0.2178
28/487 [>.............................] - ETA: 0s - loss: 1.6825 - accuracy: 0.2551
55/487 [==>...........................] - ETA: 0s - loss: 1.6401 - accuracy: 0.2813
83/487 [====>.........................] - ETA: 0s - loss: 1.6013 - accuracy: 0.3059
111/487 [=====>........................] - ETA: 0s - loss: 1.5680 - accuracy: 0.3293
139/487 [=======>......................] - ETA: 0s - loss: 1.5405 - accuracy: 0.3496
168/487 [=========>....................] - ETA: 0s - loss: 1.5149 - accuracy: 0.3689
197/487 [===========>..................] - ETA: 0s - loss: 1.4926 - accuracy: 0.3859
225/487 [============>.................] - ETA: 0s - loss: 1.4721 - accuracy: 0.4007
253/487 [==============>...............] - ETA: 0s - loss: 1.4518 - accuracy: 0.4134
282/487 [================>.............] - ETA: 0s - loss: 1.4333 - accuracy: 0.4240
311/487 [==================>...........] - ETA: 0s - loss: 1.4148 - accuracy: 0.4343
340/487 [===================>..........] - ETA: 0s - loss: 1.3974 - accuracy: 0.4429
369/487 [=====================>........] - ETA: 0s - loss: 1.3813 - accuracy: 0.4503
398/487 [=======================>......] - ETA: 0s - loss: 1.3660 - accuracy: 0.4570
426/487 [=========================>....] - ETA: 0s - loss: 1.3519 - accuracy: 0.4629
455/487 [===========================>..] - ETA: 0s - loss: 1.3384 - accuracy: 0.4686
483/487 [============================>.] - ETA: 0s - loss: 1.3259 - accuracy: 0.4741
Epoch 1: val_loss improved from inf to 1.11796, saving model to unpruned_model/model_best.h5
Epoch 1: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 2s 2ms/step - loss: 1.3246 - accuracy: 0.4747 - val_loss: 1.1180 - val_accuracy: 0.5692 - lr: 1.0000e-04
Epoch 2/30
1/487 [..............................] - ETA: 1s - loss: 1.1151 - accuracy: 0.5352
29/487 [>.............................] - ETA: 0s - loss: 1.1074 - accuracy: 0.5723
57/487 [==>...........................] - ETA: 0s - loss: 1.1041 - accuracy: 0.5819
86/487 [====>.........................] - ETA: 0s - loss: 1.0992 - accuracy: 0.5872
/home/runner/miniconda3/envs/phys139/lib/python3.10/site-packages/keras/src/engine/training.py:3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
saving_api.save_model(
114/487 [======>.......................] - ETA: 0s - loss: 1.0953 - accuracy: 0.5919
142/487 [=======>......................] - ETA: 0s - loss: 1.0899 - accuracy: 0.5959
170/487 [=========>....................] - ETA: 0s - loss: 1.0846 - accuracy: 0.5992
199/487 [===========>..................] - ETA: 0s - loss: 1.0803 - accuracy: 0.6023
227/487 [============>.................] - ETA: 0s - loss: 1.0758 - accuracy: 0.6051
255/487 [==============>...............] - ETA: 0s - loss: 1.0710 - accuracy: 0.6079
283/487 [================>.............] - ETA: 0s - loss: 1.0672 - accuracy: 0.6101
311/487 [==================>...........] - ETA: 0s - loss: 1.0629 - accuracy: 0.6128
339/487 [===================>..........] - ETA: 0s - loss: 1.0592 - accuracy: 0.6149
368/487 [=====================>........] - ETA: 0s - loss: 1.0547 - accuracy: 0.6175
397/487 [=======================>......] - ETA: 0s - loss: 1.0513 - accuracy: 0.6194
425/487 [=========================>....] - ETA: 0s - loss: 1.0470 - accuracy: 0.6220
454/487 [==========================>...] - ETA: 0s - loss: 1.0430 - accuracy: 0.6242
483/487 [============================>.] - ETA: 0s - loss: 1.0393 - accuracy: 0.6265
Epoch 2: val_loss improved from 1.11796 to 0.97694, saving model to unpruned_model/model_best.h5
Epoch 2: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 1.0388 - accuracy: 0.6269 - val_loss: 0.9769 - val_accuracy: 0.6629 - lr: 1.0000e-04
Epoch 3/30
1/487 [..............................] - ETA: 1s - loss: 0.9408 - accuracy: 0.6855
30/487 [>.............................] - ETA: 0s - loss: 0.9691 - accuracy: 0.6671
59/487 [==>...........................] - ETA: 0s - loss: 0.9645 - accuracy: 0.6689
87/487 [====>.........................] - ETA: 0s - loss: 0.9620 - accuracy: 0.6696
116/487 [======>.......................] - ETA: 0s - loss: 0.9583 - accuracy: 0.6716
145/487 [=======>......................] - ETA: 0s - loss: 0.9571 - accuracy: 0.6722
174/487 [=========>....................] - ETA: 0s - loss: 0.9556 - accuracy: 0.6731
203/487 [===========>..................] - ETA: 0s - loss: 0.9535 - accuracy: 0.6739
232/487 [=============>................] - ETA: 0s - loss: 0.9505 - accuracy: 0.6754
261/487 [===============>..............] - ETA: 0s - loss: 0.9483 - accuracy: 0.6764
289/487 [================>.............] - ETA: 0s - loss: 0.9466 - accuracy: 0.6770
318/487 [==================>...........] - ETA: 0s - loss: 0.9441 - accuracy: 0.6780
346/487 [====================>.........] - ETA: 0s - loss: 0.9409 - accuracy: 0.6793
375/487 [======================>.......] - ETA: 0s - loss: 0.9386 - accuracy: 0.6802
404/487 [=======================>......] - ETA: 0s - loss: 0.9368 - accuracy: 0.6810
433/487 [=========================>....] - ETA: 0s - loss: 0.9342 - accuracy: 0.6821
461/487 [===========================>..] - ETA: 0s - loss: 0.9324 - accuracy: 0.6829
Epoch 3: val_loss improved from 0.97694 to 0.89573, saving model to unpruned_model/model_best.h5
Epoch 3: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.9305 - accuracy: 0.6840 - val_loss: 0.8957 - val_accuracy: 0.7006 - lr: 1.0000e-04
Epoch 4/30
1/487 [..............................] - ETA: 1s - loss: 0.9546 - accuracy: 0.6621
30/487 [>.............................] - ETA: 0s - loss: 0.8929 - accuracy: 0.6980
58/487 [==>...........................] - ETA: 0s - loss: 0.8888 - accuracy: 0.7006
87/487 [====>.........................] - ETA: 0s - loss: 0.8851 - accuracy: 0.7019
116/487 [======>.......................] - ETA: 0s - loss: 0.8816 - accuracy: 0.7025
144/487 [=======>......................] - ETA: 0s - loss: 0.8798 - accuracy: 0.7043
173/487 [=========>....................] - ETA: 0s - loss: 0.8794 - accuracy: 0.7049
202/487 [===========>..................] - ETA: 0s - loss: 0.8773 - accuracy: 0.7057
231/487 [=============>................] - ETA: 0s - loss: 0.8770 - accuracy: 0.7056
260/487 [===============>..............] - ETA: 0s - loss: 0.8746 - accuracy: 0.7066
289/487 [================>.............] - ETA: 0s - loss: 0.8735 - accuracy: 0.7074
318/487 [==================>...........] - ETA: 0s - loss: 0.8722 - accuracy: 0.7077
347/487 [====================>.........] - ETA: 0s - loss: 0.8703 - accuracy: 0.7083
376/487 [======================>.......] - ETA: 0s - loss: 0.8684 - accuracy: 0.7091
404/487 [=======================>......] - ETA: 0s - loss: 0.8664 - accuracy: 0.7098
433/487 [=========================>....] - ETA: 0s - loss: 0.8656 - accuracy: 0.7101
462/487 [===========================>..] - ETA: 0s - loss: 0.8639 - accuracy: 0.7106
Epoch 4: val_loss improved from 0.89573 to 0.84167, saving model to unpruned_model/model_best.h5
Epoch 4: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.8625 - accuracy: 0.7112 - val_loss: 0.8417 - val_accuracy: 0.7183 - lr: 1.0000e-04
Epoch 5/30
1/487 [..............................] - ETA: 1s - loss: 0.8021 - accuracy: 0.7158
30/487 [>.............................] - ETA: 0s - loss: 0.8238 - accuracy: 0.7240
58/487 [==>...........................] - ETA: 0s - loss: 0.8292 - accuracy: 0.7222
87/487 [====>.........................] - ETA: 0s - loss: 0.8329 - accuracy: 0.7215
116/487 [======>.......................] - ETA: 0s - loss: 0.8310 - accuracy: 0.7215
145/487 [=======>......................] - ETA: 0s - loss: 0.8277 - accuracy: 0.7230
174/487 [=========>....................] - ETA: 0s - loss: 0.8289 - accuracy: 0.7222
203/487 [===========>..................] - ETA: 0s - loss: 0.8282 - accuracy: 0.7222
231/487 [=============>................] - ETA: 0s - loss: 0.8268 - accuracy: 0.7225
260/487 [===============>..............] - ETA: 0s - loss: 0.8259 - accuracy: 0.7224
289/487 [================>.............] - ETA: 0s - loss: 0.8248 - accuracy: 0.7226
317/487 [==================>...........] - ETA: 0s - loss: 0.8240 - accuracy: 0.7225
346/487 [====================>.........] - ETA: 0s - loss: 0.8229 - accuracy: 0.7226
375/487 [======================>.......] - ETA: 0s - loss: 0.8221 - accuracy: 0.7227
404/487 [=======================>......] - ETA: 0s - loss: 0.8216 - accuracy: 0.7229
433/487 [=========================>....] - ETA: 0s - loss: 0.8210 - accuracy: 0.7229
462/487 [===========================>..] - ETA: 0s - loss: 0.8204 - accuracy: 0.7231
Epoch 5: val_loss improved from 0.84167 to 0.81128, saving model to unpruned_model/model_best.h5
Epoch 5: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.8205 - accuracy: 0.7230 - val_loss: 0.8113 - val_accuracy: 0.7256 - lr: 1.0000e-04
Epoch 6/30
1/487 [..............................] - ETA: 1s - loss: 0.8810 - accuracy: 0.7051
30/487 [>.............................] - ETA: 0s - loss: 0.8134 - accuracy: 0.7225
59/487 [==>...........................] - ETA: 0s - loss: 0.8070 - accuracy: 0.7263
88/487 [====>.........................] - ETA: 0s - loss: 0.8074 - accuracy: 0.7249
116/487 [======>.......................] - ETA: 0s - loss: 0.8062 - accuracy: 0.7263
144/487 [=======>......................] - ETA: 0s - loss: 0.8058 - accuracy: 0.7257
172/487 [=========>....................] - ETA: 0s - loss: 0.8054 - accuracy: 0.7256
201/487 [===========>..................] - ETA: 0s - loss: 0.8039 - accuracy: 0.7263
230/487 [=============>................] - ETA: 0s - loss: 0.8042 - accuracy: 0.7264
259/487 [==============>...............] - ETA: 0s - loss: 0.8035 - accuracy: 0.7265
288/487 [================>.............] - ETA: 0s - loss: 0.8029 - accuracy: 0.7267
316/487 [==================>...........] - ETA: 0s - loss: 0.8014 - accuracy: 0.7273
345/487 [====================>.........] - ETA: 0s - loss: 0.8006 - accuracy: 0.7274
373/487 [=====================>........] - ETA: 0s - loss: 0.7997 - accuracy: 0.7276
402/487 [=======================>......] - ETA: 0s - loss: 0.7994 - accuracy: 0.7277
430/487 [=========================>....] - ETA: 0s - loss: 0.7988 - accuracy: 0.7279
459/487 [===========================>..] - ETA: 0s - loss: 0.7977 - accuracy: 0.7280
Epoch 6: val_loss improved from 0.81128 to 0.79376, saving model to unpruned_model/model_best.h5
Epoch 6: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7970 - accuracy: 0.7281 - val_loss: 0.7938 - val_accuracy: 0.7294 - lr: 1.0000e-04
Epoch 7/30
1/487 [..............................] - ETA: 1s - loss: 0.8029 - accuracy: 0.7109
30/487 [>.............................] - ETA: 0s - loss: 0.7931 - accuracy: 0.7253
59/487 [==>...........................] - ETA: 0s - loss: 0.7880 - accuracy: 0.7281
88/487 [====>.........................] - ETA: 0s - loss: 0.7862 - accuracy: 0.7297
117/487 [======>.......................] - ETA: 0s - loss: 0.7883 - accuracy: 0.7291
145/487 [=======>......................] - ETA: 0s - loss: 0.7883 - accuracy: 0.7292
174/487 [=========>....................] - ETA: 0s - loss: 0.7878 - accuracy: 0.7291
203/487 [===========>..................] - ETA: 0s - loss: 0.7871 - accuracy: 0.7295
232/487 [=============>................] - ETA: 0s - loss: 0.7851 - accuracy: 0.7302
261/487 [===============>..............] - ETA: 0s - loss: 0.7848 - accuracy: 0.7305
289/487 [================>.............] - ETA: 0s - loss: 0.7845 - accuracy: 0.7303
317/487 [==================>...........] - ETA: 0s - loss: 0.7843 - accuracy: 0.7303
346/487 [====================>.........] - ETA: 0s - loss: 0.7837 - accuracy: 0.7306
375/487 [======================>.......] - ETA: 0s - loss: 0.7831 - accuracy: 0.7309
404/487 [=======================>......] - ETA: 0s - loss: 0.7833 - accuracy: 0.7310
433/487 [=========================>....] - ETA: 0s - loss: 0.7828 - accuracy: 0.7312
462/487 [===========================>..] - ETA: 0s - loss: 0.7825 - accuracy: 0.7312
Epoch 7: val_loss improved from 0.79376 to 0.78167, saving model to unpruned_model/model_best.h5
Epoch 7: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7823 - accuracy: 0.7312 - val_loss: 0.7817 - val_accuracy: 0.7319 - lr: 1.0000e-04
Epoch 8/30
1/487 [..............................] - ETA: 1s - loss: 0.8051 - accuracy: 0.7178
30/487 [>.............................] - ETA: 0s - loss: 0.7759 - accuracy: 0.7321
58/487 [==>...........................] - ETA: 0s - loss: 0.7821 - accuracy: 0.7300
87/487 [====>.........................] - ETA: 0s - loss: 0.7762 - accuracy: 0.7324
116/487 [======>.......................] - ETA: 0s - loss: 0.7776 - accuracy: 0.7319
145/487 [=======>......................] - ETA: 0s - loss: 0.7766 - accuracy: 0.7320
173/487 [=========>....................] - ETA: 0s - loss: 0.7752 - accuracy: 0.7325
202/487 [===========>..................] - ETA: 0s - loss: 0.7747 - accuracy: 0.7328
230/487 [=============>................] - ETA: 0s - loss: 0.7750 - accuracy: 0.7327
258/487 [==============>...............] - ETA: 0s - loss: 0.7744 - accuracy: 0.7331
286/487 [================>.............] - ETA: 0s - loss: 0.7740 - accuracy: 0.7331
314/487 [==================>...........] - ETA: 0s - loss: 0.7730 - accuracy: 0.7333
342/487 [====================>.........] - ETA: 0s - loss: 0.7729 - accuracy: 0.7334
370/487 [=====================>........] - ETA: 0s - loss: 0.7724 - accuracy: 0.7335
398/487 [=======================>......] - ETA: 0s - loss: 0.7721 - accuracy: 0.7334
426/487 [=========================>....] - ETA: 0s - loss: 0.7724 - accuracy: 0.7333
454/487 [==========================>...] - ETA: 0s - loss: 0.7715 - accuracy: 0.7337
483/487 [============================>.] - ETA: 0s - loss: 0.7714 - accuracy: 0.7336
Epoch 8: val_loss improved from 0.78167 to 0.77204, saving model to unpruned_model/model_best.h5
Epoch 8: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7715 - accuracy: 0.7336 - val_loss: 0.7720 - val_accuracy: 0.7339 - lr: 1.0000e-04
Epoch 9/30
1/487 [..............................] - ETA: 1s - loss: 0.7961 - accuracy: 0.7324
29/487 [>.............................] - ETA: 0s - loss: 0.7626 - accuracy: 0.7355
58/487 [==>...........................] - ETA: 0s - loss: 0.7714 - accuracy: 0.7327
86/487 [====>.........................] - ETA: 0s - loss: 0.7729 - accuracy: 0.7329
114/487 [======>.......................] - ETA: 0s - loss: 0.7704 - accuracy: 0.7332
142/487 [=======>......................] - ETA: 0s - loss: 0.7684 - accuracy: 0.7335
171/487 [=========>....................] - ETA: 0s - loss: 0.7674 - accuracy: 0.7341
200/487 [===========>..................] - ETA: 0s - loss: 0.7664 - accuracy: 0.7343
228/487 [=============>................] - ETA: 0s - loss: 0.7657 - accuracy: 0.7345
257/487 [==============>...............] - ETA: 0s - loss: 0.7658 - accuracy: 0.7344
285/487 [================>.............] - ETA: 0s - loss: 0.7657 - accuracy: 0.7346
314/487 [==================>...........] - ETA: 0s - loss: 0.7646 - accuracy: 0.7349
343/487 [====================>.........] - ETA: 0s - loss: 0.7647 - accuracy: 0.7349
372/487 [=====================>........] - ETA: 0s - loss: 0.7648 - accuracy: 0.7349
401/487 [=======================>......] - ETA: 0s - loss: 0.7642 - accuracy: 0.7352
429/487 [=========================>....] - ETA: 0s - loss: 0.7637 - accuracy: 0.7354
458/487 [===========================>..] - ETA: 0s - loss: 0.7629 - accuracy: 0.7357
486/487 [============================>.] - ETA: 0s - loss: 0.7627 - accuracy: 0.7355
Epoch 9: val_loss improved from 0.77204 to 0.76470, saving model to unpruned_model/model_best.h5
Epoch 9: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7628 - accuracy: 0.7355 - val_loss: 0.7647 - val_accuracy: 0.7356 - lr: 1.0000e-04
Epoch 10/30
1/487 [..............................] - ETA: 1s - loss: 0.7394 - accuracy: 0.7236
30/487 [>.............................] - ETA: 0s - loss: 0.7629 - accuracy: 0.7339
59/487 [==>...........................] - ETA: 0s - loss: 0.7618 - accuracy: 0.7342
87/487 [====>.........................] - ETA: 0s - loss: 0.7622 - accuracy: 0.7347
115/487 [======>.......................] - ETA: 0s - loss: 0.7604 - accuracy: 0.7349
143/487 [=======>......................] - ETA: 0s - loss: 0.7600 - accuracy: 0.7349
171/487 [=========>....................] - ETA: 0s - loss: 0.7600 - accuracy: 0.7346
199/487 [===========>..................] - ETA: 0s - loss: 0.7593 - accuracy: 0.7350
228/487 [=============>................] - ETA: 0s - loss: 0.7580 - accuracy: 0.7357
256/487 [==============>...............] - ETA: 0s - loss: 0.7579 - accuracy: 0.7357
284/487 [================>.............] - ETA: 0s - loss: 0.7579 - accuracy: 0.7361
313/487 [==================>...........] - ETA: 0s - loss: 0.7573 - accuracy: 0.7363
342/487 [====================>.........] - ETA: 0s - loss: 0.7573 - accuracy: 0.7364
370/487 [=====================>........] - ETA: 0s - loss: 0.7572 - accuracy: 0.7363
398/487 [=======================>......] - ETA: 0s - loss: 0.7563 - accuracy: 0.7366
427/487 [=========================>....] - ETA: 0s - loss: 0.7563 - accuracy: 0.7367
455/487 [===========================>..] - ETA: 0s - loss: 0.7562 - accuracy: 0.7367
484/487 [============================>.] - ETA: 0s - loss: 0.7557 - accuracy: 0.7369
Epoch 10: val_loss improved from 0.76470 to 0.75796, saving model to unpruned_model/model_best.h5
Epoch 10: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7556 - accuracy: 0.7369 - val_loss: 0.7580 - val_accuracy: 0.7370 - lr: 1.0000e-04
Epoch 11/30
1/487 [..............................] - ETA: 1s - loss: 0.7464 - accuracy: 0.7549
30/487 [>.............................] - ETA: 0s - loss: 0.7434 - accuracy: 0.7414
58/487 [==>...........................] - ETA: 0s - loss: 0.7425 - accuracy: 0.7413
87/487 [====>.........................] - ETA: 0s - loss: 0.7470 - accuracy: 0.7397
116/487 [======>.......................] - ETA: 0s - loss: 0.7485 - accuracy: 0.7383
144/487 [=======>......................] - ETA: 0s - loss: 0.7479 - accuracy: 0.7388
172/487 [=========>....................] - ETA: 0s - loss: 0.7478 - accuracy: 0.7392
201/487 [===========>..................] - ETA: 0s - loss: 0.7494 - accuracy: 0.7387
230/487 [=============>................] - ETA: 0s - loss: 0.7495 - accuracy: 0.7384
259/487 [==============>...............] - ETA: 0s - loss: 0.7493 - accuracy: 0.7388
288/487 [================>.............] - ETA: 0s - loss: 0.7498 - accuracy: 0.7384
317/487 [==================>...........] - ETA: 0s - loss: 0.7495 - accuracy: 0.7383
346/487 [====================>.........] - ETA: 0s - loss: 0.7494 - accuracy: 0.7384
375/487 [======================>.......] - ETA: 0s - loss: 0.7499 - accuracy: 0.7382
404/487 [=======================>......] - ETA: 0s - loss: 0.7493 - accuracy: 0.7383
433/487 [=========================>....] - ETA: 0s - loss: 0.7497 - accuracy: 0.7382
461/487 [===========================>..] - ETA: 0s - loss: 0.7493 - accuracy: 0.7383
Epoch 11: val_loss improved from 0.75796 to 0.75196, saving model to unpruned_model/model_best.h5
Epoch 11: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7493 - accuracy: 0.7384 - val_loss: 0.7520 - val_accuracy: 0.7381 - lr: 1.0000e-04
Epoch 12/30
1/487 [..............................] - ETA: 1s - loss: 0.7676 - accuracy: 0.7285
30/487 [>.............................] - ETA: 0s - loss: 0.7527 - accuracy: 0.7357
59/487 [==>...........................] - ETA: 0s - loss: 0.7435 - accuracy: 0.7393
88/487 [====>.........................] - ETA: 0s - loss: 0.7436 - accuracy: 0.7389
116/487 [======>.......................] - ETA: 0s - loss: 0.7460 - accuracy: 0.7382
144/487 [=======>......................] - ETA: 0s - loss: 0.7457 - accuracy: 0.7389
173/487 [=========>....................] - ETA: 0s - loss: 0.7444 - accuracy: 0.7396
201/487 [===========>..................] - ETA: 0s - loss: 0.7443 - accuracy: 0.7394
229/487 [=============>................] - ETA: 0s - loss: 0.7434 - accuracy: 0.7394
258/487 [==============>...............] - ETA: 0s - loss: 0.7432 - accuracy: 0.7397
286/487 [================>.............] - ETA: 0s - loss: 0.7436 - accuracy: 0.7396
314/487 [==================>...........] - ETA: 0s - loss: 0.7433 - accuracy: 0.7398
343/487 [====================>.........] - ETA: 0s - loss: 0.7439 - accuracy: 0.7396
372/487 [=====================>........] - ETA: 0s - loss: 0.7434 - accuracy: 0.7398
401/487 [=======================>......] - ETA: 0s - loss: 0.7442 - accuracy: 0.7394
430/487 [=========================>....] - ETA: 0s - loss: 0.7437 - accuracy: 0.7394
458/487 [===========================>..] - ETA: 0s - loss: 0.7436 - accuracy: 0.7394
486/487 [============================>.] - ETA: 0s - loss: 0.7437 - accuracy: 0.7395
Epoch 12: val_loss improved from 0.75196 to 0.74687, saving model to unpruned_model/model_best.h5
Epoch 12: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7437 - accuracy: 0.7395 - val_loss: 0.7469 - val_accuracy: 0.7397 - lr: 1.0000e-04
Epoch 13/30
1/487 [..............................] - ETA: 1s - loss: 0.7159 - accuracy: 0.7607
30/487 [>.............................] - ETA: 0s - loss: 0.7341 - accuracy: 0.7415
58/487 [==>...........................] - ETA: 0s - loss: 0.7366 - accuracy: 0.7402
87/487 [====>.........................] - ETA: 0s - loss: 0.7382 - accuracy: 0.7397
114/487 [======>.......................] - ETA: 0s - loss: 0.7383 - accuracy: 0.7403
143/487 [=======>......................] - ETA: 0s - loss: 0.7374 - accuracy: 0.7408
171/487 [=========>....................] - ETA: 0s - loss: 0.7379 - accuracy: 0.7410
200/487 [===========>..................] - ETA: 0s - loss: 0.7380 - accuracy: 0.7409
229/487 [=============>................] - ETA: 0s - loss: 0.7384 - accuracy: 0.7406
258/487 [==============>...............] - ETA: 0s - loss: 0.7387 - accuracy: 0.7406
286/487 [================>.............] - ETA: 0s - loss: 0.7371 - accuracy: 0.7412
315/487 [==================>...........] - ETA: 0s - loss: 0.7379 - accuracy: 0.7409
344/487 [====================>.........] - ETA: 0s - loss: 0.7377 - accuracy: 0.7408
373/487 [=====================>........] - ETA: 0s - loss: 0.7382 - accuracy: 0.7408
401/487 [=======================>......] - ETA: 0s - loss: 0.7380 - accuracy: 0.7411
429/487 [=========================>....] - ETA: 0s - loss: 0.7383 - accuracy: 0.7410
458/487 [===========================>..] - ETA: 0s - loss: 0.7385 - accuracy: 0.7410
486/487 [============================>.] - ETA: 0s - loss: 0.7387 - accuracy: 0.7407
Epoch 13: val_loss improved from 0.74687 to 0.74226, saving model to unpruned_model/model_best.h5
Epoch 13: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7387 - accuracy: 0.7407 - val_loss: 0.7423 - val_accuracy: 0.7406 - lr: 1.0000e-04
Epoch 14/30
1/487 [..............................] - ETA: 1s - loss: 0.7706 - accuracy: 0.7275
30/487 [>.............................] - ETA: 0s - loss: 0.7340 - accuracy: 0.7451
58/487 [==>...........................] - ETA: 0s - loss: 0.7340 - accuracy: 0.7444
86/487 [====>.........................] - ETA: 0s - loss: 0.7315 - accuracy: 0.7446
115/487 [======>.......................] - ETA: 0s - loss: 0.7350 - accuracy: 0.7427
143/487 [=======>......................] - ETA: 0s - loss: 0.7351 - accuracy: 0.7429
171/487 [=========>....................] - ETA: 0s - loss: 0.7354 - accuracy: 0.7426
199/487 [===========>..................] - ETA: 0s - loss: 0.7357 - accuracy: 0.7423
227/487 [============>.................] - ETA: 0s - loss: 0.7346 - accuracy: 0.7426
255/487 [==============>...............] - ETA: 0s - loss: 0.7349 - accuracy: 0.7423
284/487 [================>.............] - ETA: 0s - loss: 0.7343 - accuracy: 0.7426
313/487 [==================>...........] - ETA: 0s - loss: 0.7350 - accuracy: 0.7421
342/487 [====================>.........] - ETA: 0s - loss: 0.7348 - accuracy: 0.7422
370/487 [=====================>........] - ETA: 0s - loss: 0.7341 - accuracy: 0.7425
398/487 [=======================>......] - ETA: 0s - loss: 0.7340 - accuracy: 0.7423
426/487 [=========================>....] - ETA: 0s - loss: 0.7339 - accuracy: 0.7422
454/487 [==========================>...] - ETA: 0s - loss: 0.7344 - accuracy: 0.7420
482/487 [============================>.] - ETA: 0s - loss: 0.7343 - accuracy: 0.7420
Epoch 14: val_loss improved from 0.74226 to 0.73791, saving model to unpruned_model/model_best.h5
Epoch 14: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7343 - accuracy: 0.7419 - val_loss: 0.7379 - val_accuracy: 0.7424 - lr: 1.0000e-04
Epoch 15/30
1/487 [..............................] - ETA: 1s - loss: 0.7538 - accuracy: 0.7285
30/487 [>.............................] - ETA: 0s - loss: 0.7305 - accuracy: 0.7436
57/487 [==>...........................] - ETA: 0s - loss: 0.7331 - accuracy: 0.7425
85/487 [====>.........................] - ETA: 0s - loss: 0.7336 - accuracy: 0.7428
113/487 [=====>........................] - ETA: 0s - loss: 0.7321 - accuracy: 0.7425
141/487 [=======>......................] - ETA: 0s - loss: 0.7313 - accuracy: 0.7428
169/487 [=========>....................] - ETA: 0s - loss: 0.7311 - accuracy: 0.7428
197/487 [===========>..................] - ETA: 0s - loss: 0.7313 - accuracy: 0.7428
225/487 [============>.................] - ETA: 0s - loss: 0.7312 - accuracy: 0.7429
253/487 [==============>...............] - ETA: 0s - loss: 0.7317 - accuracy: 0.7426
281/487 [================>.............] - ETA: 0s - loss: 0.7323 - accuracy: 0.7425
309/487 [==================>...........] - ETA: 0s - loss: 0.7332 - accuracy: 0.7421
338/487 [===================>..........] - ETA: 0s - loss: 0.7328 - accuracy: 0.7423
366/487 [=====================>........] - ETA: 0s - loss: 0.7323 - accuracy: 0.7425
394/487 [=======================>......] - ETA: 0s - loss: 0.7321 - accuracy: 0.7425
422/487 [========================>.....] - ETA: 0s - loss: 0.7316 - accuracy: 0.7426
451/487 [==========================>...] - ETA: 0s - loss: 0.7306 - accuracy: 0.7429
479/487 [============================>.] - ETA: 0s - loss: 0.7305 - accuracy: 0.7429
Epoch 15: val_loss improved from 0.73791 to 0.73434, saving model to unpruned_model/model_best.h5
Epoch 15: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7305 - accuracy: 0.7429 - val_loss: 0.7343 - val_accuracy: 0.7430 - lr: 1.0000e-04
Epoch 16/30
1/487 [..............................] - ETA: 1s - loss: 0.6995 - accuracy: 0.7646
29/487 [>.............................] - ETA: 0s - loss: 0.7365 - accuracy: 0.7407
57/487 [==>...........................] - ETA: 0s - loss: 0.7359 - accuracy: 0.7413
85/487 [====>.........................] - ETA: 0s - loss: 0.7323 - accuracy: 0.7421
114/487 [======>.......................] - ETA: 0s - loss: 0.7329 - accuracy: 0.7417
143/487 [=======>......................] - ETA: 0s - loss: 0.7330 - accuracy: 0.7417
172/487 [=========>....................] - ETA: 0s - loss: 0.7305 - accuracy: 0.7427
200/487 [===========>..................] - ETA: 0s - loss: 0.7297 - accuracy: 0.7427
228/487 [=============>................] - ETA: 0s - loss: 0.7292 - accuracy: 0.7431
257/487 [==============>...............] - ETA: 0s - loss: 0.7291 - accuracy: 0.7431
285/487 [================>.............] - ETA: 0s - loss: 0.7291 - accuracy: 0.7431
313/487 [==================>...........] - ETA: 0s - loss: 0.7286 - accuracy: 0.7433
342/487 [====================>.........] - ETA: 0s - loss: 0.7287 - accuracy: 0.7432
371/487 [=====================>........] - ETA: 0s - loss: 0.7281 - accuracy: 0.7435
400/487 [=======================>......] - ETA: 0s - loss: 0.7277 - accuracy: 0.7435
428/487 [=========================>....] - ETA: 0s - loss: 0.7279 - accuracy: 0.7435
457/487 [===========================>..] - ETA: 0s - loss: 0.7276 - accuracy: 0.7435
485/487 [============================>.] - ETA: 0s - loss: 0.7272 - accuracy: 0.7437
Epoch 16: val_loss improved from 0.73434 to 0.73180, saving model to unpruned_model/model_best.h5
Epoch 16: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7271 - accuracy: 0.7437 - val_loss: 0.7318 - val_accuracy: 0.7431 - lr: 1.0000e-04
Epoch 17/30
1/487 [..............................] - ETA: 1s - loss: 0.7373 - accuracy: 0.7412
30/487 [>.............................] - ETA: 0s - loss: 0.7211 - accuracy: 0.7463
58/487 [==>...........................] - ETA: 0s - loss: 0.7251 - accuracy: 0.7452
86/487 [====>.........................] - ETA: 0s - loss: 0.7276 - accuracy: 0.7437
114/487 [======>.......................] - ETA: 0s - loss: 0.7288 - accuracy: 0.7435
142/487 [=======>......................] - ETA: 0s - loss: 0.7268 - accuracy: 0.7444
171/487 [=========>....................] - ETA: 0s - loss: 0.7241 - accuracy: 0.7455
199/487 [===========>..................] - ETA: 0s - loss: 0.7237 - accuracy: 0.7454
227/487 [============>.................] - ETA: 0s - loss: 0.7226 - accuracy: 0.7457
256/487 [==============>...............] - ETA: 0s - loss: 0.7227 - accuracy: 0.7453
285/487 [================>.............] - ETA: 0s - loss: 0.7236 - accuracy: 0.7449
313/487 [==================>...........] - ETA: 0s - loss: 0.7242 - accuracy: 0.7445
341/487 [====================>.........] - ETA: 0s - loss: 0.7242 - accuracy: 0.7445
370/487 [=====================>........] - ETA: 0s - loss: 0.7243 - accuracy: 0.7446
399/487 [=======================>......] - ETA: 0s - loss: 0.7243 - accuracy: 0.7448
427/487 [=========================>....] - ETA: 0s - loss: 0.7241 - accuracy: 0.7448
455/487 [===========================>..] - ETA: 0s - loss: 0.7244 - accuracy: 0.7446
483/487 [============================>.] - ETA: 0s - loss: 0.7243 - accuracy: 0.7446
Epoch 17: val_loss improved from 0.73180 to 0.72860, saving model to unpruned_model/model_best.h5
Epoch 17: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7241 - accuracy: 0.7447 - val_loss: 0.7286 - val_accuracy: 0.7441 - lr: 1.0000e-04
Epoch 18/30
1/487 [..............................] - ETA: 1s - loss: 0.7246 - accuracy: 0.7393
30/487 [>.............................] - ETA: 0s - loss: 0.7183 - accuracy: 0.7446
59/487 [==>...........................] - ETA: 0s - loss: 0.7196 - accuracy: 0.7452
87/487 [====>.........................] - ETA: 0s - loss: 0.7196 - accuracy: 0.7457
115/487 [======>.......................] - ETA: 0s - loss: 0.7201 - accuracy: 0.7462
143/487 [=======>......................] - ETA: 0s - loss: 0.7211 - accuracy: 0.7457
172/487 [=========>....................] - ETA: 0s - loss: 0.7217 - accuracy: 0.7457
200/487 [===========>..................] - ETA: 0s - loss: 0.7218 - accuracy: 0.7455
229/487 [=============>................] - ETA: 0s - loss: 0.7217 - accuracy: 0.7457
257/487 [==============>...............] - ETA: 0s - loss: 0.7209 - accuracy: 0.7456
286/487 [================>.............] - ETA: 0s - loss: 0.7210 - accuracy: 0.7458
315/487 [==================>...........] - ETA: 0s - loss: 0.7209 - accuracy: 0.7458
344/487 [====================>.........] - ETA: 0s - loss: 0.7202 - accuracy: 0.7459
372/487 [=====================>........] - ETA: 0s - loss: 0.7198 - accuracy: 0.7461
400/487 [=======================>......] - ETA: 0s - loss: 0.7202 - accuracy: 0.7459
429/487 [=========================>....] - ETA: 0s - loss: 0.7204 - accuracy: 0.7458
458/487 [===========================>..] - ETA: 0s - loss: 0.7209 - accuracy: 0.7456
486/487 [============================>.] - ETA: 0s - loss: 0.7215 - accuracy: 0.7454
Epoch 18: val_loss improved from 0.72860 to 0.72637, saving model to unpruned_model/model_best.h5
Epoch 18: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7215 - accuracy: 0.7454 - val_loss: 0.7264 - val_accuracy: 0.7448 - lr: 1.0000e-04
Epoch 19/30
1/487 [..............................] - ETA: 1s - loss: 0.7302 - accuracy: 0.7432
30/487 [>.............................] - ETA: 0s - loss: 0.7204 - accuracy: 0.7472
59/487 [==>...........................] - ETA: 0s - loss: 0.7177 - accuracy: 0.7468
88/487 [====>.........................] - ETA: 0s - loss: 0.7204 - accuracy: 0.7461
116/487 [======>.......................] - ETA: 0s - loss: 0.7193 - accuracy: 0.7462
145/487 [=======>......................] - ETA: 0s - loss: 0.7191 - accuracy: 0.7462
174/487 [=========>....................] - ETA: 0s - loss: 0.7184 - accuracy: 0.7466
203/487 [===========>..................] - ETA: 0s - loss: 0.7180 - accuracy: 0.7465
232/487 [=============>................] - ETA: 0s - loss: 0.7186 - accuracy: 0.7463
260/487 [===============>..............] - ETA: 0s - loss: 0.7186 - accuracy: 0.7464
288/487 [================>.............] - ETA: 0s - loss: 0.7193 - accuracy: 0.7461
316/487 [==================>...........] - ETA: 0s - loss: 0.7188 - accuracy: 0.7464
344/487 [====================>.........] - ETA: 0s - loss: 0.7189 - accuracy: 0.7465
373/487 [=====================>........] - ETA: 0s - loss: 0.7189 - accuracy: 0.7463
401/487 [=======================>......] - ETA: 0s - loss: 0.7190 - accuracy: 0.7463
429/487 [=========================>....] - ETA: 0s - loss: 0.7193 - accuracy: 0.7462
457/487 [===========================>..] - ETA: 0s - loss: 0.7186 - accuracy: 0.7464
485/487 [============================>.] - ETA: 0s - loss: 0.7190 - accuracy: 0.7463
Epoch 19: val_loss improved from 0.72637 to 0.72382, saving model to unpruned_model/model_best.h5
Epoch 19: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7191 - accuracy: 0.7462 - val_loss: 0.7238 - val_accuracy: 0.7457 - lr: 1.0000e-04
Epoch 20/30
1/487 [..............................] - ETA: 1s - loss: 0.7290 - accuracy: 0.7441
30/487 [>.............................] - ETA: 0s - loss: 0.7071 - accuracy: 0.7518
59/487 [==>...........................] - ETA: 0s - loss: 0.7152 - accuracy: 0.7478
88/487 [====>.........................] - ETA: 0s - loss: 0.7156 - accuracy: 0.7473
117/487 [======>.......................] - ETA: 0s - loss: 0.7155 - accuracy: 0.7474
146/487 [=======>......................] - ETA: 0s - loss: 0.7150 - accuracy: 0.7478
174/487 [=========>....................] - ETA: 0s - loss: 0.7168 - accuracy: 0.7471
203/487 [===========>..................] - ETA: 0s - loss: 0.7174 - accuracy: 0.7467
232/487 [=============>................] - ETA: 0s - loss: 0.7181 - accuracy: 0.7465
261/487 [===============>..............] - ETA: 0s - loss: 0.7189 - accuracy: 0.7460
290/487 [================>.............] - ETA: 0s - loss: 0.7184 - accuracy: 0.7463
319/487 [==================>...........] - ETA: 0s - loss: 0.7174 - accuracy: 0.7465
348/487 [====================>.........] - ETA: 0s - loss: 0.7169 - accuracy: 0.7467
377/487 [======================>.......] - ETA: 0s - loss: 0.7167 - accuracy: 0.7467
405/487 [=======================>......] - ETA: 0s - loss: 0.7172 - accuracy: 0.7468
433/487 [=========================>....] - ETA: 0s - loss: 0.7168 - accuracy: 0.7468
460/487 [===========================>..] - ETA: 0s - loss: 0.7171 - accuracy: 0.7468
Epoch 20: val_loss improved from 0.72382 to 0.72174, saving model to unpruned_model/model_best.h5
Epoch 20: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7170 - accuracy: 0.7468 - val_loss: 0.7217 - val_accuracy: 0.7463 - lr: 1.0000e-04
Epoch 21/30
1/487 [..............................] - ETA: 1s - loss: 0.7633 - accuracy: 0.7344
29/487 [>.............................] - ETA: 0s - loss: 0.7212 - accuracy: 0.7437
58/487 [==>...........................] - ETA: 0s - loss: 0.7151 - accuracy: 0.7463
87/487 [====>.........................] - ETA: 0s - loss: 0.7140 - accuracy: 0.7474
115/487 [======>.......................] - ETA: 0s - loss: 0.7141 - accuracy: 0.7473
144/487 [=======>......................] - ETA: 0s - loss: 0.7157 - accuracy: 0.7472
173/487 [=========>....................] - ETA: 0s - loss: 0.7162 - accuracy: 0.7470
202/487 [===========>..................] - ETA: 0s - loss: 0.7158 - accuracy: 0.7470
231/487 [=============>................] - ETA: 0s - loss: 0.7162 - accuracy: 0.7468
260/487 [===============>..............] - ETA: 0s - loss: 0.7173 - accuracy: 0.7461
289/487 [================>.............] - ETA: 0s - loss: 0.7167 - accuracy: 0.7465
317/487 [==================>...........] - ETA: 0s - loss: 0.7161 - accuracy: 0.7467
346/487 [====================>.........] - ETA: 0s - loss: 0.7164 - accuracy: 0.7467
375/487 [======================>.......] - ETA: 0s - loss: 0.7164 - accuracy: 0.7467
404/487 [=======================>......] - ETA: 0s - loss: 0.7160 - accuracy: 0.7468
433/487 [=========================>....] - ETA: 0s - loss: 0.7155 - accuracy: 0.7471
462/487 [===========================>..] - ETA: 0s - loss: 0.7153 - accuracy: 0.7471
Epoch 21: val_loss improved from 0.72174 to 0.71981, saving model to unpruned_model/model_best.h5
Epoch 21: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7150 - accuracy: 0.7473 - val_loss: 0.7198 - val_accuracy: 0.7463 - lr: 1.0000e-04
Epoch 22/30
1/487 [..............................] - ETA: 1s - loss: 0.7174 - accuracy: 0.7393
30/487 [>.............................] - ETA: 0s - loss: 0.7103 - accuracy: 0.7482
58/487 [==>...........................] - ETA: 0s - loss: 0.7169 - accuracy: 0.7461
86/487 [====>.........................] - ETA: 0s - loss: 0.7200 - accuracy: 0.7445
114/487 [======>.......................] - ETA: 0s - loss: 0.7182 - accuracy: 0.7459
143/487 [=======>......................] - ETA: 0s - loss: 0.7177 - accuracy: 0.7463
172/487 [=========>....................] - ETA: 0s - loss: 0.7168 - accuracy: 0.7467
201/487 [===========>..................] - ETA: 0s - loss: 0.7152 - accuracy: 0.7467
229/487 [=============>................] - ETA: 0s - loss: 0.7146 - accuracy: 0.7475
258/487 [==============>...............] - ETA: 0s - loss: 0.7138 - accuracy: 0.7479
287/487 [================>.............] - ETA: 0s - loss: 0.7136 - accuracy: 0.7477
315/487 [==================>...........] - ETA: 0s - loss: 0.7129 - accuracy: 0.7481
344/487 [====================>.........] - ETA: 0s - loss: 0.7135 - accuracy: 0.7479
372/487 [=====================>........] - ETA: 0s - loss: 0.7140 - accuracy: 0.7478
400/487 [=======================>......] - ETA: 0s - loss: 0.7145 - accuracy: 0.7476
428/487 [=========================>....] - ETA: 0s - loss: 0.7138 - accuracy: 0.7479
455/487 [===========================>..] - ETA: 0s - loss: 0.7134 - accuracy: 0.7480
483/487 [============================>.] - ETA: 0s - loss: 0.7131 - accuracy: 0.7481
Epoch 22: val_loss improved from 0.71981 to 0.71822, saving model to unpruned_model/model_best.h5
Epoch 22: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7131 - accuracy: 0.7480 - val_loss: 0.7182 - val_accuracy: 0.7471 - lr: 1.0000e-04
Epoch 23/30
1/487 [..............................] - ETA: 1s - loss: 0.7189 - accuracy: 0.7383
30/487 [>.............................] - ETA: 0s - loss: 0.7068 - accuracy: 0.7513
59/487 [==>...........................] - ETA: 0s - loss: 0.7100 - accuracy: 0.7501
88/487 [====>.........................] - ETA: 0s - loss: 0.7117 - accuracy: 0.7491
116/487 [======>.......................] - ETA: 0s - loss: 0.7122 - accuracy: 0.7487
145/487 [=======>......................] - ETA: 0s - loss: 0.7121 - accuracy: 0.7490
173/487 [=========>....................] - ETA: 0s - loss: 0.7102 - accuracy: 0.7497
202/487 [===========>..................] - ETA: 0s - loss: 0.7100 - accuracy: 0.7496
231/487 [=============>................] - ETA: 0s - loss: 0.7100 - accuracy: 0.7497
259/487 [==============>...............] - ETA: 0s - loss: 0.7107 - accuracy: 0.7495
288/487 [================>.............] - ETA: 0s - loss: 0.7098 - accuracy: 0.7497
317/487 [==================>...........] - ETA: 0s - loss: 0.7105 - accuracy: 0.7493
346/487 [====================>.........] - ETA: 0s - loss: 0.7104 - accuracy: 0.7491
374/487 [======================>.......] - ETA: 0s - loss: 0.7108 - accuracy: 0.7488
403/487 [=======================>......] - ETA: 0s - loss: 0.7113 - accuracy: 0.7485
432/487 [=========================>....] - ETA: 0s - loss: 0.7112 - accuracy: 0.7486
461/487 [===========================>..] - ETA: 0s - loss: 0.7112 - accuracy: 0.7487
Epoch 23: val_loss improved from 0.71822 to 0.71635, saving model to unpruned_model/model_best.h5
Epoch 23: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7115 - accuracy: 0.7485 - val_loss: 0.7163 - val_accuracy: 0.7477 - lr: 1.0000e-04
Epoch 24/30
1/487 [..............................] - ETA: 1s - loss: 0.6994 - accuracy: 0.7666
29/487 [>.............................] - ETA: 0s - loss: 0.7142 - accuracy: 0.7479
56/487 [==>...........................] - ETA: 0s - loss: 0.7128 - accuracy: 0.7472
84/487 [====>.........................] - ETA: 0s - loss: 0.7116 - accuracy: 0.7482
112/487 [=====>........................] - ETA: 0s - loss: 0.7097 - accuracy: 0.7485
141/487 [=======>......................] - ETA: 0s - loss: 0.7092 - accuracy: 0.7487
169/487 [=========>....................] - ETA: 0s - loss: 0.7077 - accuracy: 0.7493
198/487 [===========>..................] - ETA: 0s - loss: 0.7092 - accuracy: 0.7487
227/487 [============>.................] - ETA: 0s - loss: 0.7092 - accuracy: 0.7491
256/487 [==============>...............] - ETA: 0s - loss: 0.7099 - accuracy: 0.7490
284/487 [================>.............] - ETA: 0s - loss: 0.7090 - accuracy: 0.7493
312/487 [==================>...........] - ETA: 0s - loss: 0.7091 - accuracy: 0.7492
340/487 [===================>..........] - ETA: 0s - loss: 0.7095 - accuracy: 0.7492
369/487 [=====================>........] - ETA: 0s - loss: 0.7095 - accuracy: 0.7492
398/487 [=======================>......] - ETA: 0s - loss: 0.7091 - accuracy: 0.7495
427/487 [=========================>....] - ETA: 0s - loss: 0.7092 - accuracy: 0.7494
456/487 [===========================>..] - ETA: 0s - loss: 0.7095 - accuracy: 0.7492
485/487 [============================>.] - ETA: 0s - loss: 0.7099 - accuracy: 0.7490
Epoch 24: val_loss improved from 0.71635 to 0.71453, saving model to unpruned_model/model_best.h5
Epoch 24: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7098 - accuracy: 0.7491 - val_loss: 0.7145 - val_accuracy: 0.7478 - lr: 1.0000e-04
Epoch 25/30
1/487 [..............................] - ETA: 1s - loss: 0.6934 - accuracy: 0.7568
30/487 [>.............................] - ETA: 0s - loss: 0.7114 - accuracy: 0.7477
59/487 [==>...........................] - ETA: 0s - loss: 0.7120 - accuracy: 0.7485
88/487 [====>.........................] - ETA: 0s - loss: 0.7114 - accuracy: 0.7487
117/487 [======>.......................] - ETA: 0s - loss: 0.7109 - accuracy: 0.7485
146/487 [=======>......................] - ETA: 0s - loss: 0.7103 - accuracy: 0.7485
175/487 [=========>....................] - ETA: 0s - loss: 0.7099 - accuracy: 0.7491
204/487 [===========>..................] - ETA: 0s - loss: 0.7092 - accuracy: 0.7492
233/487 [=============>................] - ETA: 0s - loss: 0.7096 - accuracy: 0.7489
262/487 [===============>..............] - ETA: 0s - loss: 0.7106 - accuracy: 0.7484
291/487 [================>.............] - ETA: 0s - loss: 0.7102 - accuracy: 0.7487
319/487 [==================>...........] - ETA: 0s - loss: 0.7110 - accuracy: 0.7482
348/487 [====================>.........] - ETA: 0s - loss: 0.7105 - accuracy: 0.7486
377/487 [======================>.......] - ETA: 0s - loss: 0.7096 - accuracy: 0.7489
406/487 [========================>.....] - ETA: 0s - loss: 0.7100 - accuracy: 0.7487
435/487 [=========================>....] - ETA: 0s - loss: 0.7093 - accuracy: 0.7489
464/487 [===========================>..] - ETA: 0s - loss: 0.7086 - accuracy: 0.7492
Epoch 25: val_loss improved from 0.71453 to 0.71329, saving model to unpruned_model/model_best.h5
Epoch 25: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7083 - accuracy: 0.7494 - val_loss: 0.7133 - val_accuracy: 0.7480 - lr: 1.0000e-04
Epoch 26/30
1/487 [..............................] - ETA: 1s - loss: 0.7471 - accuracy: 0.7207
30/487 [>.............................] - ETA: 0s - loss: 0.7052 - accuracy: 0.7507
58/487 [==>...........................] - ETA: 0s - loss: 0.7049 - accuracy: 0.7508
87/487 [====>.........................] - ETA: 0s - loss: 0.7090 - accuracy: 0.7481
116/487 [======>.......................] - ETA: 0s - loss: 0.7100 - accuracy: 0.7478
145/487 [=======>......................] - ETA: 0s - loss: 0.7111 - accuracy: 0.7478
174/487 [=========>....................] - ETA: 0s - loss: 0.7093 - accuracy: 0.7486
202/487 [===========>..................] - ETA: 0s - loss: 0.7087 - accuracy: 0.7489
231/487 [=============>................] - ETA: 0s - loss: 0.7078 - accuracy: 0.7493
260/487 [===============>..............] - ETA: 0s - loss: 0.7071 - accuracy: 0.7496
288/487 [================>.............] - ETA: 0s - loss: 0.7075 - accuracy: 0.7495
316/487 [==================>...........] - ETA: 0s - loss: 0.7070 - accuracy: 0.7496
345/487 [====================>.........] - ETA: 0s - loss: 0.7072 - accuracy: 0.7496
374/487 [======================>.......] - ETA: 0s - loss: 0.7072 - accuracy: 0.7497
403/487 [=======================>......] - ETA: 0s - loss: 0.7077 - accuracy: 0.7496
432/487 [=========================>....] - ETA: 0s - loss: 0.7071 - accuracy: 0.7498
461/487 [===========================>..] - ETA: 0s - loss: 0.7064 - accuracy: 0.7502
Epoch 26: val_loss improved from 0.71329 to 0.71199, saving model to unpruned_model/model_best.h5
Epoch 26: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7068 - accuracy: 0.7500 - val_loss: 0.7120 - val_accuracy: 0.7489 - lr: 1.0000e-04
Epoch 27/30
1/487 [..............................] - ETA: 1s - loss: 0.7231 - accuracy: 0.7529
30/487 [>.............................] - ETA: 0s - loss: 0.7056 - accuracy: 0.7495
58/487 [==>...........................] - ETA: 0s - loss: 0.7038 - accuracy: 0.7502
87/487 [====>.........................] - ETA: 0s - loss: 0.7070 - accuracy: 0.7499
115/487 [======>.......................] - ETA: 0s - loss: 0.7073 - accuracy: 0.7496
144/487 [=======>......................] - ETA: 0s - loss: 0.7060 - accuracy: 0.7497
172/487 [=========>....................] - ETA: 0s - loss: 0.7063 - accuracy: 0.7499
201/487 [===========>..................] - ETA: 0s - loss: 0.7059 - accuracy: 0.7496
230/487 [=============>................] - ETA: 0s - loss: 0.7051 - accuracy: 0.7503
258/487 [==============>...............] - ETA: 0s - loss: 0.7046 - accuracy: 0.7505
286/487 [================>.............] - ETA: 0s - loss: 0.7046 - accuracy: 0.7504
315/487 [==================>...........] - ETA: 0s - loss: 0.7054 - accuracy: 0.7501
344/487 [====================>.........] - ETA: 0s - loss: 0.7054 - accuracy: 0.7500
373/487 [=====================>........] - ETA: 0s - loss: 0.7054 - accuracy: 0.7500
402/487 [=======================>......] - ETA: 0s - loss: 0.7058 - accuracy: 0.7498
431/487 [=========================>....] - ETA: 0s - loss: 0.7059 - accuracy: 0.7500
460/487 [===========================>..] - ETA: 0s - loss: 0.7056 - accuracy: 0.7501
Epoch 27: val_loss improved from 0.71199 to 0.71041, saving model to unpruned_model/model_best.h5
Epoch 27: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7054 - accuracy: 0.7503 - val_loss: 0.7104 - val_accuracy: 0.7490 - lr: 1.0000e-04
Epoch 28/30
1/487 [..............................] - ETA: 1s - loss: 0.7551 - accuracy: 0.7295
30/487 [>.............................] - ETA: 0s - loss: 0.7025 - accuracy: 0.7523
59/487 [==>...........................] - ETA: 0s - loss: 0.7031 - accuracy: 0.7531
87/487 [====>.........................] - ETA: 0s - loss: 0.7028 - accuracy: 0.7522
115/487 [======>.......................] - ETA: 0s - loss: 0.7035 - accuracy: 0.7514
143/487 [=======>......................] - ETA: 0s - loss: 0.7040 - accuracy: 0.7513
172/487 [=========>....................] - ETA: 0s - loss: 0.7034 - accuracy: 0.7512
201/487 [===========>..................] - ETA: 0s - loss: 0.7035 - accuracy: 0.7511
230/487 [=============>................] - ETA: 0s - loss: 0.7037 - accuracy: 0.7511
258/487 [==============>...............] - ETA: 0s - loss: 0.7039 - accuracy: 0.7510
287/487 [================>.............] - ETA: 0s - loss: 0.7033 - accuracy: 0.7513
315/487 [==================>...........] - ETA: 0s - loss: 0.7032 - accuracy: 0.7513
343/487 [====================>.........] - ETA: 0s - loss: 0.7033 - accuracy: 0.7513
372/487 [=====================>........] - ETA: 0s - loss: 0.7042 - accuracy: 0.7508
401/487 [=======================>......] - ETA: 0s - loss: 0.7038 - accuracy: 0.7510
429/487 [=========================>....] - ETA: 0s - loss: 0.7040 - accuracy: 0.7508
457/487 [===========================>..] - ETA: 0s - loss: 0.7039 - accuracy: 0.7507
486/487 [============================>.] - ETA: 0s - loss: 0.7039 - accuracy: 0.7507
Epoch 28: val_loss improved from 0.71041 to 0.70892, saving model to unpruned_model/model_best.h5
Epoch 28: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7039 - accuracy: 0.7507 - val_loss: 0.7089 - val_accuracy: 0.7495 - lr: 1.0000e-04
Epoch 29/30
1/487 [..............................] - ETA: 1s - loss: 0.7498 - accuracy: 0.7275
29/487 [>.............................] - ETA: 0s - loss: 0.6990 - accuracy: 0.7520
57/487 [==>...........................] - ETA: 0s - loss: 0.6965 - accuracy: 0.7535
85/487 [====>.........................] - ETA: 0s - loss: 0.7007 - accuracy: 0.7522
114/487 [======>.......................] - ETA: 0s - loss: 0.7012 - accuracy: 0.7523
142/487 [=======>......................] - ETA: 0s - loss: 0.7021 - accuracy: 0.7518
171/487 [=========>....................] - ETA: 0s - loss: 0.7030 - accuracy: 0.7513
199/487 [===========>..................] - ETA: 0s - loss: 0.7034 - accuracy: 0.7508
226/487 [============>.................] - ETA: 0s - loss: 0.7040 - accuracy: 0.7508
255/487 [==============>...............] - ETA: 0s - loss: 0.7044 - accuracy: 0.7507
284/487 [================>.............] - ETA: 0s - loss: 0.7044 - accuracy: 0.7503
313/487 [==================>...........] - ETA: 0s - loss: 0.7044 - accuracy: 0.7503
342/487 [====================>.........] - ETA: 0s - loss: 0.7032 - accuracy: 0.7509
371/487 [=====================>........] - ETA: 0s - loss: 0.7029 - accuracy: 0.7510
399/487 [=======================>......] - ETA: 0s - loss: 0.7030 - accuracy: 0.7510
427/487 [=========================>....] - ETA: 0s - loss: 0.7026 - accuracy: 0.7512
456/487 [===========================>..] - ETA: 0s - loss: 0.7028 - accuracy: 0.7511
485/487 [============================>.] - ETA: 0s - loss: 0.7026 - accuracy: 0.7512
Epoch 29: val_loss improved from 0.70892 to 0.70775, saving model to unpruned_model/model_best.h5
Epoch 29: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7026 - accuracy: 0.7512 - val_loss: 0.7077 - val_accuracy: 0.7497 - lr: 1.0000e-04
Epoch 30/30
1/487 [..............................] - ETA: 1s - loss: 0.7154 - accuracy: 0.7471
30/487 [>.............................] - ETA: 0s - loss: 0.7020 - accuracy: 0.7512
59/487 [==>...........................] - ETA: 0s - loss: 0.7019 - accuracy: 0.7519
88/487 [====>.........................] - ETA: 0s - loss: 0.7010 - accuracy: 0.7517
117/487 [======>.......................] - ETA: 0s - loss: 0.7033 - accuracy: 0.7509
145/487 [=======>......................] - ETA: 0s - loss: 0.7039 - accuracy: 0.7505
174/487 [=========>....................] - ETA: 0s - loss: 0.7031 - accuracy: 0.7506
202/487 [===========>..................] - ETA: 0s - loss: 0.7033 - accuracy: 0.7505
231/487 [=============>................] - ETA: 0s - loss: 0.7030 - accuracy: 0.7505
260/487 [===============>..............] - ETA: 0s - loss: 0.7012 - accuracy: 0.7511
289/487 [================>.............] - ETA: 0s - loss: 0.7009 - accuracy: 0.7512
317/487 [==================>...........] - ETA: 0s - loss: 0.7009 - accuracy: 0.7512
345/487 [====================>.........] - ETA: 0s - loss: 0.7007 - accuracy: 0.7513
374/487 [======================>.......] - ETA: 0s - loss: 0.7002 - accuracy: 0.7517
402/487 [=======================>......] - ETA: 0s - loss: 0.7001 - accuracy: 0.7518
430/487 [=========================>....] - ETA: 0s - loss: 0.7002 - accuracy: 0.7519
459/487 [===========================>..] - ETA: 0s - loss: 0.7007 - accuracy: 0.7518
Epoch 30: val_loss improved from 0.70775 to 0.70633, saving model to unpruned_model/model_best.h5
Epoch 30: saving model to unpruned_model/model_last.h5
487/487 [==============================] - 1s 2ms/step - loss: 0.7013 - accuracy: 0.7517 - val_loss: 0.7063 - val_accuracy: 0.7505 - lr: 1.0000e-04
<keras.src.callbacks.History at 0x7f700c932710>
Train the pruned model#
This time we’ll use the Tensorflow model optimization sparsity to train a sparse model (forcing many weights to ‘0’). In this instance, the target sparsity is 75%
from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule
from tensorflow_model_optimization.sparsity.keras import strip_pruning
pruned_model = Sequential()
pruned_model.add(Dense(64, input_shape=(16,), name="fc1", kernel_initializer="lecun_uniform", kernel_regularizer=l1(0.0001)))
pruned_model.add(Activation(activation="relu", name="relu1"))
pruned_model.add(Dense(32, name="fc2", kernel_initializer="lecun_uniform", kernel_regularizer=l1(0.0001)))
pruned_model.add(Activation(activation="relu", name="relu2"))
pruned_model.add(Dense(32, name="fc3", kernel_initializer="lecun_uniform", kernel_regularizer=l1(0.0001)))
pruned_model.add(Activation(activation="relu", name="relu3"))
pruned_model.add(Dense(5, name="output", kernel_initializer="lecun_uniform", kernel_regularizer=l1(0.0001)))
pruned_model.add(Activation(activation="softmax", name="softmax"))
pruning_params = {"pruning_schedule": pruning_schedule.ConstantSparsity(0.75, begin_step=2000, frequency=100)}
pruned_model = prune.prune_low_magnitude(pruned_model, **pruning_params)
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[7], line 1
----> 1 from tensorflow_model_optimization.python.core.sparsity.keras import prune, pruning_callbacks, pruning_schedule
2 from tensorflow_model_optimization.sparsity.keras import strip_pruning
4 pruned_model = Sequential()
ModuleNotFoundError: No module named 'tensorflow_model_optimization'
We’ll use the same settings as before: Adam optimizer with categorical crossentropy loss.
The callbacks will decay the learning rate and save the model into a directory pruned_model
.
adam = Adam(lr=0.0001)
pruned_model.compile(optimizer=adam, loss=["categorical_crossentropy"], metrics=["accuracy"])
callbacks = all_callbacks(
stop_patience=1000,
lr_factor=0.5,
lr_patience=10,
lr_epsilon=0.000001,
lr_cooldown=2,
lr_minimum=0.0000001,
outputDir="pruned_model",
)
callbacks.callbacks.append(pruning_callbacks.UpdatePruningStep())
pruned_model.fit(
X_train_val,
y_train_val,
batch_size=1024,
epochs=30,
validation_split=0.25,
shuffle=True,
callbacks=callbacks.callbacks,
verbose=0,
)
# Save the model again but with the pruning 'stripped' to use the regular layer types
pruned_model = strip_pruning(pruned_model)
pruned_model.save("pruned_model/model_best.h5")
Check sparsity#
Make a quick check that the model was indeed trained sparse. We’ll just make a histogram of the weights of the 1st layer, and hopefully observe a large peak in the bin containing ‘0’. Note logarithmic y axis.
bins = np.arange(-2, 2, 0.04)
w_unpruned = model.layers[0].weights[0].numpy().flatten()
w_pruned = pruned_model.layers[0].weights[0].numpy().flatten()
plt.figure(figsize=(7, 7))
plt.hist(w_unpruned, bins=bins, alpha=0.7, label="Unpruned layer 1")
plt.hist(w_pruned, bins=bins, alpha=0.7, label="Pruned layer 1")
plt.xlabel("Weight value")
plt.ylabel("Number of weights")
plt.semilogy()
plt.legend()
print(f"Sparsity of unpruned model layer 1: {np.sum(w_unpruned==0)*100/np.size(w_unpruned)}% zeros")
print(f"Sparsity of pruned model layer 1: {np.sum(w_pruned==0)*100/np.size(w_pruned)}% zeros")
plt.show()
Check performance#
How does this 75% sparse model compare against the unpruned model? Let’s report the accuracy and make a ROC curve. The pruned model is shown with solid lines, the unpruned model is shown with dashed lines.
import plotting
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from tensorflow.keras.models import load_model
unpruned_model = load_model("unpruned_model/model_best.h5")
y_ref = unpruned_model.predict(X_test, verbose=0)
y_prune = pruned_model.predict(X_test, verbose=0)
print("Accuracy unpruned: {}".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_ref, axis=1))))
print("Accuracy pruned: {}".format(accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_prune, axis=1))))
fig, ax = plt.subplots(figsize=(9, 9))
_ = plotting.make_roc(y_test, y_ref, classes)
plt.gca().set_prop_cycle(None) # reset the colors
_ = plotting.make_roc(y_test, y_prune, classes, linestyle="--")
from matplotlib.lines import Line2D
lines = [Line2D([0], [0], ls="-"), Line2D([0], [0], ls="--")]
from matplotlib.legend import Legend
leg = Legend(ax, lines, labels=["Unpruned", "Pruned"], loc="lower right", frameon=False)
ax.add_artist(leg)
plt.show()