Created
December 8, 2021 19:42
-
-
Save hsleonis/da7cfcdbb6ec5219c184a99c0c0c5b53 to your computer and use it in GitHub Desktop.
Inception v3 Neural Network
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Fine-tune InceptionV3 on a new set of classes | |
from tensorflow.keras.applications.inception_v3 import InceptionV3 | |
from tensorflow.keras.preprocessing import image | |
from tensorflow.keras.models import Model | |
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D | |
# create the base pre-trained model | |
base_model = InceptionV3(weights='imagenet', include_top=False) | |
# add a global spatial average pooling layer | |
x = base_model.output | |
x = GlobalAveragePooling2D()(x) | |
# let's add a fully-connected layer | |
x = Dense(1024, activation='relu')(x) | |
# and a logistic layer -- let's say we have 200 classes | |
predictions = Dense(200, activation='softmax')(x) | |
# this is the model we will train | |
model = Model(inputs=base_model.input, outputs=predictions) | |
# first: train only the top layers (which were randomly initialized) | |
# i.e. freeze all convolutional InceptionV3 layers | |
for layer in base_model.layers: | |
layer.trainable = False | |
# compile the model (should be done *after* setting layers to non-trainable) | |
model.compile(optimizer='rmsprop', loss='categorical_crossentropy') | |
# train the model on the new data for a few epochs | |
model.fit(...) | |
# at this point, the top layers are well trained and we can start fine-tuning | |
# convolutional layers from inception V3. We will freeze the bottom N layers | |
# and train the remaining top layers. | |
# let's visualize layer names and layer indices to see how many layers | |
# we should freeze: | |
for i, layer in enumerate(base_model.layers): | |
print(i, layer.name) | |
# we chose to train the top 2 inception blocks, i.e. we will freeze | |
# the first 249 layers and unfreeze the rest: | |
for layer in model.layers[:249]: | |
layer.trainable = False | |
for layer in model.layers[249:]: | |
layer.trainable = True | |
# we need to recompile the model for these modifications to take effect | |
# we use SGD with a low learning rate | |
from tensorflow.keras.optimizers import SGD | |
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy') | |
# we train our model again (this time fine-tuning the top 2 inception blocks | |
# alongside the top Dense layers | |
model.fit(...) | |
## Build InceptionV3 over a custom input tensor | |
from tensorflow.keras.applications.inception_v3 import InceptionV3 | |
from tensorflow.keras.layers import Input | |
# this could also be the output a different Keras model or layer | |
input_tensor = Input(shape=(224, 224, 3)) | |
model = InceptionV3(input_tensor=input_tensor, weights='imagenet', include_top=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment