Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import math\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"from keras.engine import Model\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Dropout, Flatten\n",
"from keras.layers import Conv2D, MaxPooling2D\n",
"from keras.optimizers import Adam, SGD\n",
"from keras.callbacks import ModelCheckpoint\n",
"from keras.preprocessing.image import load_img, img_to_array, array_to_img, ImageDataGenerator\n",
"from keras_vggface.vggface import VGGFace\n",
"from PIL import Image"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"DATA_DIR = '../data/preprocessed/'\n",
"BATCH_SIZE = 16\n",
"GRAYSCALE = False\n",
"INPUT_DIM = (128, 128, 1 if GRAYSCALE else 3)\n",
"AUGMENTATION_FACTOR = 2\n",
"EPOCHS = 100\n",
"RANDOM_SEED = 123"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 987 images belonging to 4 classes.\n",
"Found 100 images belonging to 4 classes.\n",
"Found 239 images belonging to 4 classes.\n"
]
}
],
"source": [
"train_datagen = ImageDataGenerator(\n",
" rotation_range=10,\n",
" rescale=1./255,\n",
" shear_range=0.2,\n",
" zoom_range=0.2,\n",
" horizontal_flip=True)\n",
"\n",
"datagen = ImageDataGenerator(rescale=1./255)\n",
"\n",
"generator_base_params = {\n",
" 'target_size': INPUT_DIM[:2],\n",
" 'class_mode': 'categorical',\n",
" 'color_mode': 'grayscale' if GRAYSCALE else 'rgb',\n",
" 'batch_size': BATCH_SIZE,\n",
" 'seed': RANDOM_SEED\n",
"}\n",
"\n",
"train_generator = train_datagen.flow_from_directory(DATA_DIR + 'train', shuffle=False, **generator_base_params) \n",
"validation_generator = datagen.flow_from_directory(DATA_DIR + 'validation', shuffle=False, **generator_base_params)\n",
"test_generator = datagen.flow_from_directory(DATA_DIR + 'test', shuffle=False, **generator_base_params)\n",
"\n",
"n_train = train_generator.n\n",
"n_validation = validation_generator.n\n",
"n_test = test_generator.n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"gens = [train_generator, validation_generator, test_generator]\n",
"\n",
"for g in gens:\n",
" g.batch_size = 1\n",
"\n",
"train_labels = np.array([train_generator.next()[1] for i in range(n_train * AUGMENTATION_FACTOR)]).reshape(-1, 4)\n",
"validation_labels = np.array([validation_generator.next()[1] for i in range(n_validation)]).reshape(-1, 4)\n",
"test_labels = np.array([test_generator.next()[1] for i in range(n_test)]).reshape(-1, 4)\n",
"\n",
"for g in gens:\n",
" g.reset()\n",
" g.batch_size = BATCH_SIZE"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def predict_bottleneck():\n",
" model = VGGFace(include_top=False, input_shape=INPUT_DIM, pooling='max')\n",
" features_train = model.predict_generator(train_generator, math.ceil(train_labels.shape[0] / BATCH_SIZE) + 3, verbose=1)\n",
" features_validation = model.predict_generator(validation_generator, math.ceil(n_validation / BATCH_SIZE) + 1, verbose=1)\n",
" features_test = model.predict_generator(test_generator, math.ceil(n_test / BATCH_SIZE) + 1, verbose=1)\n",
" return (features_train[:train_labels.shape[0]], features_validation[:n_validation], features_test[:n_test])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"127/127 [==============================] - 129s 1s/step\n",
"8/8 [==============================] - 7s 913ms/step\n",
"16/16 [==============================] - 16s 1s/step\n"
]
}
],
"source": [
"features = predict_bottleneck()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# shuffle\n",
"train_data, _, train_labels, _ = train_test_split(features[0], train_labels, test_size=0.0)\n",
"validation_data, _, validation_labels, _ = train_test_split(features[1], validation_labels, test_size=0.0)\n",
"test_data, _, test_labels, _ = train_test_split(features[2], test_labels, test_size=0.0)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def get_model():\n",
" model = Sequential()\n",
" model.add(Dense(128, activation='relu'))\n",
" model.add(Dropout(0.5))\n",
" model.add(Dense(4, activation='softmax'))\n",
" \n",
" model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])\n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"model = get_model()\n",
"callbacks = [ModelCheckpoint('top_model_weights.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 1974 samples, validate on 100 samples\n",
"Epoch 1/100\n",
"1974/1974 [==============================] - 0s 176us/step - loss: 1.3573 - acc: 0.3100 - val_loss: 1.3579 - val_acc: 0.3400\n",
"\n",
"Epoch 00001: val_acc improved from -inf to 0.34000, saving model to top_model_weights.hdf5\n",
"Epoch 2/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 1.2635 - acc: 0.4129 - val_loss: 1.3301 - val_acc: 0.3300\n",
"\n",
"Epoch 00002: val_acc did not improve from 0.34000\n",
"Epoch 3/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 1.2212 - acc: 0.4453 - val_loss: 1.3166 - val_acc: 0.3700\n",
"\n",
"Epoch 00003: val_acc improved from 0.34000 to 0.37000, saving model to top_model_weights.hdf5\n",
"Epoch 4/100\n",
"1974/1974 [==============================] - 0s 62us/step - loss: 1.1903 - acc: 0.4645 - val_loss: 1.3309 - val_acc: 0.3700\n",
"\n",
"Epoch 00004: val_acc did not improve from 0.37000\n",
"Epoch 5/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 1.1618 - acc: 0.4737 - val_loss: 1.3214 - val_acc: 0.4200\n",
"\n",
"Epoch 00005: val_acc improved from 0.37000 to 0.42000, saving model to top_model_weights.hdf5\n",
"Epoch 6/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 1.1304 - acc: 0.5046 - val_loss: 1.3132 - val_acc: 0.4000\n",
"\n",
"Epoch 00006: val_acc did not improve from 0.42000\n",
"Epoch 7/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 1.1046 - acc: 0.5198 - val_loss: 1.3173 - val_acc: 0.3800\n",
"\n",
"Epoch 00007: val_acc did not improve from 0.42000\n",
"Epoch 8/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 1.0770 - acc: 0.5319 - val_loss: 1.3162 - val_acc: 0.3900\n",
"\n",
"Epoch 00008: val_acc did not improve from 0.42000\n",
"Epoch 9/100\n",
"1974/1974 [==============================] - 0s 77us/step - loss: 1.0470 - acc: 0.5446 - val_loss: 1.3030 - val_acc: 0.3500\n",
"\n",
"Epoch 00009: val_acc did not improve from 0.42000\n",
"Epoch 10/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 1.0415 - acc: 0.5588 - val_loss: 1.3039 - val_acc: 0.3700\n",
"\n",
"Epoch 00010: val_acc did not improve from 0.42000\n",
"Epoch 11/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 1.0019 - acc: 0.5745 - val_loss: 1.3223 - val_acc: 0.3500\n",
"\n",
"Epoch 00011: val_acc did not improve from 0.42000\n",
"Epoch 12/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.9949 - acc: 0.5780 - val_loss: 1.3371 - val_acc: 0.3500\n",
"\n",
"Epoch 00012: val_acc did not improve from 0.42000\n",
"Epoch 13/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.9761 - acc: 0.5887 - val_loss: 1.3228 - val_acc: 0.3600\n",
"\n",
"Epoch 00013: val_acc did not improve from 0.42000\n",
"Epoch 14/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.9561 - acc: 0.6135 - val_loss: 1.3177 - val_acc: 0.3600\n",
"\n",
"Epoch 00014: val_acc did not improve from 0.42000\n",
"Epoch 15/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.9282 - acc: 0.6170 - val_loss: 1.3364 - val_acc: 0.3800\n",
"\n",
"Epoch 00015: val_acc did not improve from 0.42000\n",
"Epoch 16/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.9261 - acc: 0.6084 - val_loss: 1.3710 - val_acc: 0.3600\n",
"\n",
"Epoch 00016: val_acc did not improve from 0.42000\n",
"Epoch 17/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.9114 - acc: 0.6206 - val_loss: 1.3249 - val_acc: 0.3600\n",
"\n",
"Epoch 00017: val_acc did not improve from 0.42000\n",
"Epoch 18/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.8678 - acc: 0.6454 - val_loss: 1.3306 - val_acc: 0.4100\n",
"\n",
"Epoch 00018: val_acc did not improve from 0.42000\n",
"Epoch 19/100\n",
"1974/1974 [==============================] - 0s 69us/step - loss: 0.8644 - acc: 0.6489 - val_loss: 1.3509 - val_acc: 0.3700\n",
"\n",
"Epoch 00019: val_acc did not improve from 0.42000\n",
"Epoch 20/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.8501 - acc: 0.6570 - val_loss: 1.3231 - val_acc: 0.3900\n",
"\n",
"Epoch 00020: val_acc did not improve from 0.42000\n",
"Epoch 21/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.8103 - acc: 0.6697 - val_loss: 1.4055 - val_acc: 0.3400\n",
"\n",
"Epoch 00021: val_acc did not improve from 0.42000\n",
"Epoch 22/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.8052 - acc: 0.6793 - val_loss: 1.3783 - val_acc: 0.3300\n",
"\n",
"Epoch 00022: val_acc did not improve from 0.42000\n",
"Epoch 23/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.7816 - acc: 0.6991 - val_loss: 1.3913 - val_acc: 0.3600\n",
"\n",
"Epoch 00023: val_acc did not improve from 0.42000\n",
"Epoch 24/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.7640 - acc: 0.7016 - val_loss: 1.3474 - val_acc: 0.3400\n",
"\n",
"Epoch 00024: val_acc did not improve from 0.42000\n",
"Epoch 25/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.7372 - acc: 0.7123 - val_loss: 1.3802 - val_acc: 0.3900\n",
"\n",
"Epoch 00025: val_acc did not improve from 0.42000\n",
"Epoch 26/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.7162 - acc: 0.7315 - val_loss: 1.3764 - val_acc: 0.3700\n",
"\n",
"Epoch 00026: val_acc did not improve from 0.42000\n",
"Epoch 27/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.7000 - acc: 0.7229 - val_loss: 1.3872 - val_acc: 0.3600\n",
"\n",
"Epoch 00027: val_acc did not improve from 0.42000\n",
"Epoch 28/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.6887 - acc: 0.7320 - val_loss: 1.4383 - val_acc: 0.4200\n",
"\n",
"Epoch 00028: val_acc did not improve from 0.42000\n",
"Epoch 29/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 0.6814 - acc: 0.7386 - val_loss: 1.3999 - val_acc: 0.3800\n",
"\n",
"Epoch 00029: val_acc did not improve from 0.42000\n",
"Epoch 30/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.6524 - acc: 0.7543 - val_loss: 1.4189 - val_acc: 0.4100\n",
"\n",
"Epoch 00030: val_acc did not improve from 0.42000\n",
"Epoch 31/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.6418 - acc: 0.7573 - val_loss: 1.4361 - val_acc: 0.3800\n",
"\n",
"Epoch 00031: val_acc did not improve from 0.42000\n",
"Epoch 32/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 0.6234 - acc: 0.7639 - val_loss: 1.4876 - val_acc: 0.3400\n",
"\n",
"Epoch 00032: val_acc did not improve from 0.42000\n",
"Epoch 33/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.5948 - acc: 0.7842 - val_loss: 1.4513 - val_acc: 0.4000\n",
"\n",
"Epoch 00033: val_acc did not improve from 0.42000\n",
"Epoch 34/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.5949 - acc: 0.7862 - val_loss: 1.4402 - val_acc: 0.4000\n",
"\n",
"Epoch 00034: val_acc did not improve from 0.42000\n",
"Epoch 35/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.5646 - acc: 0.8019 - val_loss: 1.4785 - val_acc: 0.4100\n",
"\n",
"Epoch 00035: val_acc did not improve from 0.42000\n",
"Epoch 36/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.5600 - acc: 0.8029 - val_loss: 1.5246 - val_acc: 0.3800\n",
"\n",
"Epoch 00036: val_acc did not improve from 0.42000\n",
"Epoch 37/100\n",
"1974/1974 [==============================] - 0s 68us/step - loss: 0.5323 - acc: 0.8075 - val_loss: 1.4999 - val_acc: 0.3700\n",
"\n",
"Epoch 00037: val_acc did not improve from 0.42000\n",
"Epoch 38/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.5352 - acc: 0.8136 - val_loss: 1.4323 - val_acc: 0.4100\n",
"\n",
"Epoch 00038: val_acc did not improve from 0.42000\n",
"Epoch 39/100\n",
"1974/1974 [==============================] - 0s 70us/step - loss: 0.5304 - acc: 0.8131 - val_loss: 1.4978 - val_acc: 0.3800\n",
"\n",
"Epoch 00039: val_acc did not improve from 0.42000\n",
"Epoch 40/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.5013 - acc: 0.8242 - val_loss: 1.4509 - val_acc: 0.4200\n",
"\n",
"Epoch 00040: val_acc did not improve from 0.42000\n",
"Epoch 41/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.4914 - acc: 0.8364 - val_loss: 1.5471 - val_acc: 0.3500\n",
"\n",
"Epoch 00041: val_acc did not improve from 0.42000\n",
"Epoch 42/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.4741 - acc: 0.8414 - val_loss: 1.5252 - val_acc: 0.4000\n",
"\n",
"Epoch 00042: val_acc did not improve from 0.42000\n",
"Epoch 43/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.4725 - acc: 0.8425 - val_loss: 1.5506 - val_acc: 0.3900\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Epoch 00043: val_acc did not improve from 0.42000\n",
"Epoch 44/100\n",
"1974/1974 [==============================] - 0s 68us/step - loss: 0.4468 - acc: 0.8399 - val_loss: 1.5384 - val_acc: 0.4000\n",
"\n",
"Epoch 00044: val_acc did not improve from 0.42000\n",
"Epoch 45/100\n",
"1974/1974 [==============================] - 0s 66us/step - loss: 0.4362 - acc: 0.8541 - val_loss: 1.5683 - val_acc: 0.3900\n",
"\n",
"Epoch 00045: val_acc did not improve from 0.42000\n",
"Epoch 46/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.4237 - acc: 0.8658 - val_loss: 1.6117 - val_acc: 0.3900\n",
"\n",
"Epoch 00046: val_acc did not improve from 0.42000\n",
"Epoch 47/100\n",
"1974/1974 [==============================] - 0s 77us/step - loss: 0.4182 - acc: 0.8531 - val_loss: 1.5951 - val_acc: 0.4000\n",
"\n",
"Epoch 00047: val_acc did not improve from 0.42000\n",
"Epoch 48/100\n",
"1974/1974 [==============================] - 0s 70us/step - loss: 0.4217 - acc: 0.8541 - val_loss: 1.5420 - val_acc: 0.4300\n",
"\n",
"Epoch 00048: val_acc improved from 0.42000 to 0.43000, saving model to top_model_weights.hdf5\n",
"Epoch 49/100\n",
"1974/1974 [==============================] - 0s 65us/step - loss: 0.3935 - acc: 0.8708 - val_loss: 1.5906 - val_acc: 0.3800\n",
"\n",
"Epoch 00049: val_acc did not improve from 0.43000\n",
"Epoch 50/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.3757 - acc: 0.8810 - val_loss: 1.6439 - val_acc: 0.3600\n",
"\n",
"Epoch 00050: val_acc did not improve from 0.43000\n",
"Epoch 51/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.3808 - acc: 0.8703 - val_loss: 1.7535 - val_acc: 0.3600\n",
"\n",
"Epoch 00051: val_acc did not improve from 0.43000\n",
"Epoch 52/100\n",
"1974/1974 [==============================] - 0s 68us/step - loss: 0.3659 - acc: 0.8901 - val_loss: 1.6556 - val_acc: 0.3700\n",
"\n",
"Epoch 00052: val_acc did not improve from 0.43000\n",
"Epoch 53/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.3588 - acc: 0.8931 - val_loss: 1.7247 - val_acc: 0.3900\n",
"\n",
"Epoch 00053: val_acc did not improve from 0.43000\n",
"Epoch 54/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.3548 - acc: 0.8840 - val_loss: 1.6925 - val_acc: 0.3800\n",
"\n",
"Epoch 00054: val_acc did not improve from 0.43000\n",
"Epoch 55/100\n",
"1974/1974 [==============================] - 0s 67us/step - loss: 0.3375 - acc: 0.9012 - val_loss: 1.7032 - val_acc: 0.3800\n",
"\n",
"Epoch 00055: val_acc did not improve from 0.43000\n",
"Epoch 56/100\n",
"1974/1974 [==============================] - 0s 67us/step - loss: 0.3403 - acc: 0.8911 - val_loss: 1.6587 - val_acc: 0.3900\n",
"\n",
"Epoch 00056: val_acc did not improve from 0.43000\n",
"Epoch 57/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 0.3461 - acc: 0.8810 - val_loss: 1.6946 - val_acc: 0.4100\n",
"\n",
"Epoch 00057: val_acc did not improve from 0.43000\n",
"Epoch 58/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.3144 - acc: 0.9088 - val_loss: 1.8348 - val_acc: 0.3500\n",
"\n",
"Epoch 00058: val_acc did not improve from 0.43000\n",
"Epoch 59/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 0.3018 - acc: 0.9103 - val_loss: 1.7102 - val_acc: 0.4100\n",
"\n",
"Epoch 00059: val_acc did not improve from 0.43000\n",
"Epoch 60/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.3038 - acc: 0.9068 - val_loss: 1.7871 - val_acc: 0.4000\n",
"\n",
"Epoch 00060: val_acc did not improve from 0.43000\n",
"Epoch 61/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.2880 - acc: 0.9129 - val_loss: 1.7489 - val_acc: 0.3800\n",
"\n",
"Epoch 00061: val_acc did not improve from 0.43000\n",
"Epoch 62/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.2935 - acc: 0.9088 - val_loss: 1.7886 - val_acc: 0.3900\n",
"\n",
"Epoch 00062: val_acc did not improve from 0.43000\n",
"Epoch 63/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.2922 - acc: 0.9073 - val_loss: 1.8376 - val_acc: 0.3800\n",
"\n",
"Epoch 00063: val_acc did not improve from 0.43000\n",
"Epoch 64/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.2704 - acc: 0.9230 - val_loss: 1.8068 - val_acc: 0.4200\n",
"\n",
"Epoch 00064: val_acc did not improve from 0.43000\n",
"Epoch 65/100\n",
"1974/1974 [==============================] - 0s 77us/step - loss: 0.2487 - acc: 0.9341 - val_loss: 1.9162 - val_acc: 0.3900\n",
"\n",
"Epoch 00065: val_acc did not improve from 0.43000\n",
"Epoch 66/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2681 - acc: 0.9159 - val_loss: 1.8184 - val_acc: 0.3800\n",
"\n",
"Epoch 00066: val_acc did not improve from 0.43000\n",
"Epoch 67/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.2673 - acc: 0.9255 - val_loss: 1.9151 - val_acc: 0.4000\n",
"\n",
"Epoch 00067: val_acc did not improve from 0.43000\n",
"Epoch 68/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.2541 - acc: 0.9210 - val_loss: 1.8741 - val_acc: 0.3900\n",
"\n",
"Epoch 00068: val_acc did not improve from 0.43000\n",
"Epoch 69/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2597 - acc: 0.9225 - val_loss: 1.8950 - val_acc: 0.3800\n",
"\n",
"Epoch 00069: val_acc did not improve from 0.43000\n",
"Epoch 70/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2503 - acc: 0.9260 - val_loss: 1.9661 - val_acc: 0.3800\n",
"\n",
"Epoch 00070: val_acc did not improve from 0.43000\n",
"Epoch 71/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2438 - acc: 0.9311 - val_loss: 1.8656 - val_acc: 0.4000\n",
"\n",
"Epoch 00071: val_acc did not improve from 0.43000\n",
"Epoch 72/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.2271 - acc: 0.9372 - val_loss: 1.9612 - val_acc: 0.3700\n",
"\n",
"Epoch 00072: val_acc did not improve from 0.43000\n",
"Epoch 73/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.2217 - acc: 0.9382 - val_loss: 1.9301 - val_acc: 0.3900\n",
"\n",
"Epoch 00073: val_acc did not improve from 0.43000\n",
"Epoch 74/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2074 - acc: 0.9443 - val_loss: 2.0086 - val_acc: 0.3700\n",
"\n",
"Epoch 00074: val_acc did not improve from 0.43000\n",
"Epoch 75/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.2220 - acc: 0.9387 - val_loss: 1.9573 - val_acc: 0.4000\n",
"\n",
"Epoch 00075: val_acc did not improve from 0.43000\n",
"Epoch 76/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.2126 - acc: 0.9357 - val_loss: 1.9677 - val_acc: 0.4100\n",
"\n",
"Epoch 00076: val_acc did not improve from 0.43000\n",
"Epoch 77/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.2172 - acc: 0.9357 - val_loss: 1.9441 - val_acc: 0.3800\n",
"\n",
"Epoch 00077: val_acc did not improve from 0.43000\n",
"Epoch 78/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.2131 - acc: 0.9422 - val_loss: 2.0172 - val_acc: 0.3700\n",
"\n",
"Epoch 00078: val_acc did not improve from 0.43000\n",
"Epoch 79/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.2071 - acc: 0.9422 - val_loss: 2.0800 - val_acc: 0.3600\n",
"\n",
"Epoch 00079: val_acc did not improve from 0.43000\n",
"Epoch 80/100\n",
"1974/1974 [==============================] - 0s 76us/step - loss: 0.2045 - acc: 0.9422 - val_loss: 1.9284 - val_acc: 0.3900\n",
"\n",
"Epoch 00080: val_acc did not improve from 0.43000\n",
"Epoch 81/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.1861 - acc: 0.9468 - val_loss: 1.9958 - val_acc: 0.3600\n",
"\n",
"Epoch 00081: val_acc did not improve from 0.43000\n",
"Epoch 82/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.1828 - acc: 0.9498 - val_loss: 2.1236 - val_acc: 0.3800\n",
"\n",
"Epoch 00082: val_acc did not improve from 0.43000\n",
"Epoch 83/100\n",
"1974/1974 [==============================] - 0s 67us/step - loss: 0.2002 - acc: 0.9412 - val_loss: 2.0486 - val_acc: 0.3900\n",
"\n",
"Epoch 00083: val_acc did not improve from 0.43000\n",
"Epoch 84/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.1909 - acc: 0.9458 - val_loss: 2.1078 - val_acc: 0.3700\n",
"\n",
"Epoch 00084: val_acc did not improve from 0.43000\n",
"Epoch 85/100\n",
"1974/1974 [==============================] - 0s 66us/step - loss: 0.1784 - acc: 0.9514 - val_loss: 2.0934 - val_acc: 0.4000\n",
"\n",
"Epoch 00085: val_acc did not improve from 0.43000\n",
"Epoch 86/100\n",
"1974/1974 [==============================] - 0s 69us/step - loss: 0.1619 - acc: 0.9574 - val_loss: 2.1504 - val_acc: 0.3800\n",
"\n",
"Epoch 00086: val_acc did not improve from 0.43000\n",
"Epoch 87/100\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1974/1974 [==============================] - 0s 70us/step - loss: 0.1666 - acc: 0.9559 - val_loss: 2.2163 - val_acc: 0.3800\n",
"\n",
"Epoch 00087: val_acc did not improve from 0.43000\n",
"Epoch 88/100\n",
"1974/1974 [==============================] - 0s 74us/step - loss: 0.1735 - acc: 0.9509 - val_loss: 2.1760 - val_acc: 0.3700\n",
"\n",
"Epoch 00088: val_acc did not improve from 0.43000\n",
"Epoch 89/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.1717 - acc: 0.9539 - val_loss: 2.2178 - val_acc: 0.4000\n",
"\n",
"Epoch 00089: val_acc did not improve from 0.43000\n",
"Epoch 90/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.1682 - acc: 0.9534 - val_loss: 2.2136 - val_acc: 0.3500\n",
"\n",
"Epoch 00090: val_acc did not improve from 0.43000\n",
"Epoch 91/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.1617 - acc: 0.9554 - val_loss: 2.1644 - val_acc: 0.4000\n",
"\n",
"Epoch 00091: val_acc did not improve from 0.43000\n",
"Epoch 92/100\n",
"1974/1974 [==============================] - 0s 75us/step - loss: 0.1701 - acc: 0.9488 - val_loss: 2.0769 - val_acc: 0.4100\n",
"\n",
"Epoch 00092: val_acc did not improve from 0.43000\n",
"Epoch 93/100\n",
"1974/1974 [==============================] - 0s 71us/step - loss: 0.1662 - acc: 0.9590 - val_loss: 2.2812 - val_acc: 0.3900\n",
"\n",
"Epoch 00093: val_acc did not improve from 0.43000\n",
"Epoch 94/100\n",
"1974/1974 [==============================] - 0s 65us/step - loss: 0.1499 - acc: 0.9585 - val_loss: 2.2672 - val_acc: 0.3800\n",
"\n",
"Epoch 00094: val_acc did not improve from 0.43000\n",
"Epoch 95/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.1597 - acc: 0.9554 - val_loss: 2.2235 - val_acc: 0.4000\n",
"\n",
"Epoch 00095: val_acc did not improve from 0.43000\n",
"Epoch 96/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.1584 - acc: 0.9539 - val_loss: 2.1695 - val_acc: 0.3800\n",
"\n",
"Epoch 00096: val_acc did not improve from 0.43000\n",
"Epoch 97/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.1550 - acc: 0.9529 - val_loss: 2.2039 - val_acc: 0.3800\n",
"\n",
"Epoch 00097: val_acc did not improve from 0.43000\n",
"Epoch 98/100\n",
"1974/1974 [==============================] - 0s 70us/step - loss: 0.1595 - acc: 0.9549 - val_loss: 2.1173 - val_acc: 0.3700\n",
"\n",
"Epoch 00098: val_acc did not improve from 0.43000\n",
"Epoch 99/100\n",
"1974/1974 [==============================] - 0s 73us/step - loss: 0.1527 - acc: 0.9585 - val_loss: 2.3184 - val_acc: 0.3500\n",
"\n",
"Epoch 00099: val_acc did not improve from 0.43000\n",
"Epoch 100/100\n",
"1974/1974 [==============================] - 0s 72us/step - loss: 0.1458 - acc: 0.9610 - val_loss: 2.2464 - val_acc: 0.3800\n",
"\n",
"Epoch 00100: val_acc did not improve from 0.43000\n"
]
}
],
"source": [
"history = model.fit(train_data,\n",
" train_labels,\n",
" epochs=EPOCHS,\n",
" validation_data=(validation_data, validation_labels),\n",
" callbacks=callbacks)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(history.history['acc'])\n",
"plt.plot(history.history['val_acc'])\n",
"plt.title('Model accuracy')\n",
"plt.ylabel('Accuracy')\n",
"plt.xlabel('Epoch')\n",
"plt.legend(['Train', 'Test'], loc='upper left')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"239/239 [==============================] - 0s 28us/step\n"
]
},
{
"data": {
"text/plain": [
"[2.1765872933375787, 0.45188284556237224]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
" # model.load_weights('model-07-0.49.hdf5')\n",
"\n",
"model.evaluate(test_data, test_labels)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"dense_1 (Dense) (None, 128) 65664 \n",
"_________________________________________________________________\n",
"dropout_1 (Dropout) (None, 128) 0 \n",
"_________________________________________________________________\n",
"dense_2 (Dense) (None, 4) 516 \n",
"=================================================================\n",
"Total params: 66,180\n",
"Trainable params: 66,180\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.