[merge with main]

This commit is contained in:
Sem van der Hoeven
2021-06-09 16:16:58 +02:00

View File

@@ -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": {