{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from matplotlib import pyplot as plt\n", "import cv2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "img=cv2.imread('som.jpg')\n", "gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.imshow(gray, cmap='gray')\n", "plt.title('my picture')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import mxnet as mx\n", "a = mx.nd.ones((2, 3), mx.gpu())\n", "b = a * 2 + 1\n", "b.asnumpy()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import keras" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from __future__ import print_function\n", "import keras\n", "from keras.layers import Dense, Conv2D, BatchNormalization, Activation\n", "from keras.layers import AveragePooling2D, Input, Flatten\n", "from keras.optimizers import Adam\n", "from keras.callbacks import ModelCheckpoint, LearningRateScheduler\n", "from keras.callbacks import ReduceLROnPlateau\n", "from keras.preprocessing.image import ImageDataGenerator\n", "from keras.regularizers import l2\n", "from keras import backend as K\n", "from keras.models import Model\n", "from keras.datasets import cifar10\n", "import numpy as np\n", "import os\n", "from keras.utils import multi_gpu_model" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_train shape: (50000, 3, 32, 32)\n", "50000 train samples\n", "10000 test samples\n", "y_train shape: (50000, 1)\n" ] } ], "source": [ "# Training parameters\n", "num_gpus = 2\n", "batch_size = 32 * num_gpus # orig paper trained all networks with batch_size=128\n", "epochs = 200\n", "data_augmentation = True\n", "data_normalization = True\n", "num_classes = 10\n", "\n", "# Subtracting pixel mean improves accuracy\n", "subtract_pixel_mean = True \n", "\n", "# Model parameter\n", "# ----------------------------------------------------------------------------\n", "# | | 200-epoch | Orig Paper| 200-epoch | Orig Paper| sec/epoch\n", "# Model | n | ResNet v1 | ResNet v1 | ResNet v2 | ResNet v2 | GTX1080Ti\n", "# |v1(v2)| %Accuracy | %Accuracy | %Accuracy | %Accuracy | v1 (v2)\n", "# ----------------------------------------------------------------------------\n", "# ResNet20 | 3 (2)| 92.16 | 91.25 | ----- | ----- | 35 (---)\n", "# ResNet32 | 5(NA)| 92.46 | 92.49 | NA | NA | 50 ( NA)\n", "# ResNet44 | 7(NA)| 92.50 | 92.83 | NA | NA | 70 ( NA)\n", "# ResNet56 | 9 (6)| 92.71 | 93.03 | 93.01 | NA | 90 (100)\n", "# ResNet110 |18(12)| 92.65 | 93.39+-.16| 93.15 | 93.63 | 165(180)\n", "# ResNet164 |27(18)| ----- | 94.07 | ----- | 94.54 | ---(---)\n", "# ResNet1001| (111)| ----- | 92.39 | ----- | 95.08+-.14| ---(---)\n", "# ---------------------------------------------------------------------------\n", "# use ResNet56\n", "n = 9\n", "\n", "# Model version\n", "# Orig paper: version = 1 (ResNet v1), Improved ResNet: version = 2 (ResNet v2)\n", "version = 2\n", "\n", "# Computed depth from supplied model parameter n\n", "if version == 1:\n", " depth = n * 6 + 2\n", "elif version == 2:\n", " depth = n * 9 + 2\n", "\n", "# Model name, depth and version\n", "model_type = 'ResNet%dv%d' % (depth, version)\n", "\n", "# Load the CIFAR10 data.\n", "(x_train, y_train), (x_test, y_test) = cifar10.load_data()\n", "\n", "# Input image dimensions.\n", "input_shape = x_train.shape[1:]\n", "\n", "# Normalize data.\n", "if data_normalization:\n", " x_train = x_train.astype('float32') / 255\n", " x_test = x_test.astype('float32') / 255\n", "\n", "# If subtract pixel mean is enabled\n", "if subtract_pixel_mean:\n", " x_train_mean = np.mean(x_train, axis=0)\n", " x_train -= x_train_mean\n", " x_test -= x_train_mean\n", "\n", "print('x_train shape:', x_train.shape)\n", "print(x_train.shape[0], 'train samples')\n", "print(x_test.shape[0], 'test samples')\n", "print('y_train shape:', y_train.shape)\n", "\n", "# Convert class vectors to binary class matrices.\n", "y_train = keras.utils.to_categorical(y_train, num_classes)\n", "y_test = keras.utils.to_categorical(y_test, num_classes)\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Learning rate: 0.001\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) (None, 3, 32, 32) 0 \n", "__________________________________________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 16, 32, 32) 448 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_1 (BatchNor (None, 16, 32, 32) 64 conv2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "activation_1 (Activation) (None, 16, 32, 32) 0 batch_normalization_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 16, 32, 32) 272 activation_1[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_2 (BatchNor (None, 16, 32, 32) 64 conv2d_2[0][0] \n", "__________________________________________________________________________________________________\n", "activation_2 (Activation) (None, 16, 32, 32) 0 batch_normalization_2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 16, 32, 32) 2320 activation_2[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_3 (BatchNor (None, 16, 32, 32) 64 conv2d_3[0][0] \n", "__________________________________________________________________________________________________\n", "activation_3 (Activation) (None, 16, 32, 32) 0 batch_normalization_3[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_5 (Conv2D) (None, 64, 32, 32) 1088 activation_1[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 64, 32, 32) 1088 activation_3[0][0] \n", "__________________________________________________________________________________________________\n", "add_1 (Add) (None, 64, 32, 32) 0 conv2d_5[0][0] \n", " conv2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_4 (BatchNor (None, 64, 32, 32) 256 add_1[0][0] \n", "__________________________________________________________________________________________________\n", "activation_4 (Activation) (None, 64, 32, 32) 0 batch_normalization_4[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_6 (Conv2D) (None, 16, 32, 32) 1040 activation_4[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_5 (BatchNor (None, 16, 32, 32) 64 conv2d_6[0][0] \n", "__________________________________________________________________________________________________\n", "activation_5 (Activation) (None, 16, 32, 32) 0 batch_normalization_5[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_7 (Conv2D) (None, 16, 32, 32) 2320 activation_5[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_6 (BatchNor (None, 16, 32, 32) 64 conv2d_7[0][0] \n", "__________________________________________________________________________________________________\n", "activation_6 (Activation) (None, 16, 32, 32) 0 batch_normalization_6[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_8 (Conv2D) (None, 64, 32, 32) 1088 activation_6[0][0] \n", "__________________________________________________________________________________________________\n", "add_2 (Add) (None, 64, 32, 32) 0 add_1[0][0] \n", " conv2d_8[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_7 (BatchNor (None, 64, 32, 32) 256 add_2[0][0] \n", "__________________________________________________________________________________________________\n", "activation_7 (Activation) (None, 64, 32, 32) 0 batch_normalization_7[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_9 (Conv2D) (None, 16, 32, 32) 1040 activation_7[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_8 (BatchNor (None, 16, 32, 32) 64 conv2d_9[0][0] \n", "__________________________________________________________________________________________________\n", "activation_8 (Activation) (None, 16, 32, 32) 0 batch_normalization_8[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_10 (Conv2D) (None, 16, 32, 32) 2320 activation_8[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_9 (BatchNor (None, 16, 32, 32) 64 conv2d_10[0][0] \n", "__________________________________________________________________________________________________\n", "activation_9 (Activation) (None, 16, 32, 32) 0 batch_normalization_9[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_11 (Conv2D) (None, 64, 32, 32) 1088 activation_9[0][0] \n", "__________________________________________________________________________________________________\n", "add_3 (Add) (None, 64, 32, 32) 0 add_2[0][0] \n", " conv2d_11[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_10 (BatchNo (None, 64, 32, 32) 256 add_3[0][0] \n", "__________________________________________________________________________________________________\n", "activation_10 (Activation) (None, 64, 32, 32) 0 batch_normalization_10[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_12 (Conv2D) (None, 16, 32, 32) 1040 activation_10[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_11 (BatchNo (None, 16, 32, 32) 64 conv2d_12[0][0] \n", "__________________________________________________________________________________________________\n", "activation_11 (Activation) (None, 16, 32, 32) 0 batch_normalization_11[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_13 (Conv2D) (None, 16, 32, 32) 2320 activation_11[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_12 (BatchNo (None, 16, 32, 32) 64 conv2d_13[0][0] \n", "__________________________________________________________________________________________________\n", "activation_12 (Activation) (None, 16, 32, 32) 0 batch_normalization_12[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_14 (Conv2D) (None, 64, 32, 32) 1088 activation_12[0][0] \n", "__________________________________________________________________________________________________\n", "add_4 (Add) (None, 64, 32, 32) 0 add_3[0][0] \n", " conv2d_14[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_13 (BatchNo (None, 64, 32, 32) 256 add_4[0][0] \n", "__________________________________________________________________________________________________\n", "activation_13 (Activation) (None, 64, 32, 32) 0 batch_normalization_13[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_15 (Conv2D) (None, 16, 32, 32) 1040 activation_13[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_14 (BatchNo (None, 16, 32, 32) 64 conv2d_15[0][0] \n", "__________________________________________________________________________________________________\n", "activation_14 (Activation) (None, 16, 32, 32) 0 batch_normalization_14[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_16 (Conv2D) (None, 16, 32, 32) 2320 activation_14[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_15 (BatchNo (None, 16, 32, 32) 64 conv2d_16[0][0] \n", "__________________________________________________________________________________________________\n", "activation_15 (Activation) (None, 16, 32, 32) 0 batch_normalization_15[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_17 (Conv2D) (None, 64, 32, 32) 1088 activation_15[0][0] \n", "__________________________________________________________________________________________________\n", "add_5 (Add) (None, 64, 32, 32) 0 add_4[0][0] \n", " conv2d_17[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_16 (BatchNo (None, 64, 32, 32) 256 add_5[0][0] \n", "__________________________________________________________________________________________________\n", "activation_16 (Activation) (None, 64, 32, 32) 0 batch_normalization_16[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_18 (Conv2D) (None, 16, 32, 32) 1040 activation_16[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_17 (BatchNo (None, 16, 32, 32) 64 conv2d_18[0][0] \n", "__________________________________________________________________________________________________\n", "activation_17 (Activation) (None, 16, 32, 32) 0 batch_normalization_17[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_19 (Conv2D) (None, 16, 32, 32) 2320 activation_17[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_18 (BatchNo (None, 16, 32, 32) 64 conv2d_19[0][0] \n", "__________________________________________________________________________________________________\n", "activation_18 (Activation) (None, 16, 32, 32) 0 batch_normalization_18[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_20 (Conv2D) (None, 64, 32, 32) 1088 activation_18[0][0] \n", "__________________________________________________________________________________________________\n", "add_6 (Add) (None, 64, 32, 32) 0 add_5[0][0] \n", " conv2d_20[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_19 (BatchNo (None, 64, 32, 32) 256 add_6[0][0] \n", "__________________________________________________________________________________________________\n", "activation_19 (Activation) (None, 64, 32, 32) 0 batch_normalization_19[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_21 (Conv2D) (None, 16, 32, 32) 1040 activation_19[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_20 (BatchNo (None, 16, 32, 32) 64 conv2d_21[0][0] \n", "__________________________________________________________________________________________________\n", "activation_20 (Activation) (None, 16, 32, 32) 0 batch_normalization_20[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_22 (Conv2D) (None, 16, 32, 32) 2320 activation_20[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_21 (BatchNo (None, 16, 32, 32) 64 conv2d_22[0][0] \n", "__________________________________________________________________________________________________\n", "activation_21 (Activation) (None, 16, 32, 32) 0 batch_normalization_21[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_23 (Conv2D) (None, 64, 32, 32) 1088 activation_21[0][0] \n", "__________________________________________________________________________________________________\n", "add_7 (Add) (None, 64, 32, 32) 0 add_6[0][0] \n", " conv2d_23[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_22 (BatchNo (None, 64, 32, 32) 256 add_7[0][0] \n", "__________________________________________________________________________________________________\n", "activation_22 (Activation) (None, 64, 32, 32) 0 batch_normalization_22[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_24 (Conv2D) (None, 16, 32, 32) 1040 activation_22[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_23 (BatchNo (None, 16, 32, 32) 64 conv2d_24[0][0] \n", "__________________________________________________________________________________________________\n", "activation_23 (Activation) (None, 16, 32, 32) 0 batch_normalization_23[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_25 (Conv2D) (None, 16, 32, 32) 2320 activation_23[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_24 (BatchNo (None, 16, 32, 32) 64 conv2d_25[0][0] \n", "__________________________________________________________________________________________________\n", "activation_24 (Activation) (None, 16, 32, 32) 0 batch_normalization_24[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_26 (Conv2D) (None, 64, 32, 32) 1088 activation_24[0][0] \n", "__________________________________________________________________________________________________\n", "add_8 (Add) (None, 64, 32, 32) 0 add_7[0][0] \n", " conv2d_26[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_25 (BatchNo (None, 64, 32, 32) 256 add_8[0][0] \n", "__________________________________________________________________________________________________\n", "activation_25 (Activation) (None, 64, 32, 32) 0 batch_normalization_25[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_27 (Conv2D) (None, 16, 32, 32) 1040 activation_25[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_26 (BatchNo (None, 16, 32, 32) 64 conv2d_27[0][0] \n", "__________________________________________________________________________________________________\n", "activation_26 (Activation) (None, 16, 32, 32) 0 batch_normalization_26[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_28 (Conv2D) (None, 16, 32, 32) 2320 activation_26[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_27 (BatchNo (None, 16, 32, 32) 64 conv2d_28[0][0] \n", "__________________________________________________________________________________________________\n", "activation_27 (Activation) (None, 16, 32, 32) 0 batch_normalization_27[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_29 (Conv2D) (None, 64, 32, 32) 1088 activation_27[0][0] \n", "__________________________________________________________________________________________________\n", "add_9 (Add) (None, 64, 32, 32) 0 add_8[0][0] \n", " conv2d_29[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_28 (BatchNo (None, 64, 32, 32) 256 add_9[0][0] \n", "__________________________________________________________________________________________________\n", "activation_28 (Activation) (None, 64, 32, 32) 0 batch_normalization_28[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_30 (Conv2D) (None, 64, 16, 16) 4160 activation_28[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_29 (BatchNo (None, 64, 16, 16) 256 conv2d_30[0][0] \n", "__________________________________________________________________________________________________\n", "activation_29 (Activation) (None, 64, 16, 16) 0 batch_normalization_29[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_31 (Conv2D) (None, 64, 16, 16) 36928 activation_29[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_30 (BatchNo (None, 64, 16, 16) 256 conv2d_31[0][0] \n", "__________________________________________________________________________________________________\n", "activation_30 (Activation) (None, 64, 16, 16) 0 batch_normalization_30[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_33 (Conv2D) (None, 128, 16, 16) 8320 add_9[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_32 (Conv2D) (None, 128, 16, 16) 8320 activation_30[0][0] \n", "__________________________________________________________________________________________________\n", "add_10 (Add) (None, 128, 16, 16) 0 conv2d_33[0][0] \n", " conv2d_32[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_31 (BatchNo (None, 128, 16, 16) 512 add_10[0][0] \n", "__________________________________________________________________________________________________\n", "activation_31 (Activation) (None, 128, 16, 16) 0 batch_normalization_31[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_34 (Conv2D) (None, 64, 16, 16) 8256 activation_31[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_32 (BatchNo (None, 64, 16, 16) 256 conv2d_34[0][0] \n", "__________________________________________________________________________________________________\n", "activation_32 (Activation) (None, 64, 16, 16) 0 batch_normalization_32[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_35 (Conv2D) (None, 64, 16, 16) 36928 activation_32[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_33 (BatchNo (None, 64, 16, 16) 256 conv2d_35[0][0] \n", "__________________________________________________________________________________________________\n", "activation_33 (Activation) (None, 64, 16, 16) 0 batch_normalization_33[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_36 (Conv2D) (None, 128, 16, 16) 8320 activation_33[0][0] \n", "__________________________________________________________________________________________________\n", "add_11 (Add) (None, 128, 16, 16) 0 add_10[0][0] \n", " conv2d_36[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_34 (BatchNo (None, 128, 16, 16) 512 add_11[0][0] \n", "__________________________________________________________________________________________________\n", "activation_34 (Activation) (None, 128, 16, 16) 0 batch_normalization_34[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_37 (Conv2D) (None, 64, 16, 16) 8256 activation_34[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_35 (BatchNo (None, 64, 16, 16) 256 conv2d_37[0][0] \n", "__________________________________________________________________________________________________\n", "activation_35 (Activation) (None, 64, 16, 16) 0 batch_normalization_35[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_38 (Conv2D) (None, 64, 16, 16) 36928 activation_35[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_36 (BatchNo (None, 64, 16, 16) 256 conv2d_38[0][0] \n", "__________________________________________________________________________________________________\n", "activation_36 (Activation) (None, 64, 16, 16) 0 batch_normalization_36[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_39 (Conv2D) (None, 128, 16, 16) 8320 activation_36[0][0] \n", "__________________________________________________________________________________________________\n", "add_12 (Add) (None, 128, 16, 16) 0 add_11[0][0] \n", " conv2d_39[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_37 (BatchNo (None, 128, 16, 16) 512 add_12[0][0] \n", "__________________________________________________________________________________________________\n", "activation_37 (Activation) (None, 128, 16, 16) 0 batch_normalization_37[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_40 (Conv2D) (None, 64, 16, 16) 8256 activation_37[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_38 (BatchNo (None, 64, 16, 16) 256 conv2d_40[0][0] \n", "__________________________________________________________________________________________________\n", "activation_38 (Activation) (None, 64, 16, 16) 0 batch_normalization_38[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_41 (Conv2D) (None, 64, 16, 16) 36928 activation_38[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_39 (BatchNo (None, 64, 16, 16) 256 conv2d_41[0][0] \n", "__________________________________________________________________________________________________\n", "activation_39 (Activation) (None, 64, 16, 16) 0 batch_normalization_39[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_42 (Conv2D) (None, 128, 16, 16) 8320 activation_39[0][0] \n", "__________________________________________________________________________________________________\n", "add_13 (Add) (None, 128, 16, 16) 0 add_12[0][0] \n", " conv2d_42[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_40 (BatchNo (None, 128, 16, 16) 512 add_13[0][0] \n", "__________________________________________________________________________________________________\n", "activation_40 (Activation) (None, 128, 16, 16) 0 batch_normalization_40[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_43 (Conv2D) (None, 64, 16, 16) 8256 activation_40[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_41 (BatchNo (None, 64, 16, 16) 256 conv2d_43[0][0] \n", "__________________________________________________________________________________________________\n", "activation_41 (Activation) (None, 64, 16, 16) 0 batch_normalization_41[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_44 (Conv2D) (None, 64, 16, 16) 36928 activation_41[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_42 (BatchNo (None, 64, 16, 16) 256 conv2d_44[0][0] \n", "__________________________________________________________________________________________________\n", "activation_42 (Activation) (None, 64, 16, 16) 0 batch_normalization_42[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_45 (Conv2D) (None, 128, 16, 16) 8320 activation_42[0][0] \n", "__________________________________________________________________________________________________\n", "add_14 (Add) (None, 128, 16, 16) 0 add_13[0][0] \n", " conv2d_45[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_43 (BatchNo (None, 128, 16, 16) 512 add_14[0][0] \n", "__________________________________________________________________________________________________\n", "activation_43 (Activation) (None, 128, 16, 16) 0 batch_normalization_43[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_46 (Conv2D) (None, 64, 16, 16) 8256 activation_43[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_44 (BatchNo (None, 64, 16, 16) 256 conv2d_46[0][0] \n", "__________________________________________________________________________________________________\n", "activation_44 (Activation) (None, 64, 16, 16) 0 batch_normalization_44[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_47 (Conv2D) (None, 64, 16, 16) 36928 activation_44[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_45 (BatchNo (None, 64, 16, 16) 256 conv2d_47[0][0] \n", "__________________________________________________________________________________________________\n", "activation_45 (Activation) (None, 64, 16, 16) 0 batch_normalization_45[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_48 (Conv2D) (None, 128, 16, 16) 8320 activation_45[0][0] \n", "__________________________________________________________________________________________________\n", "add_15 (Add) (None, 128, 16, 16) 0 add_14[0][0] \n", " conv2d_48[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_46 (BatchNo (None, 128, 16, 16) 512 add_15[0][0] \n", "__________________________________________________________________________________________________\n", "activation_46 (Activation) (None, 128, 16, 16) 0 batch_normalization_46[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_49 (Conv2D) (None, 64, 16, 16) 8256 activation_46[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_47 (BatchNo (None, 64, 16, 16) 256 conv2d_49[0][0] \n", "__________________________________________________________________________________________________\n", "activation_47 (Activation) (None, 64, 16, 16) 0 batch_normalization_47[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_50 (Conv2D) (None, 64, 16, 16) 36928 activation_47[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_48 (BatchNo (None, 64, 16, 16) 256 conv2d_50[0][0] \n", "__________________________________________________________________________________________________\n", "activation_48 (Activation) (None, 64, 16, 16) 0 batch_normalization_48[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_51 (Conv2D) (None, 128, 16, 16) 8320 activation_48[0][0] \n", "__________________________________________________________________________________________________\n", "add_16 (Add) (None, 128, 16, 16) 0 add_15[0][0] \n", " conv2d_51[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_49 (BatchNo (None, 128, 16, 16) 512 add_16[0][0] \n", "__________________________________________________________________________________________________\n", "activation_49 (Activation) (None, 128, 16, 16) 0 batch_normalization_49[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_52 (Conv2D) (None, 64, 16, 16) 8256 activation_49[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_50 (BatchNo (None, 64, 16, 16) 256 conv2d_52[0][0] \n", "__________________________________________________________________________________________________\n", "activation_50 (Activation) (None, 64, 16, 16) 0 batch_normalization_50[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_53 (Conv2D) (None, 64, 16, 16) 36928 activation_50[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_51 (BatchNo (None, 64, 16, 16) 256 conv2d_53[0][0] \n", "__________________________________________________________________________________________________\n", "activation_51 (Activation) (None, 64, 16, 16) 0 batch_normalization_51[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_54 (Conv2D) (None, 128, 16, 16) 8320 activation_51[0][0] \n", "__________________________________________________________________________________________________\n", "add_17 (Add) (None, 128, 16, 16) 0 add_16[0][0] \n", " conv2d_54[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_52 (BatchNo (None, 128, 16, 16) 512 add_17[0][0] \n", "__________________________________________________________________________________________________\n", "activation_52 (Activation) (None, 128, 16, 16) 0 batch_normalization_52[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_55 (Conv2D) (None, 64, 16, 16) 8256 activation_52[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_53 (BatchNo (None, 64, 16, 16) 256 conv2d_55[0][0] \n", "__________________________________________________________________________________________________\n", "activation_53 (Activation) (None, 64, 16, 16) 0 batch_normalization_53[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_56 (Conv2D) (None, 64, 16, 16) 36928 activation_53[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_54 (BatchNo (None, 64, 16, 16) 256 conv2d_56[0][0] \n", "__________________________________________________________________________________________________\n", "activation_54 (Activation) (None, 64, 16, 16) 0 batch_normalization_54[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_57 (Conv2D) (None, 128, 16, 16) 8320 activation_54[0][0] \n", "__________________________________________________________________________________________________\n", "add_18 (Add) (None, 128, 16, 16) 0 add_17[0][0] \n", " conv2d_57[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_55 (BatchNo (None, 128, 16, 16) 512 add_18[0][0] \n", "__________________________________________________________________________________________________\n", "activation_55 (Activation) (None, 128, 16, 16) 0 batch_normalization_55[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_58 (Conv2D) (None, 128, 8, 8) 16512 activation_55[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_56 (BatchNo (None, 128, 8, 8) 512 conv2d_58[0][0] \n", "__________________________________________________________________________________________________\n", "activation_56 (Activation) (None, 128, 8, 8) 0 batch_normalization_56[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_59 (Conv2D) (None, 128, 8, 8) 147584 activation_56[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_57 (BatchNo (None, 128, 8, 8) 512 conv2d_59[0][0] \n", "__________________________________________________________________________________________________\n", "activation_57 (Activation) (None, 128, 8, 8) 0 batch_normalization_57[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_61 (Conv2D) (None, 256, 8, 8) 33024 add_18[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_60 (Conv2D) (None, 256, 8, 8) 33024 activation_57[0][0] \n", "__________________________________________________________________________________________________\n", "add_19 (Add) (None, 256, 8, 8) 0 conv2d_61[0][0] \n", " conv2d_60[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_58 (BatchNo (None, 256, 8, 8) 1024 add_19[0][0] \n", "__________________________________________________________________________________________________\n", "activation_58 (Activation) (None, 256, 8, 8) 0 batch_normalization_58[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_62 (Conv2D) (None, 128, 8, 8) 32896 activation_58[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_59 (BatchNo (None, 128, 8, 8) 512 conv2d_62[0][0] \n", "__________________________________________________________________________________________________\n", "activation_59 (Activation) (None, 128, 8, 8) 0 batch_normalization_59[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_63 (Conv2D) (None, 128, 8, 8) 147584 activation_59[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_60 (BatchNo (None, 128, 8, 8) 512 conv2d_63[0][0] \n", "__________________________________________________________________________________________________\n", "activation_60 (Activation) (None, 128, 8, 8) 0 batch_normalization_60[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_64 (Conv2D) (None, 256, 8, 8) 33024 activation_60[0][0] \n", "__________________________________________________________________________________________________\n", "add_20 (Add) (None, 256, 8, 8) 0 add_19[0][0] \n", " conv2d_64[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_61 (BatchNo (None, 256, 8, 8) 1024 add_20[0][0] \n", "__________________________________________________________________________________________________\n", "activation_61 (Activation) (None, 256, 8, 8) 0 batch_normalization_61[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_65 (Conv2D) (None, 128, 8, 8) 32896 activation_61[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_62 (BatchNo (None, 128, 8, 8) 512 conv2d_65[0][0] \n", "__________________________________________________________________________________________________\n", "activation_62 (Activation) (None, 128, 8, 8) 0 batch_normalization_62[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_66 (Conv2D) (None, 128, 8, 8) 147584 activation_62[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_63 (BatchNo (None, 128, 8, 8) 512 conv2d_66[0][0] \n", "__________________________________________________________________________________________________\n", "activation_63 (Activation) (None, 128, 8, 8) 0 batch_normalization_63[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_67 (Conv2D) (None, 256, 8, 8) 33024 activation_63[0][0] \n", "__________________________________________________________________________________________________\n", "add_21 (Add) (None, 256, 8, 8) 0 add_20[0][0] \n", " conv2d_67[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_64 (BatchNo (None, 256, 8, 8) 1024 add_21[0][0] \n", "__________________________________________________________________________________________________\n", "activation_64 (Activation) (None, 256, 8, 8) 0 batch_normalization_64[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_68 (Conv2D) (None, 128, 8, 8) 32896 activation_64[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_65 (BatchNo (None, 128, 8, 8) 512 conv2d_68[0][0] \n", "__________________________________________________________________________________________________\n", "activation_65 (Activation) (None, 128, 8, 8) 0 batch_normalization_65[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_69 (Conv2D) (None, 128, 8, 8) 147584 activation_65[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_66 (BatchNo (None, 128, 8, 8) 512 conv2d_69[0][0] \n", "__________________________________________________________________________________________________\n", "activation_66 (Activation) (None, 128, 8, 8) 0 batch_normalization_66[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_70 (Conv2D) (None, 256, 8, 8) 33024 activation_66[0][0] \n", "__________________________________________________________________________________________________\n", "add_22 (Add) (None, 256, 8, 8) 0 add_21[0][0] \n", " conv2d_70[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_67 (BatchNo (None, 256, 8, 8) 1024 add_22[0][0] \n", "__________________________________________________________________________________________________\n", "activation_67 (Activation) (None, 256, 8, 8) 0 batch_normalization_67[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_71 (Conv2D) (None, 128, 8, 8) 32896 activation_67[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_68 (BatchNo (None, 128, 8, 8) 512 conv2d_71[0][0] \n", "__________________________________________________________________________________________________\n", "activation_68 (Activation) (None, 128, 8, 8) 0 batch_normalization_68[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_72 (Conv2D) (None, 128, 8, 8) 147584 activation_68[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_69 (BatchNo (None, 128, 8, 8) 512 conv2d_72[0][0] \n", "__________________________________________________________________________________________________\n", "activation_69 (Activation) (None, 128, 8, 8) 0 batch_normalization_69[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_73 (Conv2D) (None, 256, 8, 8) 33024 activation_69[0][0] \n", "__________________________________________________________________________________________________\n", "add_23 (Add) (None, 256, 8, 8) 0 add_22[0][0] \n", " conv2d_73[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_70 (BatchNo (None, 256, 8, 8) 1024 add_23[0][0] \n", "__________________________________________________________________________________________________\n", "activation_70 (Activation) (None, 256, 8, 8) 0 batch_normalization_70[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_74 (Conv2D) (None, 128, 8, 8) 32896 activation_70[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_71 (BatchNo (None, 128, 8, 8) 512 conv2d_74[0][0] \n", "__________________________________________________________________________________________________\n", "activation_71 (Activation) (None, 128, 8, 8) 0 batch_normalization_71[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_75 (Conv2D) (None, 128, 8, 8) 147584 activation_71[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_72 (BatchNo (None, 128, 8, 8) 512 conv2d_75[0][0] \n", "__________________________________________________________________________________________________\n", "activation_72 (Activation) (None, 128, 8, 8) 0 batch_normalization_72[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_76 (Conv2D) (None, 256, 8, 8) 33024 activation_72[0][0] \n", "__________________________________________________________________________________________________\n", "add_24 (Add) (None, 256, 8, 8) 0 add_23[0][0] \n", " conv2d_76[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_73 (BatchNo (None, 256, 8, 8) 1024 add_24[0][0] \n", "__________________________________________________________________________________________________\n", "activation_73 (Activation) (None, 256, 8, 8) 0 batch_normalization_73[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_77 (Conv2D) (None, 128, 8, 8) 32896 activation_73[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_74 (BatchNo (None, 128, 8, 8) 512 conv2d_77[0][0] \n", "__________________________________________________________________________________________________\n", "activation_74 (Activation) (None, 128, 8, 8) 0 batch_normalization_74[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_78 (Conv2D) (None, 128, 8, 8) 147584 activation_74[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_75 (BatchNo (None, 128, 8, 8) 512 conv2d_78[0][0] \n", "__________________________________________________________________________________________________\n", "activation_75 (Activation) (None, 128, 8, 8) 0 batch_normalization_75[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_79 (Conv2D) (None, 256, 8, 8) 33024 activation_75[0][0] \n", "__________________________________________________________________________________________________\n", "add_25 (Add) (None, 256, 8, 8) 0 add_24[0][0] \n", " conv2d_79[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_76 (BatchNo (None, 256, 8, 8) 1024 add_25[0][0] \n", "__________________________________________________________________________________________________\n", "activation_76 (Activation) (None, 256, 8, 8) 0 batch_normalization_76[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_80 (Conv2D) (None, 128, 8, 8) 32896 activation_76[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_77 (BatchNo (None, 128, 8, 8) 512 conv2d_80[0][0] \n", "__________________________________________________________________________________________________\n", "activation_77 (Activation) (None, 128, 8, 8) 0 batch_normalization_77[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_81 (Conv2D) (None, 128, 8, 8) 147584 activation_77[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_78 (BatchNo (None, 128, 8, 8) 512 conv2d_81[0][0] \n", "__________________________________________________________________________________________________\n", "activation_78 (Activation) (None, 128, 8, 8) 0 batch_normalization_78[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_82 (Conv2D) (None, 256, 8, 8) 33024 activation_78[0][0] \n", "__________________________________________________________________________________________________\n", "add_26 (Add) (None, 256, 8, 8) 0 add_25[0][0] \n", " conv2d_82[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_79 (BatchNo (None, 256, 8, 8) 1024 add_26[0][0] \n", "__________________________________________________________________________________________________\n", "activation_79 (Activation) (None, 256, 8, 8) 0 batch_normalization_79[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_83 (Conv2D) (None, 128, 8, 8) 32896 activation_79[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_80 (BatchNo (None, 128, 8, 8) 512 conv2d_83[0][0] \n", "__________________________________________________________________________________________________\n", "activation_80 (Activation) (None, 128, 8, 8) 0 batch_normalization_80[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_84 (Conv2D) (None, 128, 8, 8) 147584 activation_80[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_81 (BatchNo (None, 128, 8, 8) 512 conv2d_84[0][0] \n", "__________________________________________________________________________________________________\n", "activation_81 (Activation) (None, 128, 8, 8) 0 batch_normalization_81[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_85 (Conv2D) (None, 256, 8, 8) 33024 activation_81[0][0] \n", "__________________________________________________________________________________________________\n", "add_27 (Add) (None, 256, 8, 8) 0 add_26[0][0] \n", " conv2d_85[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_82 (BatchNo (None, 256, 8, 8) 1024 add_27[0][0] \n", "__________________________________________________________________________________________________\n", "activation_82 (Activation) (None, 256, 8, 8) 0 batch_normalization_82[0][0] \n", "__________________________________________________________________________________________________\n", "average_pooling2d_1 (AveragePoo (None, 256, 1, 1) 0 activation_82[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_1 (Flatten) (None, 256) 0 average_pooling2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "dense_1 (Dense) (None, 10) 2570 flatten_1[0][0] \n", "==================================================================================================\n", "Total params: 2,498,474\n", "Trainable params: 2,482,890\n", "Non-trainable params: 15,584\n", "__________________________________________________________________________________________________\n", "ResNet83v2\n", "Using real-time data augmentation.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/200\n", "Learning rate: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/hegder/anaconda3/envs/dl2/lib/python3.6/site-packages/mxnet/module/bucketing_module.py:408: UserWarning: Optimizer created manually outside Module but rescale_grad is not normalized to 1.0/batch_size/num_workers (1.0 vs. 0.015625). Is this intended?\n", " force_init=force_init)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "782/782 [==============================] - 87s 111ms/step - loss: 1.6658 - acc: 0.3896 - val_loss: 3.7222 - val_acc: 0.1964\n", "\n", "Epoch 00001: val_acc improved from -inf to 0.19640, saving model to /home/hegder/saved_models/cifar10_ResNet83v2_model.001.h5\n", "Epoch 2/200\n", "Learning rate: 0.001\n", "782/782 [==============================] - 84s 107ms/step - loss: 1.3016 - acc: 0.5567 - val_loss: 4.0547 - val_acc: 0.1759\n", "\n", "Epoch 00002: val_acc did not improve from 0.19640\n", "Epoch 3/200\n", "Learning rate: 0.001\n", "782/782 [==============================] - 83s 106ms/step - loss: 1.1526 - acc: 0.6254 - val_loss: 4.0014 - val_acc: 0.2519\n", "\n", "Epoch 00003: val_acc improved from 0.19640 to 0.25190, saving model to /home/hegder/saved_models/cifar10_ResNet83v2_model.003.h5\n", "Epoch 4/200\n", "Learning rate: 0.001\n", "782/782 [==============================] - 84s 108ms/step - loss: 1.0551 - acc: 0.6699 - val_loss: 8.5378 - val_acc: 0.1794\n", "\n", "Epoch 00004: val_acc did not improve from 0.25190\n", "Epoch 5/200\n", "Learning rate: 0.001\n", "782/782 [==============================] - 86s 110ms/step - loss: 0.9769 - acc: 0.7071 - val_loss: 11.4918 - val_acc: 0.1231\n", "\n", "Epoch 00005: val_acc did not improve from 0.25190\n", "Epoch 6/200\n", "Learning rate: 0.001\n", " 89/782 [==>...........................] - ETA: 1:11 - loss: 0.9354 - acc: 0.7212" ] } ], "source": [ "def lr_schedule(epoch):\n", " \"\"\"Learning Rate Schedule\n", "\n", " Learning rate is scheduled to be reduced after 80, 120, 160, 180 epochs.\n", " Called automatically every epoch as part of callbacks during training.\n", "\n", " # Arguments\n", " epoch (int): The number of epochs\n", "\n", " # Returns\n", " lr (float32): learning rate\n", " \"\"\"\n", " lr = 1e-3\n", " if epoch > 180:\n", " lr *= 0.5e-3\n", " elif epoch > 160:\n", " lr *= 1e-3\n", " elif epoch > 120:\n", " lr *= 1e-2\n", " elif epoch > 80:\n", " lr *= 1e-1\n", " print('Learning rate: ', lr)\n", " return lr\n", "\n", "def resnet_layer(inputs,\n", " num_filters=16,\n", " kernel_size=3,\n", " strides=1,\n", " activation='relu',\n", " batch_normalization=True,\n", " conv_first=True):\n", " \"\"\"2D Convolution-Batch Normalization-Activation stack builder\n", "\n", " # Arguments\n", " inputs (tensor): input tensor from input image or previous layer\n", " num_filters (int): Conv2D number of filters\n", " kernel_size (int): Conv2D square kernel dimensions\n", " strides (int): Conv2D square stride dimensions\n", " activation (string): activation name\n", " batch_normalization (bool): whether to include batch normalization\n", " conv_first (bool): conv-bn-activation (True) or\n", " activation-bn-conv (False)\n", "\n", " # Returns\n", " x (tensor): tensor as input to the next layer\n", " \"\"\"\n", " conv = Conv2D(num_filters,\n", " kernel_size=kernel_size,\n", " strides=strides,\n", " padding='same',\n", " kernel_initializer='he_normal',\n", " kernel_regularizer=l2(1e-4))\n", "\n", " x = inputs\n", " if conv_first:\n", " x = conv(x)\n", " if batch_normalization:\n", " x = BatchNormalization()(x)\n", " if activation is not None:\n", " x = Activation(activation)(x)\n", " else:\n", " if batch_normalization:\n", " x = BatchNormalization()(x)\n", " if activation is not None:\n", " x = Activation(activation)(x)\n", " x = conv(x)\n", " return x\n", "\n", "\n", "def resnet_v1(input_shape, depth, num_classes=10):\n", " \"\"\"ResNet Version 1 Model builder [a]\n", "\n", " Stacks of 2 x (3 x 3) Conv2D-BN-ReLU\n", " Last ReLU is after the shortcut connection.\n", " At the beginning of each stage, the feature map size is halved (downsampled)\n", " by a convolutional layer with strides=2, while the number of filters is\n", " doubled. Within each stage, the layers have the same number filters and the\n", " same number of filters.\n", " Features maps sizes:\n", " stage 0: 32x32, 16\n", " stage 1: 16x16, 32\n", " stage 2: 8x8, 64\n", " The Number of parameters is approx the same as Table 6 of [a]:\n", " ResNet20 0.27M\n", " ResNet32 0.46M\n", " ResNet44 0.66M\n", " ResNet56 0.85M\n", " ResNet110 1.7M\n", " \n", " # Arguments\n", " input_shape (tensor): shape of input image tensor\n", " depth (int): number of core convolutional layers\n", " num_classes (int): number of classes (CIFAR10 has 10)\n", "\n", " # Returns\n", " model (Model): Keras model instance\n", " \"\"\"\n", " if (depth - 2) % 6 != 0:\n", " raise ValueError('depth should be 6n+2 (eg 20, 32, 44 in [a])')\n", " # Start model definition.\n", " num_filters = 16\n", " num_res_blocks = int((depth - 2) / 6)\n", " \n", " inputs = Input(shape=input_shape)\n", " x = resnet_layer(inputs=inputs)\n", " # Instantiate the stack of residual units\n", " for stack in range(3):\n", " for res_block in range(num_res_blocks):\n", " strides = 1\n", " if stack > 0 and res_block == 0: # first layer but not first stack\n", " strides = 2 # downsample\n", " y = resnet_layer(inputs=x,\n", " num_filters=num_filters,\n", " strides=strides)\n", " y = resnet_layer(inputs=y,\n", " num_filters=num_filters,\n", " activation=None)\n", " \n", " if stack > 0 and res_block == 0: # first layer but not first stack\n", " # linear projection residual shortcut connection to match\n", " # changed dims\n", " x = resnet_layer(inputs=x,\n", " num_filters=num_filters,\n", " kernel_size=1,\n", " strides=strides,\n", " activation=None,\n", " batch_normalization=False)\n", " x = keras.layers.add([x, y])\n", " x = Activation('relu')(x)\n", " num_filters *= 2\n", "\n", " # Add classifier on top.\n", " # v1 does not use BN after last shortcut connection-ReLU\n", " x = AveragePooling2D(pool_size=8)(x)\n", " y = Flatten()(x)\n", " outputs = Dense(num_classes,\n", " activation='softmax',\n", " kernel_initializer='he_normal')(y)\n", "\n", " # Instantiate model.\n", " model = Model(inputs=inputs, outputs=outputs)\n", " return model\n", "\n", "def resnet_v2(input_shape, depth, num_classes=10):\n", " \"\"\"ResNet Version 2 Model builder [b]\n", "\n", " Stacks of (1 x 1)-(3 x 3)-(1 x 1) BN-ReLU-Conv2D or also known as\n", " bottleneck layer\n", " First shortcut connection per layer is 1 x 1 Conv2D.\n", " Second and onwards shortcut connection is identity.\n", " At the beginning of each stage, the feature map size is halved (downsampled)\n", " by a convolutional layer with strides=2, while the number of filter maps is\n", " doubled. Within each stage, the layers have the same number filters and the\n", " same filter map sizes.\n", " Features maps sizes:\n", " conv1 : 32x32, 16\n", " stage 0: 32x32, 64\n", " stage 1: 16x16, 128\n", " stage 2: 8x8, 256\n", "\n", "\n", " # Arguments\n", " input_shape (tensor): shape of input image tensor\n", " depth (int): number of core convolutional layers\n", " num_classes (int): number of classes (CIFAR10 has 10)\n", "\n", " # Returns\n", " model (Model): Keras model instance\n", " \"\"\"\n", " if (depth - 2) % 9 != 0:\n", " raise ValueError('depth should be 9n+2 (eg 56 or 110 in [b])')\n", " # Start model definition.\n", " num_filters_in = 16\n", " num_res_blocks = int((depth - 2) / 9)\n", "\n", " inputs = Input(shape=input_shape)\n", " # v2 performs Conv2D with BN-ReLU on input before splitting into 2 paths\n", " x = resnet_layer(inputs=inputs,\n", " num_filters=num_filters_in,\n", " conv_first=True)\n", "\n", " # Instantiate the stack of residual units\n", " for stage in range(3):\n", " for res_block in range(num_res_blocks):\n", " activation = 'relu'\n", " batch_normalization = True\n", " strides = 1\n", " if stage == 0:\n", " num_filters_out = num_filters_in * 4\n", " if res_block == 0: # first layer and first stage\n", " activation = None\n", " batch_normalization = False\n", "\n", " else:\n", " num_filters_out = num_filters_in * 2\n", " if res_block == 0: # first layer but not first stage\n", " strides = 2 # downsample\n", "\n", " # bottleneck residual unit\n", " y = resnet_layer(inputs=x,\n", " num_filters=num_filters_in,\n", " kernel_size=1,\n", " strides=strides,\n", " activation=activation,\n", " batch_normalization=batch_normalization,\n", " conv_first=False)\n", " y = resnet_layer(inputs=y,\n", " num_filters=num_filters_in,\n", " conv_first=False)\n", " y = resnet_layer(inputs=y,\n", " num_filters=num_filters_out,\n", " kernel_size=1,\n", " conv_first=False)\n", " \n", " if res_block == 0:\n", " # linear projection residual shortcut connection to match\n", " # changed dims\n", " x = resnet_layer(inputs=x,\n", " num_filters=num_filters_out,\n", " kernel_size=1,\n", " strides=strides,\n", " activation=None,\n", " batch_normalization=False)\n", " x = keras.layers.add([x, y])\n", "\n", " num_filters_in = num_filters_out\n", "\n", " # Add classifier on top.\n", " # v2 has BN-ReLU before Pooling\n", " x = BatchNormalization()(x)\n", " x = Activation('relu')(x)\n", " x = AveragePooling2D(pool_size=8)(x)\n", " y = Flatten()(x)\n", " outputs = Dense(num_classes,\n", " activation='softmax',\n", " kernel_initializer='he_normal')(y)\n", "\n", " # Instantiate model.\n", " model = Model(inputs=inputs, outputs=outputs)\n", " return model \n", " \n", " \n", "if version == 2:\n", " model = resnet_v2(input_shape=input_shape, depth=depth)\n", "else:\n", " model = resnet_v1(input_shape=input_shape, depth=depth)\n", "\n", "# use 4 gpus to train the model\n", "model = multi_gpu_model(model, gpus=num_gpus)\n", "model.compile(loss='categorical_crossentropy',\n", " optimizer=Adam(lr=lr_schedule(0)),\n", " metrics=['accuracy'])\n", "model.summary()h\n", "print(model_type)\n", "\n", "# Prepare model model saving directory.\n", "save_dir = os.path.join(os.getcwd(), 'saved_models')\n", "model_name = 'cifar10_%s_model.{epoch:03d}.h5' % model_type\n", "if not os.path.isdir(save_dir):\n", " os.makedirs(save_dir)\n", "filepath = os.path.join(save_dir, model_name)\n", "\n", "# Prepare callbacks for model saving and for learning rate adjustment.\n", "checkpoint = ModelCheckpoint(filepath=filepath,\n", " monitor='val_acc',\n", " verbose=1,\n", " save_best_only=True)\n", "\n", "lr_scheduler = LearningRateScheduler(lr_schedule)\n", "\n", "lr_reducer = ReduceLROnPlateau(factor=np.sqrt(0.1),\n", " cooldown=0,\n", " patience=5,\n", " min_lr=0.5e-6)\n", "\n", "callbacks = [checkpoint, lr_reducer, lr_scheduler]\n", "\n", "# Run training, with or without data augmentation.\n", "if not data_augmentation:\n", " print('Not using data augmentation.')\n", " model.fit(x_train, y_train,\n", " batch_size=batch_size,\n", " epochs=epochs,\n", " validation_data=(x_test, y_test),\n", " shuffle=True,\n", " callbacks=callbacks)\n", "else:\n", " print('Using real-time data augmentation.')\n", " # This will do preprocessing and realtime data augmentation:\n", " datagen = ImageDataGenerator(\n", " # set input mean to 0 over the dataset\n", " featurewise_center=False,\n", " # set each sample mean to 0\n", " samplewise_center=False,\n", " # divide inputs by std of dataset\n", " featurewise_std_normalization=False,\n", " # divide each input by its std\n", " samplewise_std_normalization=False,\n", " # apply ZCA whitening\n", " zca_whitening=False,\n", " # randomly rotate images in the range (deg 0 to 180)\n", " rotation_range=0,\n", " # randomly shift images horizontally\n", " width_shift_range=0.1,\n", " # randomly shift images vertically\n", " height_shift_range=0.1,\n", " # randomly flip images\n", " horizontal_flip=True,\n", " # randomly flip images\n", " vertical_flip=False)\n", "\n", " # Compute quantities required for featurewise normalization\n", " # (std, mean, and principal components if ZCA whitening is applied).\n", " datagen.fit(x_train)\n", "\n", " # Fit the model on the batches generated by datagen.flow().\n", " history = model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),\n", " validation_data=(x_test, y_test),\n", " epochs=epochs, verbose=1, workers=4,\n", " callbacks=callbacks)\n", "\n", "# Score trained model.\n", "scores = model.evaluate(x_test, y_test, verbose=1)\n", "print('Test loss:', scores[0])\n", "print('Test accuracy:', scores[1])\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "def plot_training_history(history):\n", " loss, val_loss = history.history['loss'], history.history['val_loss']\n", " epochs = len(loss)\n", " \n", " fig, axs = plt.subplots(1,2, figsize=(10,5))\n", " axs[0].plot(np.arange(1, epochs + 1), loss, label='train')\n", " axs[0].plot(np.arange(1, epochs + 1), val_loss, label='test')\n", " axs[0].set_xlabel('Epoch number')\n", " axs[0].set_ylabel('Loss')\n", " axs[0].legend(loc=\"best\")\n", "\n", " acc, val_acc = history.history['acc'], history.history['val_acc']\n", " axs[1].plot(np.arange(1, epochs + 1), acc, label='train')\n", " axs[1].plot(np.arange(1, epochs + 1), val_acc, label='test')\n", " axs[1].set_xlabel('Epoch number')\n", " axs[1].set_ylabel('Top-1 Accuracy')\n", " axs[1].legend(loc=\"best\")\n", " \n", " plt.tight_layout()\n", " plt.show()\n", " \n", " \n", "plot_training_history(history)" ] }, { "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.6" } }, "nbformat": 4, "nbformat_minor": 2 }