Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #4 from restbai/workshop
Browse files Browse the repository at this point in the history
Tweak notebook for the workshop for better experimentation
  • Loading branch information
anamestre authored Apr 29, 2022
2 parents dae22e4 + 3b1eac6 commit 511e659
Showing 1 changed file with 51 additions and 39 deletions.
90 changes: 51 additions & 39 deletions workshop/places365_train.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@
},
{
"cell_type": "code",
"source": [
"!gdown 1y-LdQ_4dbOip6sBgZ-Ub1FI6Hh5kl3h1"
],
"execution_count": null,
"metadata": {
"id": "x9DwxHaAj3V4"
},
"execution_count": null,
"outputs": []
"outputs": [],
"source": [
"# !gdown 1Hkk2HNvnh2cZqIcOGuxpxUkDSDh-QW86\n",
"!gdown 1y-LdQ_4dbOip6sBgZ-Ub1FI6Hh5kl3h1"
]
},
{
"cell_type": "code",
Expand Down Expand Up @@ -103,14 +104,14 @@
},
{
"cell_type": "markdown",
"metadata": {
"id": "YlN_UCYM4oH9"
},
"source": [
"The following code loads images and builds a preprocessing pipeline within Datasets (Tensorflow-specific structures providing input data).\n",
"\n",
"Documentation: https://www.tensorflow.org/guide/data"
],
"metadata": {
"id": "YlN_UCYM4oH9"
}
]
},
{
"cell_type": "code",
Expand Down Expand Up @@ -169,16 +170,16 @@
},
{
"cell_type": "markdown",
"metadata": {
"id": "ws_I8t8f5QeB"
},
"source": [
"This code builds a model that will be trained in the following cells. The field `base_model` is initialized with a pre-defined architecture loaded from Keras.\n",
"\n",
"You can find the list of possible architectures at https://keras.io/api/applications/\n",
"\n",
"On top of `base_model`, we add a fully-connected layer with 3 neurons, and a softmax activation function. This settings allows scaling the output in a way that it can be interpreted as a probability distribution where all of the probabilities sum up to 1.\n"
],
"metadata": {
"id": "ws_I8t8f5QeB"
}
]
},
{
"cell_type": "code",
Expand All @@ -191,12 +192,13 @@
"class Places365Model(tf.keras.Model):\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.base_model = tf.keras.applications.MobileNet(\n",
" self.base_model = tf.keras.applications.MobileNetV3Small(\n",
" input_shape=(224, 224, 3),\n",
" include_top=False,\n",
" weights=None,\n",
" classes=3,\n",
" pooling=\"avg\"\n",
" pooling=\"avg\",\n",
" minimalistic=True\n",
" )\n",
" self.fc = tf.keras.layers.Dense(3, activation='softmax')\n",
"\n",
Expand All @@ -206,7 +208,15 @@
"\n",
"\n",
"model = Places365Model()\n",
"model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')"
"\n",
"# updating momentum of the BatchNorm layers\n",
"for layer in model.base_model.layers:\n",
" if isinstance(layer, tf.keras.layers.BatchNormalization):\n",
" layer.momentum = 0.5\n",
"\n",
"optimizer = tf.keras.optimizers.Adam(learning_rate=0.005)\n",
"\n",
"model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics='accuracy')"
]
},
{
Expand All @@ -228,7 +238,7 @@
"source": [
"history = model.fit(\n",
" train_ds,\n",
" epochs=10)"
" epochs=32)"
]
},
{
Expand All @@ -242,12 +252,12 @@
},
{
"cell_type": "markdown",
"source": [
"Let's see the results of our training!"
],
"metadata": {
"id": "Lhdx7LkU_vxx"
}
},
"source": [
"Let's see the results of our training!"
]
},
{
"cell_type": "code",
Expand All @@ -272,16 +282,16 @@
},
{
"cell_type": "markdown",
"metadata": {
"id": "KNtWihJPAfes"
},
"source": [
"Confusion matrix is a tool that helps us to interpret the results and draw conclusions about the characteristics of the model.\n",
"\n",
"It is a table presenting the number of correct predictions, and showing us how many mistakes it made, specifically focusing on the confusions between classes.\n",
"\n",
"A row represents the true class, and column represents a predicted one."
],
"metadata": {
"id": "KNtWihJPAfes"
}
]
},
{
"cell_type": "code",
Expand All @@ -291,8 +301,10 @@
},
"outputs": [],
"source": [
"results = model.predict(val_ds)\n",
"ds = list(val_ds.unbatch().as_numpy_iterator())\n",
"ds_for_prediction = train_ds\n",
"\n",
"results = model.predict(ds_for_prediction)\n",
"ds = list(ds_for_prediction.unbatch().as_numpy_iterator())\n",
"\n",
"y_true = [class_names[entry[1]] for entry in ds]\n",
"y_pred = [class_names[np.argmax(result)] for result in results]\n",
Expand All @@ -317,8 +329,11 @@
},
{
"cell_type": "markdown",
"metadata": {
"id": "VjeQNCVsBScm"
},
"source": [
"Let's see the classifiation report!\n",
"Let's see the classification report!\n",
"\n",
"We can observe the following metrics:\n",
"- **precision** - this a frequentist probability that the predicted class is true. It is calculated with the equation TP / (TP + FP).\n",
Expand All @@ -339,10 +354,7 @@
"The following article explains all the above quite well:\n",
"\n",
"https://medium.com/analytics-vidhya/confusion-matrix-accuracy-precision-recall-f1-score-ade299cf63cd"
],
"metadata": {
"id": "VjeQNCVsBScm"
}
]
},
{
"cell_type": "code",
Expand All @@ -366,12 +378,12 @@
},
{
"cell_type": "markdown",
"source": [
"Let's plot the misclassified images and see how our model confused their classes!"
],
"metadata": {
"id": "iU16Qm19Goai"
}
},
"source": [
"Let's plot the misclassified images and see how our model confused their classes!"
]
},
{
"cell_type": "code",
Expand Down Expand Up @@ -403,9 +415,9 @@
"metadata": {
"accelerator": "GPU",
"colab": {
"name": "places365 - train.ipynb",
"provenance": [],
"collapsed_sections": []
"collapsed_sections": [],
"name": "places365_train.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
Expand Down

0 comments on commit 511e659

Please sign in to comment.