#imports
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.backend import clear_session
!pip install optuna
Collecting optuna
Downloading optuna-2.9.1-py3-none-any.whl (302 kB)
|████████████████████████████████| 302 kB 23.0 MB/s
Collecting alembic
Downloading alembic-1.6.5-py2.py3-none-any.whl (164 kB)
|████████████████████████████████| 164 kB 74.5 MB/s
Requirement already satisfied: numpy in /shared-libs/python3.7/py/lib/python3.7/site-packages (from optuna) (1.19.5)
Requirement already satisfied: scipy!=1.4.0 in /shared-libs/python3.7/py/lib/python3.7/site-packages (from optuna) (1.7.1)
Requirement already satisfied: sqlalchemy>=1.1.0 in /shared-libs/python3.7/py/lib/python3.7/site-packages (from optuna) (1.4.22)
Collecting cliff
Downloading cliff-3.8.0-py3-none-any.whl (80 kB)
|████████████████████████████████| 80 kB 19.8 MB/s
Collecting colorlog
Downloading colorlog-6.4.1-py2.py3-none-any.whl (11 kB)
Requirement already satisfied: packaging>=20.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from optuna) (21.0)
Collecting cmaes>=0.8.2
Downloading cmaes-0.8.2-py3-none-any.whl (15 kB)
Requirement already satisfied: tqdm in /shared-libs/python3.7/py/lib/python3.7/site-packages (from optuna) (4.62.0)
Requirement already satisfied: PyYAML in /shared-libs/python3.7/py/lib/python3.7/site-packages (from optuna) (5.4.1)
Requirement already satisfied: pyparsing>=2.0.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from packaging>=20.0->optuna) (2.4.7)
Requirement already satisfied: greenlet!=0.4.17 in /shared-libs/python3.7/py/lib/python3.7/site-packages (from sqlalchemy>=1.1.0->optuna) (1.1.0)
Requirement already satisfied: importlib-metadata in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from sqlalchemy>=1.1.0->optuna) (3.10.1)
Collecting python-editor>=0.3
Downloading python_editor-1.0.4-py3-none-any.whl (4.9 kB)
Collecting Mako
Downloading Mako-1.1.5-py2.py3-none-any.whl (75 kB)
|████████████████████████████████| 75 kB 9.4 MB/s
Requirement already satisfied: python-dateutil in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from alembic->optuna) (2.8.2)
Collecting pbr!=2.1.0,>=2.0.0
Downloading pbr-5.6.0-py2.py3-none-any.whl (111 kB)
|████████████████████████████████| 111 kB 66.0 MB/s
Collecting stevedore>=2.0.1
Downloading stevedore-3.4.0-py3-none-any.whl (49 kB)
|████████████████████████████████| 49 kB 12.8 MB/s
Collecting cmd2>=1.0.0
Downloading cmd2-2.1.2-py3-none-any.whl (141 kB)
|████████████████████████████████| 141 kB 65.1 MB/s
Collecting PrettyTable>=0.7.2
Downloading prettytable-2.1.0-py3-none-any.whl (22 kB)
Requirement already satisfied: typing-extensions in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from cmd2>=1.0.0->cliff->optuna) (3.10.0.0)
Requirement already satisfied: attrs>=16.3.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from cmd2>=1.0.0->cliff->optuna) (21.2.0)
Collecting colorama>=0.3.7
Downloading colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Requirement already satisfied: wcwidth>=0.1.7 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from cmd2>=1.0.0->cliff->optuna) (0.2.5)
Collecting pyperclip>=1.6
Downloading pyperclip-1.8.2.tar.gz (20 kB)
Requirement already satisfied: zipp>=0.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from importlib-metadata->sqlalchemy>=1.1.0->optuna) (3.5.0)
Requirement already satisfied: MarkupSafe>=0.9.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from Mako->alembic->optuna) (2.0.1)
Requirement already satisfied: six>=1.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from python-dateutil->alembic->optuna) (1.16.0)
Building wheels for collected packages: pyperclip
Building wheel for pyperclip (setup.py) ... done
Created wheel for pyperclip: filename=pyperclip-1.8.2-py3-none-any.whl size=11137 sha256=9a73e835eeef3085f259458b1538d485e1b84c75d9eeedca21b76e576b444051
Stored in directory: /root/.cache/pip/wheels/9f/18/84/8f69f8b08169c7bae2dde6bd7daf0c19fca8c8e500ee620a28
Successfully built pyperclip
Installing collected packages: pyperclip, pbr, colorama, stevedore, python-editor, PrettyTable, Mako, cmd2, colorlog, cmaes, cliff, alembic, optuna
Successfully installed Mako-1.1.5 PrettyTable-2.1.0 alembic-1.6.5 cliff-3.8.0 cmaes-0.8.2 cmd2-2.1.2 colorama-0.4.4 colorlog-6.4.1 optuna-2.9.1 pbr-5.6.0 pyperclip-1.8.2 python-editor-1.0.4 stevedore-3.4.0
WARNING: You are using pip version 21.2.2; however, version 21.2.4 is available.
You should consider upgrading via the '/root/venv/bin/python -m pip install --upgrade pip' command.
import optuna
#Add the model
dropout_rate = [0] * 2
def create_model(trial):
num_layers = trial.suggest_int("num_layers", 1, 5)
activation = trial.suggest_categorical("activation", ["relu", "linear", "selu", "elu", "exponential"])
dropout_rate[0] = trial.suggest_uniform('dropout_rate'+str(0), 0.0, 0.5)
dropout_rate[1] = trial.suggest_uniform('dropout_rate'+str(1), 0.0, 0.5)
mid_units = int(trial.suggest_discrete_uniform("mid_units", 100, 300, 100))
filters=trial.suggest_categorical("filters", [32, 64])
kernel_size=trial.suggest_categorical("kernel_size", [3, 3])
strides=trial.suggest_categorical("strides", [1, 2])
classifier = Sequential()
#step 1 - Convolution Layers
classifier.add(
Conv2D(
filters=filters,
kernel_size=kernel_size,
strides=strides,
activation = activation,
input_shape=(64, 64, 3),
)
)
classifier.add(MaxPooling2D(pool_size=(2, 2)))
for i in range(1, num_layers):
classifier.add(
Conv2D(
filters=filters,
kernel_size=kernel_size,
strides=strides,
activation = activation,
)
)
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Dropout(dropout_rate[0]))
classifier.add(Flatten())
classifier.add(Dense(units = mid_units, activation = activation))
classifier.add(Dropout(dropout_rate[1]))
classifier.add(Dense(units = 1, activation ='sigmoid'))
return classifier
#image augumentation
from keras.preprocessing.image import ImageDataGenerator
#Data Preparation
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('cats_and_dogs_filtered/train',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
test_set = test_datagen.flow_from_directory('cats_and_dogs_filtered/validation',
target_size = (64, 64),
batch_size = 32,
class_mode = 'binary')
Found 1645 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
training_set
#create objective
def objective(trial):
#clear session
clear_session()
optimizer = trial.suggest_categorical("optimizer", ["sgd", "adam", "rmsprop", "adadelta", "adagrad", "adamax"])
classifier = create_model(trial)
classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])
history = classifier.fit_generator(training_set,
steps_per_epoch = 30, # num_samples // batch_size
epochs = 1, # entire iteration over dataset
validation_data = test_set,
validation_steps = 20) #https://keras.io/api/models/model_training_apis/
return 1 - history.history["accuracy"][-1]
#perform study
study = optuna.create_study()
study.optimize(objective, n_trials=5)
[I 2021-08-24 23:01:16,844] A new study created in memory with name: no-name-df230ad2-e923-484b-bfdc-4aaa297b625c
/shared-libs/python3.7/py/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
warnings.warn('`Model.fit_generator` is deprecated and '
30/30 [==============================] - 7s 210ms/step - loss: 0.7363 - accuracy: 0.5656 - val_loss: 0.7291 - val_accuracy: 0.4875
[I 2021-08-24 23:01:23,714] Trial 0 finished with value: 0.43358129262924194 and parameters: {'optimizer': 'rmsprop', 'num_layers': 1, 'activation': 'relu', 'dropout_rate0': 0.1778226393029489, 'dropout_rate1': 0.05951146988159023, 'mid_units': 200.0, 'filters': 64, 'kernel_size': 3, 'strides': 2}. Best is trial 0 with value: 0.43358129262924194.
/shared-libs/python3.7/py/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
warnings.warn('`Model.fit_generator` is deprecated and '
30/30 [==============================] - 6s 202ms/step - loss: 0.6986 - accuracy: 0.5587 - val_loss: 0.7215 - val_accuracy: 0.5094
[I 2021-08-24 23:01:30,339] Trial 1 finished with value: 0.4479166865348816 and parameters: {'optimizer': 'adagrad', 'num_layers': 2, 'activation': 'linear', 'dropout_rate0': 0.3107256999598417, 'dropout_rate1': 0.19048225555453424, 'mid_units': 100.0, 'filters': 32, 'kernel_size': 3, 'strides': 2}. Best is trial 0 with value: 0.43358129262924194.
/shared-libs/python3.7/py/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
warnings.warn('`Model.fit_generator` is deprecated and '
30/30 [==============================] - 27s 896ms/step - loss: 0.6817 - accuracy: 0.5875 - val_loss: 0.7040 - val_accuracy: 0.5094
[I 2021-08-24 23:01:57,850] Trial 2 finished with value: 0.4091392159461975 and parameters: {'optimizer': 'adadelta', 'num_layers': 5, 'activation': 'elu', 'dropout_rate0': 0.12249325594505894, 'dropout_rate1': 0.28633497172161754, 'mid_units': 100.0, 'filters': 64, 'kernel_size': 3, 'strides': 1}. Best is trial 2 with value: 0.4091392159461975.
/shared-libs/python3.7/py/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
warnings.warn('`Model.fit_generator` is deprecated and '
30/30 [==============================] - 28s 877ms/step - loss: 13.3676 - accuracy: 0.5163 - val_loss: 0.8325 - val_accuracy: 0.5266
[I 2021-08-24 23:02:25,666] Trial 3 finished with value: 0.4824654459953308 and parameters: {'optimizer': 'rmsprop', 'num_layers': 5, 'activation': 'selu', 'dropout_rate0': 0.4904839374959998, 'dropout_rate1': 0.4629545259486775, 'mid_units': 100.0, 'filters': 64, 'kernel_size': 3, 'strides': 1}. Best is trial 2 with value: 0.4091392159461975.
/shared-libs/python3.7/py/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.
warnings.warn('`Model.fit_generator` is deprecated and '
30/30 [==============================] - 7s 213ms/step - loss: 0.7483 - accuracy: 0.5178 - val_loss: 0.6943 - val_accuracy: 0.5141
[I 2021-08-24 23:02:32,590] Trial 4 finished with value: 0.43358129262924194 and parameters: {'optimizer': 'sgd', 'num_layers': 1, 'activation': 'selu', 'dropout_rate0': 0.471587297595957, 'dropout_rate1': 0.29091208833873916, 'mid_units': 200.0, 'filters': 64, 'kernel_size': 3, 'strides': 2}. Best is trial 2 with value: 0.4091392159461975.
study.best_params
study.best_value
print("Number of finished trials: {}".format(len(study.trials)))
print("Best trial:")
trial = study.best_trial
print(" Value: {}".format(trial.value))
print(" Params: ")
for key, value in trial.params.items():
print(" {}: {}".format(key, value))