diff --git a/exercises/Jupyter notebook CVML.ipynb b/exercises/Jupyter notebook CVML.ipynb index 8ef5b8e..e6bea95 100644 --- a/exercises/Jupyter notebook CVML.ipynb +++ b/exercises/Jupyter notebook CVML.ipynb @@ -2374,7 +2374,9 @@ "en de rmsprop als optimizer.\n", "We willen de accuracy vergelijken door deze als metric mee te geven.\n", "\n", - "TODO optimizer en loss uitleggen\n", + "we gebruiken de rmsprop optimizer omdat deze goed te gebruiken is voor kleine\n", + "batch sizes.\n", + "TODO loss uitleggen\n", "\"\"\"\n", "model.compile(loss='categorical_crossentropy',\n", " optimizer='rmsprop',\n", @@ -2457,6 +2459,7 @@ } ], "source": [ + "#laad image in en haal de alpha channel eraf\n", "img2 = mpimg.imread('../data/imgs/training/sem/6.png')\n", "img3 = img2[:,:,:3]\n", "img3.shape\n", @@ -2470,6 +2473,7 @@ "metadata": {}, "outputs": [], "source": [ + "# maak image data generator objecten\n", "train = ImageDataGenerator()\n", "validation = ImageDataGenerator()" ] @@ -2490,6 +2494,14 @@ } ], "source": [ + "\"\"\"\n", + "maak de datasets aan en lees fotos in, we gebruiken een target size van \n", + "200 bij 200, met een batch size van 3 omdat we een vrij kleine dataset\n", + "hebben. We gebruiken binary als class mode omdat we maar 2 classes hebben\n", + "(lars en sem)\n", + "\"\"\"\n", + "\n", + "\n", "train_dataset = train.flow_from_directory('../data/imgs/training',\n", " target_size=(200,200),\n", " batch_size=3,\n", @@ -2519,6 +2531,7 @@ } ], "source": [ + "# laat de indices van de classes zien\n", "train_dataset.class_indices" ] }, @@ -2541,6 +2554,7 @@ } ], "source": [ + "# hier kunnen we zien hoeveel 'lars' classes zijn en hoeveel 'sem'\n", "train_dataset.classes" ] }, @@ -2551,23 +2565,60 @@ "metadata": {}, "outputs": [], "source": [ + "# maak een sequentieel model aan\n", "model = tf.keras.models.Sequential()\n", - "\n", + "\"\"\"\n", + "voeg een convolutional layer toe met 16 filters, en een filter size van 3x3,\n", + "en de relu activation function. Ook heeft het een input shape van 200x200\n", + "en 3 lagen omdat we 3 channels hebben.\n", + "Voeg daarna een maxpool laag toe met een stride van kernel van 2x2\n", + "\"\"\"\n", "model.add(tf.keras.layers.Conv2D(16,(3,3),activation='relu',\n", " input_shape=(200,200,3)))\n", "model.add(tf.keras.layers.MaxPool2D(2,2))\n", "\n", + "\"\"\"\n", + "voeg een convolutional layer toe met 32 filters, en een filter size van 3x3,\n", + "en de relu activation function. Ook heeft het een input shape van 200x200\n", + "en 3 lagen omdat we 3 channels hebben.\n", + "Voeg daarna een maxpool laag toe met een stride van kernel van 2x2\n", + "\"\"\"\n", "model.add(tf.keras.layers.Conv2D(32,(3,3),activation='relu'))\n", "model.add(tf.keras.layers.MaxPool2D(2,2))\n", "\n", + "\"\"\"\n", + "voeg een convolutional layer toe met 64 filters, en een filter size van 3x3,\n", + "en de relu activation function. Ook heeft het een input shape van 200x200\n", + "en 3 lagen omdat we 3 channels hebben.\n", + "Voeg daarna een maxpool laag toe met een stride van kernel van 2x2\n", + "\"\"\"\n", "model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu'))\n", "model.add(tf.keras.layers.MaxPool2D(2,2))\n", "\n", + "\"\"\"\n", + "voeg een convolutional layer toe met 128 filters, en een filter size van 3x3,\n", + "en de relu activation function. Ook heeft het een input shape van 200x200\n", + "en 3 lagen omdat we 3 channels hebben.\n", + "Voeg daarna een maxpool laag toe met een stride van kernel van 2x2\n", + "\"\"\"\n", "model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu'))\n", "model.add(tf.keras.layers.MaxPool2D(2,2))\n", "\n", + "\"\"\"\n", + "voeg een flatten laag toe die het resultaat flattent zodat alle lagen achter\n", + "elkaar gezet worden en ze gebruikt kunnen worden als input voor de volgende\n", + "dense laag.\n", + "\"\"\"\n", "model.add(tf.keras.layers.Flatten())\n", + "\n", + "\"\"\"\n", + "voeg een dense laag toe met 512 outputs die de relu activatie functie gebruikt.\n", + "Dit wordt gedaan omdat deze laag dan fully connected is en zodat de volgende\n", + "laag een prediction kan doen met de sigmoid activatiefunctie.\n", + "\"\"\"\n", "model.add(tf.keras.layers.Dense(512,activation='relu'))\n", + "\n", + "# voeg een dense layer toe met 1 output die als result gebruikt zal worden\n", "model.add(tf.keras.layers.Dense(1,activation='sigmoid'))" ] }, @@ -2578,6 +2629,15 @@ "metadata": {}, "outputs": [], "source": [ + "\"\"\"\n", + "compile het model met de binary crossentropy loss function. Dit doen we omdat\n", + "we maar 2 verschillende klassen hebben.\n", + "We gebruiken rmsprop als optimizer omdat we een kleine batch size hebben.\n", + "Deze optimizer balanceert de step size zodat deze niet te groot of te klein \n", + "worden.\n", + "We gebruiken de accuracy als metric omdat we daarop willen trainen.\n", + "\"\"\"\n", + "\n", "model.compile(loss='binary_crossentropy',\n", " optimizer='rmsprop',\n", " metrics=['accuracy'])" @@ -2803,6 +2863,9 @@ } ], "source": [ + "\n", + "#fit het model met de datasets. We gebruiken 70 epochs en 3 stappen per epoch.\n", + "\n", "model_ft = model.fit(train_dataset,\n", " steps_per_epoch=3,\n", " epochs=100,\n", @@ -3199,6 +3262,7 @@ } ], "source": [ + "# laat het netwerk een prediction doen op alle test fotos.\n", "dir_path = '../data/imgs/test/'\n", "\n", "for i in os.listdir(dir_path):\n", @@ -3221,28 +3285,13 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "530bae52", + "cell_type": "markdown", + "id": "069341a9", "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c820052b", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3a314192", - "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "### Conclusie\n", + "We hebben het CNN getest en " + ] } ], "metadata": {