Skip to content

Instantly share code, notes, and snippets.

@pmarcelino
Created September 22, 2018 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pmarcelino/87a420d9231e1376fe17c7601a02f749 to your computer and use it in GitHub Desktop.
Save pmarcelino/87a420d9231e1376fe17c7601a02f749 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Dropout"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this example, we will see the effect of dropout. To do so, we will quickly build a model for image classification using the dataset provided by the Kaggle competition '[Dogs vs. Cats]'().\n",
"\n",
"Since the purpose of this example is to see how to use dropout and what happens when we use it, we will not detail the implementation. Nonetheless, we can mention that we will build our model on top of a pretrained convolutional network. This sounds high profile, but using Keras it's quite simple. Also, we created a sub-sample of the data with 200 training pictures and 100 validation pictures (50 dogs pictures + 50 cats pictures). The model doesn't train so well with such a small dataset, but the computational cost is highly reduced.\n",
"\n",
"Our approach will be as follows:\n",
"1. Instantiate convolutional base.\n",
"1. Extract features using the convolutional base.\n",
"1. Use the features to train a dense connected classifier (without dropout).\n",
"1. Train a new dense connected classifier (with dropout).\n",
"\n",
"Learning curves will be plotted for both models. Comparing the learning curves it will be possible to evaluate dropout effect on overfitting."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. Instantiate convolutional base"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Instantiate convolutional base\n",
"from keras.applications import VGG16\n",
"\n",
"img_width, img_height = 150, 150\n",
"\n",
"conv_base = VGG16(weights='imagenet', \n",
" include_top=False,\n",
" input_shape=(img_width, img_height, 3))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"input_2 (InputLayer) (None, 150, 150, 3) 0 \n",
"_________________________________________________________________\n",
"block1_conv1 (Conv2D) (None, 150, 150, 64) 1792 \n",
"_________________________________________________________________\n",
"block1_conv2 (Conv2D) (None, 150, 150, 64) 36928 \n",
"_________________________________________________________________\n",
"block1_pool (MaxPooling2D) (None, 75, 75, 64) 0 \n",
"_________________________________________________________________\n",
"block2_conv1 (Conv2D) (None, 75, 75, 128) 73856 \n",
"_________________________________________________________________\n",
"block2_conv2 (Conv2D) (None, 75, 75, 128) 147584 \n",
"_________________________________________________________________\n",
"block2_pool (MaxPooling2D) (None, 37, 37, 128) 0 \n",
"_________________________________________________________________\n",
"block3_conv1 (Conv2D) (None, 37, 37, 256) 295168 \n",
"_________________________________________________________________\n",
"block3_conv2 (Conv2D) (None, 37, 37, 256) 590080 \n",
"_________________________________________________________________\n",
"block3_conv3 (Conv2D) (None, 37, 37, 256) 590080 \n",
"_________________________________________________________________\n",
"block3_pool (MaxPooling2D) (None, 18, 18, 256) 0 \n",
"_________________________________________________________________\n",
"block4_conv1 (Conv2D) (None, 18, 18, 512) 1180160 \n",
"_________________________________________________________________\n",
"block4_conv2 (Conv2D) (None, 18, 18, 512) 2359808 \n",
"_________________________________________________________________\n",
"block4_conv3 (Conv2D) (None, 18, 18, 512) 2359808 \n",
"_________________________________________________________________\n",
"block4_pool (MaxPooling2D) (None, 9, 9, 512) 0 \n",
"_________________________________________________________________\n",
"block5_conv1 (Conv2D) (None, 9, 9, 512) 2359808 \n",
"_________________________________________________________________\n",
"block5_conv2 (Conv2D) (None, 9, 9, 512) 2359808 \n",
"_________________________________________________________________\n",
"block5_conv3 (Conv2D) (None, 9, 9, 512) 2359808 \n",
"_________________________________________________________________\n",
"block5_pool (MaxPooling2D) (None, 4, 4, 512) 0 \n",
"=================================================================\n",
"Total params: 14,714,688\n",
"Trainable params: 14,714,688\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"# Check architecture\n",
"conv_base.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. Extract features"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 200 images belonging to 2 classes.\n",
"Found 100 images belonging to 2 classes.\n",
"Found 100 images belonging to 2 classes.\n"
]
}
],
"source": [
"# Extract features\n",
"import numpy as np\n",
"import os, shutil\n",
"from keras.preprocessing.image import ImageDataGenerator\n",
"\n",
"base_dir = '/Users/macbook/blog/data/dogs_cats'\n",
"train_dir = os.path.join(base_dir, 'train')\n",
"validation_dir = os.path.join(base_dir, 'validation')\n",
"test_dir = os.path.join(base_dir, 'test')\n",
"\n",
"datagen = ImageDataGenerator(rescale=1./255)\n",
"batch_size = 32\n",
"\n",
"def extract_features(directory, sample_count):\n",
" # Preprocess data\n",
" features = np.zeros(shape=(sample_count, 4, 4, 512)) # Must be equal to the output of the convolutional base\n",
" labels = np.zeros(shape=(sample_count))\n",
" generator = datagen.flow_from_directory(directory,\n",
" target_size=(img_width,img_height),\n",
" batch_size = batch_size,\n",
" class_mode='binary')\n",
" # Pass data through convolutional base\n",
" i = 0\n",
" for inputs_batch, labels_batch in generator:\n",
" features_batch = conv_base.predict(inputs_batch)\n",
" features[i * batch_size: (i + 1) * batch_size] = features_batch\n",
" labels[i * batch_size: (i + 1) * batch_size] = labels_batch\n",
" i += 1\n",
" if i * batch_size >= sample_count:\n",
" break\n",
" return features, labels\n",
" \n",
"train_features, train_labels = extract_features(train_dir, 200)\n",
"validation_features, validation_labels = extract_features(validation_dir, 100)\n",
"test_features, test_labels = extract_features(test_dir, 100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. Train classifier (without classifier)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 200 samples, validate on 100 samples\n",
"Epoch 1/50\n",
"200/200 [==============================] - 3s - loss: 1.7227 - acc: 0.5550 - val_loss: 1.0448 - val_acc: 0.5000\n",
"Epoch 2/50\n",
"200/200 [==============================] - 1s - loss: 0.5839 - acc: 0.7050 - val_loss: 0.6455 - val_acc: 0.6100\n",
"Epoch 3/50\n",
"200/200 [==============================] - 0s - loss: 0.4701 - acc: 0.7500 - val_loss: 0.5370 - val_acc: 0.6800\n",
"Epoch 4/50\n",
"200/200 [==============================] - 0s - loss: 0.3368 - acc: 0.8700 - val_loss: 0.4270 - val_acc: 0.8300\n",
"Epoch 5/50\n",
"200/200 [==============================] - 0s - loss: 0.2302 - acc: 0.9450 - val_loss: 0.3926 - val_acc: 0.8300\n",
"Epoch 6/50\n",
"200/200 [==============================] - 0s - loss: 0.1552 - acc: 0.9550 - val_loss: 0.3689 - val_acc: 0.8400\n",
"Epoch 7/50\n",
"200/200 [==============================] - 0s - loss: 0.1115 - acc: 0.9800 - val_loss: 0.3477 - val_acc: 0.8600\n",
"Epoch 8/50\n",
"200/200 [==============================] - 0s - loss: 0.0962 - acc: 0.9900 - val_loss: 0.3437 - val_acc: 0.8600\n",
"Epoch 9/50\n",
"200/200 [==============================] - 0s - loss: 0.0674 - acc: 1.0000 - val_loss: 0.3360 - val_acc: 0.8700\n",
"Epoch 10/50\n",
"200/200 [==============================] - 0s - loss: 0.0531 - acc: 1.0000 - val_loss: 0.3558 - val_acc: 0.8600\n",
"Epoch 11/50\n",
"200/200 [==============================] - 0s - loss: 0.0410 - acc: 1.0000 - val_loss: 0.3409 - val_acc: 0.8600\n",
"Epoch 12/50\n",
"200/200 [==============================] - 0s - loss: 0.0305 - acc: 1.0000 - val_loss: 0.3523 - val_acc: 0.8700\n",
"Epoch 13/50\n",
"200/200 [==============================] - 0s - loss: 0.0255 - acc: 1.0000 - val_loss: 0.3505 - val_acc: 0.8500\n",
"Epoch 14/50\n",
"200/200 [==============================] - 0s - loss: 0.0196 - acc: 1.0000 - val_loss: 0.3822 - val_acc: 0.8400\n",
"Epoch 15/50\n",
"200/200 [==============================] - 0s - loss: 0.0167 - acc: 1.0000 - val_loss: 0.3618 - val_acc: 0.8500\n",
"Epoch 16/50\n",
"200/200 [==============================] - 0s - loss: 0.0138 - acc: 1.0000 - val_loss: 0.3647 - val_acc: 0.8700\n",
"Epoch 17/50\n",
"200/200 [==============================] - 0s - loss: 0.0115 - acc: 1.0000 - val_loss: 0.3795 - val_acc: 0.8600\n",
"Epoch 18/50\n",
"200/200 [==============================] - 0s - loss: 0.0098 - acc: 1.0000 - val_loss: 0.3779 - val_acc: 0.8500\n",
"Epoch 19/50\n",
"200/200 [==============================] - 0s - loss: 0.0085 - acc: 1.0000 - val_loss: 0.3825 - val_acc: 0.85001\n",
"Epoch 20/50\n",
"200/200 [==============================] - 0s - loss: 0.0080 - acc: 1.0000 - val_loss: 0.3789 - val_acc: 0.8600\n",
"Epoch 21/50\n",
"200/200 [==============================] - 0s - loss: 0.0066 - acc: 1.0000 - val_loss: 0.4030 - val_acc: 0.8600\n",
"Epoch 22/50\n",
"200/200 [==============================] - 0s - loss: 0.0059 - acc: 1.0000 - val_loss: 0.4039 - val_acc: 0.8600\n",
"Epoch 23/50\n",
"200/200 [==============================] - 0s - loss: 0.0052 - acc: 1.0000 - val_loss: 0.3966 - val_acc: 0.8300\n",
"Epoch 24/50\n",
"200/200 [==============================] - 0s - loss: 0.0047 - acc: 1.0000 - val_loss: 0.3997 - val_acc: 0.8300\n",
"Epoch 25/50\n",
"200/200 [==============================] - 0s - loss: 0.0042 - acc: 1.0000 - val_loss: 0.4133 - val_acc: 0.8600\n",
"Epoch 26/50\n",
"200/200 [==============================] - 0s - loss: 0.0039 - acc: 1.0000 - val_loss: 0.4116 - val_acc: 0.8300\n",
"Epoch 27/50\n",
"200/200 [==============================] - 0s - loss: 0.0036 - acc: 1.0000 - val_loss: 0.4018 - val_acc: 0.8600\n",
"Epoch 28/50\n",
"200/200 [==============================] - 0s - loss: 0.0033 - acc: 1.0000 - val_loss: 0.4170 - val_acc: 0.8300\n",
"Epoch 29/50\n",
"200/200 [==============================] - 0s - loss: 0.0029 - acc: 1.0000 - val_loss: 0.4332 - val_acc: 0.8500\n",
"Epoch 30/50\n",
"200/200 [==============================] - 0s - loss: 0.0028 - acc: 1.0000 - val_loss: 0.4268 - val_acc: 0.8400\n",
"Epoch 31/50\n",
"200/200 [==============================] - 0s - loss: 0.0025 - acc: 1.0000 - val_loss: 0.4185 - val_acc: 0.8400\n",
"Epoch 32/50\n",
"200/200 [==============================] - 0s - loss: 0.0024 - acc: 1.0000 - val_loss: 0.4229 - val_acc: 0.8300\n",
"Epoch 33/50\n",
"200/200 [==============================] - ETA: 0s - loss: 0.0021 - acc: 1.000 - 0s - loss: 0.0022 - acc: 1.0000 - val_loss: 0.4385 - val_acc: 0.8600\n",
"Epoch 34/50\n",
"200/200 [==============================] - 0s - loss: 0.0021 - acc: 1.0000 - val_loss: 0.4374 - val_acc: 0.8400\n",
"Epoch 35/50\n",
"200/200 [==============================] - 0s - loss: 0.0019 - acc: 1.0000 - val_loss: 0.4347 - val_acc: 0.8300\n",
"Epoch 36/50\n",
"200/200 [==============================] - 0s - loss: 0.0018 - acc: 1.0000 - val_loss: 0.4400 - val_acc: 0.8400\n",
"Epoch 37/50\n",
"200/200 [==============================] - 0s - loss: 0.0017 - acc: 1.0000 - val_loss: 0.4400 - val_acc: 0.8300\n",
"Epoch 38/50\n",
"200/200 [==============================] - 0s - loss: 0.0016 - acc: 1.0000 - val_loss: 0.4401 - val_acc: 0.8300\n",
"Epoch 39/50\n",
"200/200 [==============================] - 0s - loss: 0.0015 - acc: 1.0000 - val_loss: 0.4441 - val_acc: 0.8300\n",
"Epoch 40/50\n",
"200/200 [==============================] - 0s - loss: 0.0014 - acc: 1.0000 - val_loss: 0.4494 - val_acc: 0.8400\n",
"Epoch 41/50\n",
"200/200 [==============================] - 0s - loss: 0.0014 - acc: 1.0000 - val_loss: 0.4566 - val_acc: 0.8500\n",
"Epoch 42/50\n",
"200/200 [==============================] - 0s - loss: 0.0013 - acc: 1.0000 - val_loss: 0.4507 - val_acc: 0.8400\n",
"Epoch 43/50\n",
"200/200 [==============================] - 0s - loss: 0.0012 - acc: 1.0000 - val_loss: 0.4514 - val_acc: 0.8300\n",
"Epoch 44/50\n",
"200/200 [==============================] - 0s - loss: 0.0012 - acc: 1.0000 - val_loss: 0.4598 - val_acc: 0.8400\n",
"Epoch 45/50\n",
"200/200 [==============================] - 0s - loss: 0.0011 - acc: 1.0000 - val_loss: 0.4554 - val_acc: 0.8400\n",
"Epoch 46/50\n",
"200/200 [==============================] - 0s - loss: 0.0011 - acc: 1.0000 - val_loss: 0.4562 - val_acc: 0.8300\n",
"Epoch 47/50\n",
"200/200 [==============================] - 0s - loss: 0.0010 - acc: 1.0000 - val_loss: 0.4622 - val_acc: 0.8400\n",
"Epoch 48/50\n",
"200/200 [==============================] - 0s - loss: 9.5319e-04 - acc: 1.0000 - val_loss: 0.4675 - val_acc: 0.8500\n",
"Epoch 49/50\n",
"200/200 [==============================] - 0s - loss: 9.1632e-04 - acc: 1.0000 - val_loss: 0.4702 - val_acc: 0.8500\n",
"Epoch 50/50\n",
"200/200 [==============================] - 0s - loss: 8.8087e-04 - acc: 1.0000 - val_loss: 0.4724 - val_acc: 0.8500\n"
]
}
],
"source": [
"# Train classifier\n",
"from keras import models\n",
"from keras import layers\n",
"from keras import optimizers\n",
"\n",
"epochs = 50\n",
"\n",
"model = models.Sequential()\n",
"model.add(layers.Flatten(input_shape=train_features.shape[1:])) # Check original shape to understand\n",
"model.add(layers.Dense(256, activation='relu'))\n",
"#model.add(layers.Dropout(0.9))\n",
"model.add(layers.Dense(1, activation='sigmoid'))\n",
"\n",
"model.compile(optimizer=optimizers.Adam(),\n",
" loss='binary_crossentropy',\n",
" metrics=['acc'])\n",
"\n",
"history = model.fit(train_features,\n",
" train_labels,\n",
" epochs=epochs, \n",
" batch_size=batch_size,\n",
" validation_data=(validation_features, validation_labels))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x125231390>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n1FPZt29fi3/bRNSPX0Tq+cY3IN0vlxozBqKYmVDfvn0ZP348Tz/9NBdddBGLFy/mkksuwczo0qUL\nS5Ys4eijj2bnzp2cfvrpXHjhhUnfPXvXXXfRrVs3XnnlFdauXVtvaOV58+bRt29fampqOOecc1i7\ndi3XXHMNt912G8uWLaNfv3719rVq1Sruu+8+VqxYgbtz2mmnMXHiRPr06cPGjRt56KGH+Pd//3cu\nueQSHn300UbH2L/88su58847mThxIjfeeCM//OEPuf3227nlllt44403OOqoo2qbl2699Vbmz5/P\nhAkT2L9/P126dGnGr9001fhFpF2Ib+6Jb+Zxd6677jpGjRrFueeey7Zt23j33XeT7mf58uW1AXjU\nqFGMGjWqdt3DDz/M2LFjOfXUU1m/fn2Tg7A9//zzXHzxxXTv3p0ePXrw2c9+lueeew6AoUOHMmbM\nGKDx4Z8hvCNgz549TJw4EYAvfOELLF++vDaPs2bNYuHChbVPCU+YMIFrr72WO+64gz179qT96WHV\n+EWknsZq5pl00UUX8c1vfpPVq1dz4MABxo0bB8CiRYuorKxk1apVFBUVUVpamnA45qa88cYb3Hrr\nrbz00kv06dOHK664okX7iYkN6wxhaOemmnqS+cMf/sDy5ct54oknmDdvHuvWrWPu3Ll85jOf4amn\nnmLChAksXbqUk046qcV5bUg1fhFpF3r06MHkyZP54he/WO+m7t69e/nYxz5GUVERy5YtY2uiF2zH\n+eQnP8mDDz4IwMsvv8zatWuBMKxz9+7d6dWrF++++y5PP/107TY9e/ZM2I5+1lln8fvf/54DBw7w\n/vvvs2TJEs4666xml61Xr1706dOn9mrht7/9LRMnTuTw4cO89dZbTJ48mZ/+9Kfs3buX/fv38/rr\nr3PKKafw3e9+l49//OO8+uqrzT5mY1TjF5F2Y+bMmVx88cX1evjMmjWLCy64gFNOOYXy8vIma75z\n5szhyiuvZMSIEYwYMaL2ymH06NGceuqpnHTSSRx33HH1hnWePXs2U6dOZdCgQSxbtqx2+dixY7ni\niisYP348AFdddRWnnnpqo806yTzwwANcffXVHDhwgGHDhnHfffdRU1PDZZddxt69e3F3rrnmGnr3\n7s33v/99li1bRqdOnRg5cmTtG8XSpclhmc1sAXA+sMPdT06wfhLwGPBGtOh37n5ztG4q8EugALjX\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1251566d8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot results\n",
"import matplotlib.pyplot as plt\n",
"\n",
"acc = history.history['acc']\n",
"val_acc = history.history['val_acc']\n",
"loss = history.history['loss']\n",
"val_loss = history.history['val_loss']\n",
"\n",
"epochs = range(1, len(acc)+1)\n",
"\n",
"plt.plot(epochs, acc, 'bo', label='Training accuracy')\n",
"plt.plot(epochs, val_acc, 'b', label='Validation accuracy')\n",
"plt.title('Training and validation accuracy')\n",
"plt.legend()\n",
"\n",
"plt.figure()\n",
"\n",
"plt.plot(epochs, loss, 'bo', label='Training loss')\n",
"plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
"plt.title('Training and validation loss')\n",
"plt.legend()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* The gap between training accuracy and validation accuracy shows that the model is overfitting.\n",
"* Training accuracy approaches 1 and training loss approaches 0. Thus, the model perfectly fits the training set, which is a sign of overfitting."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. Train classifier (with dropout)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 200 samples, validate on 100 samples\n",
"Epoch 1/50\n",
"200/200 [==============================] - 1s - loss: 1.9910 - acc: 0.5450 - val_loss: 0.6032 - val_acc: 0.6100\n",
"Epoch 2/50\n",
"200/200 [==============================] - 0s - loss: 1.3816 - acc: 0.5850 - val_loss: 0.6119 - val_acc: 0.6800\n",
"Epoch 3/50\n",
"200/200 [==============================] - 0s - loss: 0.8552 - acc: 0.6450 - val_loss: 0.4574 - val_acc: 0.7900\n",
"Epoch 4/50\n",
"200/200 [==============================] - 0s - loss: 0.8235 - acc: 0.6150 - val_loss: 0.4385 - val_acc: 0.8400\n",
"Epoch 5/50\n",
"200/200 [==============================] - 0s - loss: 0.6635 - acc: 0.6650 - val_loss: 0.4436 - val_acc: 0.8500\n",
"Epoch 6/50\n",
"200/200 [==============================] - 0s - loss: 0.5849 - acc: 0.7100 - val_loss: 0.4547 - val_acc: 0.8500\n",
"Epoch 7/50\n",
"200/200 [==============================] - 0s - loss: 0.5022 - acc: 0.7300 - val_loss: 0.4655 - val_acc: 0.7600\n",
"Epoch 8/50\n",
"200/200 [==============================] - 0s - loss: 0.4317 - acc: 0.7850 - val_loss: 0.4196 - val_acc: 0.8500\n",
"Epoch 9/50\n",
"200/200 [==============================] - 0s - loss: 0.4326 - acc: 0.7700 - val_loss: 0.4062 - val_acc: 0.8400\n",
"Epoch 10/50\n",
"200/200 [==============================] - 0s - loss: 0.4476 - acc: 0.7600 - val_loss: 0.4118 - val_acc: 0.8000\n",
"Epoch 11/50\n",
"200/200 [==============================] - 0s - loss: 0.3924 - acc: 0.8000 - val_loss: 0.3874 - val_acc: 0.8300\n",
"Epoch 12/50\n",
"200/200 [==============================] - 0s - loss: 0.3261 - acc: 0.8350 - val_loss: 0.3702 - val_acc: 0.8400\n",
"Epoch 13/50\n",
"200/200 [==============================] - 0s - loss: 0.3611 - acc: 0.8450 - val_loss: 0.3588 - val_acc: 0.8500\n",
"Epoch 14/50\n",
"200/200 [==============================] - 0s - loss: 0.3750 - acc: 0.8300 - val_loss: 0.3606 - val_acc: 0.8300\n",
"Epoch 15/50\n",
"200/200 [==============================] - 0s - loss: 0.3716 - acc: 0.8300 - val_loss: 0.3568 - val_acc: 0.8600\n",
"Epoch 16/50\n",
"200/200 [==============================] - 0s - loss: 0.3459 - acc: 0.8150 - val_loss: 0.3559 - val_acc: 0.8500\n",
"Epoch 17/50\n",
"200/200 [==============================] - 0s - loss: 0.3528 - acc: 0.8100 - val_loss: 0.3552 - val_acc: 0.8400\n",
"Epoch 18/50\n",
"200/200 [==============================] - 0s - loss: 0.3313 - acc: 0.8500 - val_loss: 0.3491 - val_acc: 0.8300\n",
"Epoch 19/50\n",
"200/200 [==============================] - 0s - loss: 0.3534 - acc: 0.8500 - val_loss: 0.3525 - val_acc: 0.8600\n",
"Epoch 20/50\n",
"200/200 [==============================] - 0s - loss: 0.3707 - acc: 0.7900 - val_loss: 0.3540 - val_acc: 0.8400\n",
"Epoch 21/50\n",
"200/200 [==============================] - 0s - loss: 0.3773 - acc: 0.8050 - val_loss: 0.3600 - val_acc: 0.8400\n",
"Epoch 22/50\n",
"200/200 [==============================] - 0s - loss: 0.4296 - acc: 0.7750 - val_loss: 0.3763 - val_acc: 0.8400\n",
"Epoch 23/50\n",
"200/200 [==============================] - 0s - loss: 0.3124 - acc: 0.8650 - val_loss: 0.3608 - val_acc: 0.8200\n",
"Epoch 24/50\n",
"200/200 [==============================] - 0s - loss: 0.3534 - acc: 0.8100 - val_loss: 0.3559 - val_acc: 0.8600\n",
"Epoch 25/50\n",
"200/200 [==============================] - 0s - loss: 0.3249 - acc: 0.8600 - val_loss: 0.3514 - val_acc: 0.8400\n",
"Epoch 26/50\n",
"200/200 [==============================] - 0s - loss: 0.2801 - acc: 0.8400 - val_loss: 0.3481 - val_acc: 0.8200\n",
"Epoch 27/50\n",
"200/200 [==============================] - 0s - loss: 0.2515 - acc: 0.9050 - val_loss: 0.3483 - val_acc: 0.8700\n",
"Epoch 28/50\n",
"200/200 [==============================] - 0s - loss: 0.2776 - acc: 0.8800 - val_loss: 0.3469 - val_acc: 0.8600\n",
"Epoch 29/50\n",
"200/200 [==============================] - 0s - loss: 0.2968 - acc: 0.8600 - val_loss: 0.3474 - val_acc: 0.8600\n",
"Epoch 30/50\n",
"200/200 [==============================] - 0s - loss: 0.2658 - acc: 0.8500 - val_loss: 0.3447 - val_acc: 0.8600\n",
"Epoch 31/50\n",
"200/200 [==============================] - 0s - loss: 0.2856 - acc: 0.8900 - val_loss: 0.3476 - val_acc: 0.8300\n",
"Epoch 32/50\n",
"200/200 [==============================] - 0s - loss: 0.2078 - acc: 0.9150 - val_loss: 0.3441 - val_acc: 0.8400\n",
"Epoch 33/50\n",
"200/200 [==============================] - 0s - loss: 0.2297 - acc: 0.8750 - val_loss: 0.3448 - val_acc: 0.8500\n",
"Epoch 34/50\n",
"200/200 [==============================] - 0s - loss: 0.2250 - acc: 0.8950 - val_loss: 0.3435 - val_acc: 0.8700\n",
"Epoch 35/50\n",
"200/200 [==============================] - 0s - loss: 0.2988 - acc: 0.8500 - val_loss: 0.3333 - val_acc: 0.87000.83\n",
"Epoch 36/50\n",
"200/200 [==============================] - 0s - loss: 0.2295 - acc: 0.8750 - val_loss: 0.3283 - val_acc: 0.8400\n",
"Epoch 37/50\n",
"200/200 [==============================] - 0s - loss: 0.2523 - acc: 0.8750 - val_loss: 0.3328 - val_acc: 0.8200\n",
"Epoch 38/50\n",
"200/200 [==============================] - 0s - loss: 0.2565 - acc: 0.8700 - val_loss: 0.3385 - val_acc: 0.8600\n",
"Epoch 39/50\n",
"200/200 [==============================] - 0s - loss: 0.2183 - acc: 0.8950 - val_loss: 0.3411 - val_acc: 0.8500\n",
"Epoch 40/50\n",
"200/200 [==============================] - 0s - loss: 0.2256 - acc: 0.8850 - val_loss: 0.3380 - val_acc: 0.8500\n",
"Epoch 41/50\n",
"200/200 [==============================] - 0s - loss: 0.2041 - acc: 0.8950 - val_loss: 0.3354 - val_acc: 0.8600\n",
"Epoch 42/50\n",
"200/200 [==============================] - 0s - loss: 0.2314 - acc: 0.9050 - val_loss: 0.3426 - val_acc: 0.8300\n",
"Epoch 43/50\n",
"200/200 [==============================] - 0s - loss: 0.2014 - acc: 0.9150 - val_loss: 0.3602 - val_acc: 0.8300\n",
"Epoch 44/50\n",
"200/200 [==============================] - 0s - loss: 0.2088 - acc: 0.8850 - val_loss: 0.3692 - val_acc: 0.8500\n",
"Epoch 45/50\n",
"200/200 [==============================] - 0s - loss: 0.1827 - acc: 0.9100 - val_loss: 0.3813 - val_acc: 0.8600\n",
"Epoch 46/50\n",
"200/200 [==============================] - 0s - loss: 0.1735 - acc: 0.9200 - val_loss: 0.4058 - val_acc: 0.8500\n",
"Epoch 47/50\n",
"200/200 [==============================] - 0s - loss: 0.2224 - acc: 0.9050 - val_loss: 0.3814 - val_acc: 0.8600\n",
"Epoch 48/50\n",
"200/200 [==============================] - 0s - loss: 0.1905 - acc: 0.9200 - val_loss: 0.3933 - val_acc: 0.8500\n",
"Epoch 49/50\n",
"200/200 [==============================] - 0s - loss: 0.2262 - acc: 0.8800 - val_loss: 0.3682 - val_acc: 0.8700\n",
"Epoch 50/50\n",
"200/200 [==============================] - 0s - loss: 0.2171 - acc: 0.8950 - val_loss: 0.3631 - val_acc: 0.8300\n"
]
}
],
"source": [
"# Train classifier\n",
"from keras import models\n",
"from keras import layers\n",
"from keras import optimizers\n",
"\n",
"epochs = 50\n",
"\n",
"model = models.Sequential()\n",
"model.add(layers.Flatten(input_shape=train_features.shape[1:])) # Check original shape to understand\n",
"model.add(layers.Dense(256, activation='relu'))\n",
"model.add(layers.Dropout(0.9))\n",
"model.add(layers.Dense(1, activation='sigmoid'))\n",
"\n",
"model.compile(optimizer=optimizers.Adam(),\n",
" loss='binary_crossentropy',\n",
" metrics=['acc'])\n",
"\n",
"history = model.fit(train_features,\n",
" train_labels,\n",
" epochs=epochs, \n",
" batch_size=batch_size,\n",
" validation_data=(validation_features, validation_labels))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x12dd52160>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x12dd48400>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot results\n",
"import matplotlib.pyplot as plt\n",
"\n",
"acc = history.history['acc']\n",
"val_acc = history.history['val_acc']\n",
"loss = history.history['loss']\n",
"val_loss = history.history['val_loss']\n",
"\n",
"epochs = range(1, len(acc)+1)\n",
"\n",
"plt.plot(epochs, acc, 'bo', label='Training accuracy')\n",
"plt.plot(epochs, val_acc, 'b', label='Validation accuracy')\n",
"plt.title('Training and validation accuracy')\n",
"plt.legend()\n",
"\n",
"plt.figure()\n",
"\n",
"plt.plot(epochs, loss, 'bo', label='Training loss')\n",
"plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
"plt.title('Training and validation loss')\n",
"plt.legend()\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Although the model is not totally stable, we can see that the gap between training and validation accuracy is smaller. Actually, the difference between these two curves is small enough to consider that the model is not overfitting anymore.\n",
"* Training and validation loss confirm that the model doesn't overfit. Both loss values are similar.\n",
"* Also, the model does not predict the training set perfectly anymore. This is also a sign that the model is not overfitting and it generalizes better."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment