├── README.md ├── coreml_model └── model_squeezeNet_TSR.mlmodel ├── data.ipynb ├── make_coreml_model.py ├── model.ipynb └── weights ├── model_squeezeNet_TSR.hdf5 └── model_squeezeNet_TSR.json /README.md: -------------------------------------------------------------------------------- 1 | # CoreML-Traffic-Sign-Classifier 2 | This is the German traffic sign classifier project for implementing CoreML. SqueezeNet is used as classifier and Keras2 framework used. 3 | 4 | ## Reference 5 | * https://github.com/DT42/squeezenet_demo 6 | * https://github.com/rcmalli/keras-squeezenet 7 | * https://arxiv.org/pdf/1602.07360.pdf 8 | 9 | ## Dataset 10 | http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset#Downloads 11 | 12 | ## Train 13 | - batch size : 256 14 | - epochs : 1000 (Earlystopping callbacks) 15 | - Data Generator : 16 | ```python 17 | train_datagen = ImageDataGenerator( 18 | featurewise_center=True, 19 | featurewise_std_normalization=True, 20 | rotation_range=20, 21 | width_shift_range=0.2, 22 | height_shift_range=0.2, 23 | horizontal_flip=False) 24 | ``` 25 | 26 | ## Result 27 | * Train loss: 0.0492 28 | * Train accuracy : 0.9866 29 | * Test accuracy : 0.7552 30 | 31 | ## Model 32 | ``` 33 | ____________________________________________________________________________________________________ 34 | Layer (type) Output Shape Param # Connected to 35 | ==================================================================================================== 36 | input_1 (InputLayer) (None, 32, 32, 3) 0 37 | ____________________________________________________________________________________________________ 38 | conv1 (Conv2D) (None, 16, 16, 96) 14208 input_1[0][0] 39 | ____________________________________________________________________________________________________ 40 | maxpool1 (MaxPooling2D) (None, 7, 7, 96) 0 conv1[0][0] 41 | ____________________________________________________________________________________________________ 42 | fire2/squeeze1x1 (Conv2D) (None, 7, 7, 16) 1552 maxpool1[0][0] 43 | ____________________________________________________________________________________________________ 44 | fire2/relu_squeeze1x1 (Activatio (None, 7, 7, 16) 0 fire2/squeeze1x1[0][0] 45 | ____________________________________________________________________________________________________ 46 | fire2/expand1x1 (Conv2D) (None, 7, 7, 64) 1088 fire2/relu_squeeze1x1[0][0] 47 | ____________________________________________________________________________________________________ 48 | fire2/expand3x3 (Conv2D) (None, 7, 7, 64) 9280 fire2/relu_squeeze1x1[0][0] 49 | ____________________________________________________________________________________________________ 50 | fire2/relu_expand1x1 (Activation (None, 7, 7, 64) 0 fire2/expand1x1[0][0] 51 | ____________________________________________________________________________________________________ 52 | fire2/relu_expand3x3 (Activation (None, 7, 7, 64) 0 fire2/expand3x3[0][0] 53 | ____________________________________________________________________________________________________ 54 | fire2/concat (Concatenate) (None, 7, 7, 128) 0 fire2/relu_expand1x1[0][0] 55 | fire2/relu_expand3x3[0][0] 56 | ____________________________________________________________________________________________________ 57 | fire3/squeeze1x1 (Conv2D) (None, 7, 7, 16) 2064 fire2/concat[0][0] 58 | ____________________________________________________________________________________________________ 59 | fire3/relu_squeeze1x1 (Activatio (None, 7, 7, 16) 0 fire3/squeeze1x1[0][0] 60 | ____________________________________________________________________________________________________ 61 | fire3/expand1x1 (Conv2D) (None, 7, 7, 64) 1088 fire3/relu_squeeze1x1[0][0] 62 | ____________________________________________________________________________________________________ 63 | fire3/expand3x3 (Conv2D) (None, 7, 7, 64) 9280 fire3/relu_squeeze1x1[0][0] 64 | ____________________________________________________________________________________________________ 65 | fire3/relu_expand1x1 (Activation (None, 7, 7, 64) 0 fire3/expand1x1[0][0] 66 | ____________________________________________________________________________________________________ 67 | fire3/relu_expand3x3 (Activation (None, 7, 7, 64) 0 fire3/expand3x3[0][0] 68 | ____________________________________________________________________________________________________ 69 | fire3/concat (Concatenate) (None, 7, 7, 128) 0 fire3/relu_expand1x1[0][0] 70 | fire3/relu_expand3x3[0][0] 71 | ____________________________________________________________________________________________________ 72 | fire4/squeeze1x1 (Conv2D) (None, 7, 7, 32) 4128 fire3/concat[0][0] 73 | ____________________________________________________________________________________________________ 74 | fire4/relu_squeeze1x1 (Activatio (None, 7, 7, 32) 0 fire4/squeeze1x1[0][0] 75 | ____________________________________________________________________________________________________ 76 | fire4/expand1x1 (Conv2D) (None, 7, 7, 128) 4224 fire4/relu_squeeze1x1[0][0] 77 | ____________________________________________________________________________________________________ 78 | fire4/expand3x3 (Conv2D) (None, 7, 7, 128) 36992 fire4/relu_squeeze1x1[0][0] 79 | ____________________________________________________________________________________________________ 80 | fire4/relu_expand1x1 (Activation (None, 7, 7, 128) 0 fire4/expand1x1[0][0] 81 | ____________________________________________________________________________________________________ 82 | fire4/relu_expand3x3 (Activation (None, 7, 7, 128) 0 fire4/expand3x3[0][0] 83 | ____________________________________________________________________________________________________ 84 | fire4/concat (Concatenate) (None, 7, 7, 256) 0 fire4/relu_expand1x1[0][0] 85 | fire4/relu_expand3x3[0][0] 86 | ____________________________________________________________________________________________________ 87 | maxpool2 (MaxPooling2D) (None, 3, 3, 256) 0 fire4/concat[0][0] 88 | ____________________________________________________________________________________________________ 89 | fire5/squeeze1x1 (Conv2D) (None, 3, 3, 32) 8224 maxpool2[0][0] 90 | ____________________________________________________________________________________________________ 91 | fire5/relu_squeeze1x1 (Activatio (None, 3, 3, 32) 0 fire5/squeeze1x1[0][0] 92 | ____________________________________________________________________________________________________ 93 | fire5/expand1x1 (Conv2D) (None, 3, 3, 128) 4224 fire5/relu_squeeze1x1[0][0] 94 | ____________________________________________________________________________________________________ 95 | fire5/expand3x3 (Conv2D) (None, 3, 3, 128) 36992 fire5/relu_squeeze1x1[0][0] 96 | ____________________________________________________________________________________________________ 97 | fire5/relu_expand1x1 (Activation (None, 3, 3, 128) 0 fire5/expand1x1[0][0] 98 | ____________________________________________________________________________________________________ 99 | fire5/relu_expand3x3 (Activation (None, 3, 3, 128) 0 fire5/expand3x3[0][0] 100 | ____________________________________________________________________________________________________ 101 | fire5/concat (Concatenate) (None, 3, 3, 256) 0 fire5/relu_expand1x1[0][0] 102 | fire5/relu_expand3x3[0][0] 103 | ____________________________________________________________________________________________________ 104 | fire6/squeeze1x1 (Conv2D) (None, 3, 3, 48) 12336 fire5/concat[0][0] 105 | ____________________________________________________________________________________________________ 106 | fire6/relu_squeeze1x1 (Activatio (None, 3, 3, 48) 0 fire6/squeeze1x1[0][0] 107 | ____________________________________________________________________________________________________ 108 | fire6/expand1x1 (Conv2D) (None, 3, 3, 192) 9408 fire6/relu_squeeze1x1[0][0] 109 | ____________________________________________________________________________________________________ 110 | fire6/expand3x3 (Conv2D) (None, 3, 3, 192) 83136 fire6/relu_squeeze1x1[0][0] 111 | ____________________________________________________________________________________________________ 112 | fire6/relu_expand1x1 (Activation (None, 3, 3, 192) 0 fire6/expand1x1[0][0] 113 | ____________________________________________________________________________________________________ 114 | fire6/relu_expand3x3 (Activation (None, 3, 3, 192) 0 fire6/expand3x3[0][0] 115 | ____________________________________________________________________________________________________ 116 | fire6/concat (Concatenate) (None, 3, 3, 384) 0 fire6/relu_expand1x1[0][0] 117 | fire6/relu_expand3x3[0][0] 118 | ____________________________________________________________________________________________________ 119 | fire7/squeeze1x1 (Conv2D) (None, 3, 3, 48) 18480 fire6/concat[0][0] 120 | ____________________________________________________________________________________________________ 121 | fire7/relu_squeeze1x1 (Activatio (None, 3, 3, 48) 0 fire7/squeeze1x1[0][0] 122 | ____________________________________________________________________________________________________ 123 | fire7/expand1x1 (Conv2D) (None, 3, 3, 192) 9408 fire7/relu_squeeze1x1[0][0] 124 | ____________________________________________________________________________________________________ 125 | fire7/expand3x3 (Conv2D) (None, 3, 3, 192) 83136 fire7/relu_squeeze1x1[0][0] 126 | ____________________________________________________________________________________________________ 127 | fire7/relu_expand1x1 (Activation (None, 3, 3, 192) 0 fire7/expand1x1[0][0] 128 | ____________________________________________________________________________________________________ 129 | fire7/relu_expand3x3 (Activation (None, 3, 3, 192) 0 fire7/expand3x3[0][0] 130 | ____________________________________________________________________________________________________ 131 | fire7/concat (Concatenate) (None, 3, 3, 384) 0 fire7/relu_expand1x1[0][0] 132 | fire7/relu_expand3x3[0][0] 133 | ____________________________________________________________________________________________________ 134 | fire8/squeeze1x1 (Conv2D) (None, 3, 3, 64) 24640 fire7/concat[0][0] 135 | ____________________________________________________________________________________________________ 136 | fire8/relu_squeeze1x1 (Activatio (None, 3, 3, 64) 0 fire8/squeeze1x1[0][0] 137 | ____________________________________________________________________________________________________ 138 | fire8/expand1x1 (Conv2D) (None, 3, 3, 256) 16640 fire8/relu_squeeze1x1[0][0] 139 | ____________________________________________________________________________________________________ 140 | fire8/expand3x3 (Conv2D) (None, 3, 3, 256) 147712 fire8/relu_squeeze1x1[0][0] 141 | ____________________________________________________________________________________________________ 142 | fire8/relu_expand1x1 (Activation (None, 3, 3, 256) 0 fire8/expand1x1[0][0] 143 | ____________________________________________________________________________________________________ 144 | fire8/relu_expand3x3 (Activation (None, 3, 3, 256) 0 fire8/expand3x3[0][0] 145 | ____________________________________________________________________________________________________ 146 | fire8/concat (Concatenate) (None, 3, 3, 512) 0 fire8/relu_expand1x1[0][0] 147 | fire8/relu_expand3x3[0][0] 148 | ____________________________________________________________________________________________________ 149 | maxpool3 (MaxPooling2D) (None, 1, 1, 512) 0 fire8/concat[0][0] 150 | ____________________________________________________________________________________________________ 151 | fire9/squeeze1x1 (Conv2D) (None, 1, 1, 64) 32832 maxpool3[0][0] 152 | ____________________________________________________________________________________________________ 153 | fire9/relu_squeeze1x1 (Activatio (None, 1, 1, 64) 0 fire9/squeeze1x1[0][0] 154 | ____________________________________________________________________________________________________ 155 | fire9/expand1x1 (Conv2D) (None, 1, 1, 256) 16640 fire9/relu_squeeze1x1[0][0] 156 | ____________________________________________________________________________________________________ 157 | fire9/expand3x3 (Conv2D) (None, 1, 1, 256) 147712 fire9/relu_squeeze1x1[0][0] 158 | ____________________________________________________________________________________________________ 159 | fire9/relu_expand1x1 (Activation (None, 1, 1, 256) 0 fire9/expand1x1[0][0] 160 | ____________________________________________________________________________________________________ 161 | fire9/relu_expand3x3 (Activation (None, 1, 1, 256) 0 fire9/expand3x3[0][0] 162 | ____________________________________________________________________________________________________ 163 | fire9/concat (Concatenate) (None, 1, 1, 512) 0 fire9/relu_expand1x1[0][0] 164 | fire9/relu_expand3x3[0][0] 165 | ____________________________________________________________________________________________________ 166 | drop9 (Dropout) (None, 1, 1, 512) 0 fire9/concat[0][0] 167 | ____________________________________________________________________________________________________ 168 | conv10 (Conv2D) (None, 1, 1, 43) 22059 drop9[0][0] 169 | ____________________________________________________________________________________________________ 170 | avgpool10 (GlobalAveragePooling2 (None, 43) 0 conv10[0][0] 171 | ____________________________________________________________________________________________________ 172 | softmax (Activation) (None, 43) 0 avgpool10[0][0] 173 | ==================================================================================================== 174 | Total params: 757,483 175 | Trainable params: 757,483 176 | Non-trainable params: 0 177 | ____________________________________________________________________________________________________ 178 | ``` 179 | -------------------------------------------------------------------------------- /coreml_model/model_squeezeNet_TSR.mlmodel: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaeoh2/CoreML-Traffic-Sign-Classifier/1d999310fc3a23b40db5f01cbaff5fde0ef9505f/coreml_model/model_squeezeNet_TSR.mlmodel -------------------------------------------------------------------------------- /make_coreml_model.py: -------------------------------------------------------------------------------- 1 | # Convert CoreML model 2 | import coremltools 3 | import numpy 4 | from keras.models import model_from_json 5 | from keras.utils import np_utils 6 | 7 | # load json and create model 8 | json_file = open('weights/model_squeezeNet_TSR.json', 'r') 9 | loaded_model_json = json_file.read() 10 | json_file.close() 11 | model = model_from_json(loaded_model_json) 12 | # load weights into new model 13 | model.load_weights("weights/model_squeezeNet_TSR.hdf5") 14 | print("Loaded model from disk") 15 | 16 | coreml_model = coremltools.converters.keras.convert(model) 17 | coreml_model.save("coreml_model/model_squeezeNet_TSR.mlmodel") 18 | -------------------------------------------------------------------------------- /model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "from keras.models import Model\n", 18 | "from keras.layers import Input, Activation, concatenate\n", 19 | "from keras.layers import Flatten, Dropout\n", 20 | "from keras.layers import Conv2D, MaxPool2D\n", 21 | "from keras.layers import GlobalAveragePooling2D\n", 22 | "from keras.optimizers import SGD" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 3, 28 | "metadata": { 29 | "collapsed": true 30 | }, 31 | "outputs": [], 32 | "source": [ 33 | "from keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard\n", 34 | "from keras.utils import to_categorical\n", 35 | "from keras import backend as K" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 4, 41 | "metadata": { 42 | "collapsed": true 43 | }, 44 | "outputs": [], 45 | "source": [ 46 | "import pickle\n", 47 | "from sklearn.model_selection import train_test_split" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "# Model\n", 55 | "## SqueezeNet" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 5, 61 | "metadata": { 62 | "collapsed": true 63 | }, 64 | "outputs": [], 65 | "source": [ 66 | "# Refer from : https://github.com/rcmalli/keras-squeezenet/blob/master/keras_squeezenet/squeezenet.py\n", 67 | "\n", 68 | "sq1x1 = \"squeeze1x1\"\n", 69 | "exp1x1 = \"expand1x1\"\n", 70 | "exp3x3 = \"expand3x3\"\n", 71 | "relu = \"relu_\"\n", 72 | "\n", 73 | "def fire_module(x, fire_id, squeeze=16, expand=64):\n", 74 | " s_id = 'fire' + str(fire_id) + '/'\n", 75 | " x = Conv2D(squeeze, (1,1), padding='valid', name=s_id + sq1x1)(x)\n", 76 | " x = Activation('relu', name=s_id + relu + sq1x1)(x)\n", 77 | " \n", 78 | " left = Conv2D(expand, (1,1), padding='valid', name=s_id + exp1x1)(x)\n", 79 | " left = Activation('relu', name=s_id + relu + exp1x1)(left)\n", 80 | " \n", 81 | " right = Conv2D(expand, (3,3), padding='same', name=s_id + exp3x3)(x)\n", 82 | " right = Activation('relu', name=s_id + relu + exp3x3)(right)\n", 83 | " \n", 84 | " #x = add([left, right], name=s_id + 'concat')\n", 85 | " x = concatenate([left, right], axis=3, name=s_id + 'concat')\n", 86 | " \n", 87 | " return x\n", 88 | " " 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 6, 94 | "metadata": { 95 | "collapsed": true 96 | }, 97 | "outputs": [], 98 | "source": [ 99 | "# Refer from : https://github.com/DT42/squeezenet_demo/blob/master/model.py\n", 100 | "\n", 101 | "def squeezeNet(nb_classes, input_shape=(32,32,3)):\n", 102 | " inputs = Input((input_shape))\n", 103 | " x = Conv2D(96, (7,7), activation='relu', strides=(2,2), padding='same', name='conv1')(inputs)\n", 104 | " x = MaxPool2D(pool_size=(3,3), strides=(2,2), name='maxpool1')(x)\n", 105 | " \n", 106 | " x = fire_module(x, fire_id=2, squeeze=16, expand=64)\n", 107 | " x = fire_module(x, fire_id=3, squeeze=16, expand=64)\n", 108 | " x = fire_module(x, fire_id=4, squeeze=32, expand=128)\n", 109 | " x = MaxPool2D(pool_size=(3,3), strides=(2,2), name='maxpool2')(x)\n", 110 | " \n", 111 | " x = fire_module(x, fire_id=5, squeeze=32, expand=128)\n", 112 | " x = fire_module(x, fire_id=6, squeeze=48, expand=192)\n", 113 | " x = fire_module(x, fire_id=7, squeeze=48, expand=192)\n", 114 | " x = fire_module(x, fire_id=8, squeeze=64, expand=256)\n", 115 | " x = MaxPool2D(pool_size=(3,3), strides=(2,2), name='maxpool3')(x)\n", 116 | " \n", 117 | " x = fire_module(x, fire_id=9, squeeze=64, expand=256)\n", 118 | " \n", 119 | " x = Dropout(0.5, name='drop9')(x)\n", 120 | " \n", 121 | " x = Conv2D(nb_classes, (1,1), activation='relu', padding='valid', name='conv10')(x)\n", 122 | " x = GlobalAveragePooling2D(name='avgpool10')(x)\n", 123 | " \n", 124 | " softmax = Activation(\"softmax\", name='softmax')(x)\n", 125 | " \n", 126 | " model = Model(inputs=inputs, outputs=softmax)\n", 127 | " model.summary()\n", 128 | " sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)\n", 129 | " model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])\n", 130 | " \n", 131 | " return model\n", 132 | " " 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 7, 138 | "metadata": { 139 | "scrolled": true 140 | }, 141 | "outputs": [ 142 | { 143 | "name": "stdout", 144 | "output_type": "stream", 145 | "text": [ 146 | "____________________________________________________________________________________________________\n", 147 | "Layer (type) Output Shape Param # Connected to \n", 148 | "====================================================================================================\n", 149 | "input_1 (InputLayer) (None, 32, 32, 3) 0 \n", 150 | "____________________________________________________________________________________________________\n", 151 | "conv1 (Conv2D) (None, 16, 16, 96) 14208 input_1[0][0] \n", 152 | "____________________________________________________________________________________________________\n", 153 | "maxpool1 (MaxPooling2D) (None, 7, 7, 96) 0 conv1[0][0] \n", 154 | "____________________________________________________________________________________________________\n", 155 | "fire2/squeeze1x1 (Conv2D) (None, 7, 7, 16) 1552 maxpool1[0][0] \n", 156 | "____________________________________________________________________________________________________\n", 157 | "fire2/relu_squeeze1x1 (Activatio (None, 7, 7, 16) 0 fire2/squeeze1x1[0][0] \n", 158 | "____________________________________________________________________________________________________\n", 159 | "fire2/expand1x1 (Conv2D) (None, 7, 7, 64) 1088 fire2/relu_squeeze1x1[0][0] \n", 160 | "____________________________________________________________________________________________________\n", 161 | "fire2/expand3x3 (Conv2D) (None, 7, 7, 64) 9280 fire2/relu_squeeze1x1[0][0] \n", 162 | "____________________________________________________________________________________________________\n", 163 | "fire2/relu_expand1x1 (Activation (None, 7, 7, 64) 0 fire2/expand1x1[0][0] \n", 164 | "____________________________________________________________________________________________________\n", 165 | "fire2/relu_expand3x3 (Activation (None, 7, 7, 64) 0 fire2/expand3x3[0][0] \n", 166 | "____________________________________________________________________________________________________\n", 167 | "fire2/concat (Concatenate) (None, 7, 7, 128) 0 fire2/relu_expand1x1[0][0] \n", 168 | " fire2/relu_expand3x3[0][0] \n", 169 | "____________________________________________________________________________________________________\n", 170 | "fire3/squeeze1x1 (Conv2D) (None, 7, 7, 16) 2064 fire2/concat[0][0] \n", 171 | "____________________________________________________________________________________________________\n", 172 | "fire3/relu_squeeze1x1 (Activatio (None, 7, 7, 16) 0 fire3/squeeze1x1[0][0] \n", 173 | "____________________________________________________________________________________________________\n", 174 | "fire3/expand1x1 (Conv2D) (None, 7, 7, 64) 1088 fire3/relu_squeeze1x1[0][0] \n", 175 | "____________________________________________________________________________________________________\n", 176 | "fire3/expand3x3 (Conv2D) (None, 7, 7, 64) 9280 fire3/relu_squeeze1x1[0][0] \n", 177 | "____________________________________________________________________________________________________\n", 178 | "fire3/relu_expand1x1 (Activation (None, 7, 7, 64) 0 fire3/expand1x1[0][0] \n", 179 | "____________________________________________________________________________________________________\n", 180 | "fire3/relu_expand3x3 (Activation (None, 7, 7, 64) 0 fire3/expand3x3[0][0] \n", 181 | "____________________________________________________________________________________________________\n", 182 | "fire3/concat (Concatenate) (None, 7, 7, 128) 0 fire3/relu_expand1x1[0][0] \n", 183 | " fire3/relu_expand3x3[0][0] \n", 184 | "____________________________________________________________________________________________________\n", 185 | "fire4/squeeze1x1 (Conv2D) (None, 7, 7, 32) 4128 fire3/concat[0][0] \n", 186 | "____________________________________________________________________________________________________\n", 187 | "fire4/relu_squeeze1x1 (Activatio (None, 7, 7, 32) 0 fire4/squeeze1x1[0][0] \n", 188 | "____________________________________________________________________________________________________\n", 189 | "fire4/expand1x1 (Conv2D) (None, 7, 7, 128) 4224 fire4/relu_squeeze1x1[0][0] \n", 190 | "____________________________________________________________________________________________________\n", 191 | "fire4/expand3x3 (Conv2D) (None, 7, 7, 128) 36992 fire4/relu_squeeze1x1[0][0] \n", 192 | "____________________________________________________________________________________________________\n", 193 | "fire4/relu_expand1x1 (Activation (None, 7, 7, 128) 0 fire4/expand1x1[0][0] \n", 194 | "____________________________________________________________________________________________________\n", 195 | "fire4/relu_expand3x3 (Activation (None, 7, 7, 128) 0 fire4/expand3x3[0][0] \n", 196 | "____________________________________________________________________________________________________\n", 197 | "fire4/concat (Concatenate) (None, 7, 7, 256) 0 fire4/relu_expand1x1[0][0] \n", 198 | " fire4/relu_expand3x3[0][0] \n", 199 | "____________________________________________________________________________________________________\n", 200 | "maxpool2 (MaxPooling2D) (None, 3, 3, 256) 0 fire4/concat[0][0] \n", 201 | "____________________________________________________________________________________________________\n", 202 | "fire5/squeeze1x1 (Conv2D) (None, 3, 3, 32) 8224 maxpool2[0][0] \n", 203 | "____________________________________________________________________________________________________\n", 204 | "fire5/relu_squeeze1x1 (Activatio (None, 3, 3, 32) 0 fire5/squeeze1x1[0][0] \n", 205 | "____________________________________________________________________________________________________\n", 206 | "fire5/expand1x1 (Conv2D) (None, 3, 3, 128) 4224 fire5/relu_squeeze1x1[0][0] \n", 207 | "____________________________________________________________________________________________________\n", 208 | "fire5/expand3x3 (Conv2D) (None, 3, 3, 128) 36992 fire5/relu_squeeze1x1[0][0] \n", 209 | "____________________________________________________________________________________________________\n", 210 | "fire5/relu_expand1x1 (Activation (None, 3, 3, 128) 0 fire5/expand1x1[0][0] \n", 211 | "____________________________________________________________________________________________________\n", 212 | "fire5/relu_expand3x3 (Activation (None, 3, 3, 128) 0 fire5/expand3x3[0][0] \n", 213 | "____________________________________________________________________________________________________\n", 214 | "fire5/concat (Concatenate) (None, 3, 3, 256) 0 fire5/relu_expand1x1[0][0] \n", 215 | " fire5/relu_expand3x3[0][0] \n", 216 | "____________________________________________________________________________________________________\n", 217 | "fire6/squeeze1x1 (Conv2D) (None, 3, 3, 48) 12336 fire5/concat[0][0] \n", 218 | "____________________________________________________________________________________________________\n", 219 | "fire6/relu_squeeze1x1 (Activatio (None, 3, 3, 48) 0 fire6/squeeze1x1[0][0] \n", 220 | "____________________________________________________________________________________________________\n", 221 | "fire6/expand1x1 (Conv2D) (None, 3, 3, 192) 9408 fire6/relu_squeeze1x1[0][0] \n", 222 | "____________________________________________________________________________________________________\n", 223 | "fire6/expand3x3 (Conv2D) (None, 3, 3, 192) 83136 fire6/relu_squeeze1x1[0][0] \n", 224 | "____________________________________________________________________________________________________\n", 225 | "fire6/relu_expand1x1 (Activation (None, 3, 3, 192) 0 fire6/expand1x1[0][0] \n", 226 | "____________________________________________________________________________________________________\n", 227 | "fire6/relu_expand3x3 (Activation (None, 3, 3, 192) 0 fire6/expand3x3[0][0] \n", 228 | "____________________________________________________________________________________________________\n", 229 | "fire6/concat (Concatenate) (None, 3, 3, 384) 0 fire6/relu_expand1x1[0][0] \n", 230 | " fire6/relu_expand3x3[0][0] \n", 231 | "____________________________________________________________________________________________________\n", 232 | "fire7/squeeze1x1 (Conv2D) (None, 3, 3, 48) 18480 fire6/concat[0][0] \n", 233 | "____________________________________________________________________________________________________\n", 234 | "fire7/relu_squeeze1x1 (Activatio (None, 3, 3, 48) 0 fire7/squeeze1x1[0][0] \n", 235 | "____________________________________________________________________________________________________\n", 236 | "fire7/expand1x1 (Conv2D) (None, 3, 3, 192) 9408 fire7/relu_squeeze1x1[0][0] \n", 237 | "____________________________________________________________________________________________________\n", 238 | "fire7/expand3x3 (Conv2D) (None, 3, 3, 192) 83136 fire7/relu_squeeze1x1[0][0] \n", 239 | "____________________________________________________________________________________________________\n", 240 | "fire7/relu_expand1x1 (Activation (None, 3, 3, 192) 0 fire7/expand1x1[0][0] \n", 241 | "____________________________________________________________________________________________________\n", 242 | "fire7/relu_expand3x3 (Activation (None, 3, 3, 192) 0 fire7/expand3x3[0][0] \n", 243 | "____________________________________________________________________________________________________\n", 244 | "fire7/concat (Concatenate) (None, 3, 3, 384) 0 fire7/relu_expand1x1[0][0] \n", 245 | " fire7/relu_expand3x3[0][0] \n", 246 | "____________________________________________________________________________________________________\n", 247 | "fire8/squeeze1x1 (Conv2D) (None, 3, 3, 64) 24640 fire7/concat[0][0] \n", 248 | "____________________________________________________________________________________________________\n", 249 | "fire8/relu_squeeze1x1 (Activatio (None, 3, 3, 64) 0 fire8/squeeze1x1[0][0] \n", 250 | "____________________________________________________________________________________________________\n", 251 | "fire8/expand1x1 (Conv2D) (None, 3, 3, 256) 16640 fire8/relu_squeeze1x1[0][0] \n", 252 | "____________________________________________________________________________________________________\n", 253 | "fire8/expand3x3 (Conv2D) (None, 3, 3, 256) 147712 fire8/relu_squeeze1x1[0][0] \n", 254 | "____________________________________________________________________________________________________\n", 255 | "fire8/relu_expand1x1 (Activation (None, 3, 3, 256) 0 fire8/expand1x1[0][0] \n", 256 | "____________________________________________________________________________________________________\n", 257 | "fire8/relu_expand3x3 (Activation (None, 3, 3, 256) 0 fire8/expand3x3[0][0] \n", 258 | "____________________________________________________________________________________________________\n", 259 | "fire8/concat (Concatenate) (None, 3, 3, 512) 0 fire8/relu_expand1x1[0][0] \n", 260 | " fire8/relu_expand3x3[0][0] \n", 261 | "____________________________________________________________________________________________________\n", 262 | "maxpool3 (MaxPooling2D) (None, 1, 1, 512) 0 fire8/concat[0][0] \n", 263 | "____________________________________________________________________________________________________\n", 264 | "fire9/squeeze1x1 (Conv2D) (None, 1, 1, 64) 32832 maxpool3[0][0] \n", 265 | "____________________________________________________________________________________________________\n", 266 | "fire9/relu_squeeze1x1 (Activatio (None, 1, 1, 64) 0 fire9/squeeze1x1[0][0] \n", 267 | "____________________________________________________________________________________________________\n", 268 | "fire9/expand1x1 (Conv2D) (None, 1, 1, 256) 16640 fire9/relu_squeeze1x1[0][0] \n", 269 | "____________________________________________________________________________________________________\n", 270 | "fire9/expand3x3 (Conv2D) (None, 1, 1, 256) 147712 fire9/relu_squeeze1x1[0][0] \n", 271 | "____________________________________________________________________________________________________\n", 272 | "fire9/relu_expand1x1 (Activation (None, 1, 1, 256) 0 fire9/expand1x1[0][0] \n", 273 | "____________________________________________________________________________________________________\n", 274 | "fire9/relu_expand3x3 (Activation (None, 1, 1, 256) 0 fire9/expand3x3[0][0] \n", 275 | "____________________________________________________________________________________________________\n", 276 | "fire9/concat (Concatenate) (None, 1, 1, 512) 0 fire9/relu_expand1x1[0][0] \n", 277 | " fire9/relu_expand3x3[0][0] \n", 278 | "____________________________________________________________________________________________________\n", 279 | "drop9 (Dropout) (None, 1, 1, 512) 0 fire9/concat[0][0] \n", 280 | "____________________________________________________________________________________________________\n", 281 | "conv10 (Conv2D) (None, 1, 1, 43) 22059 drop9[0][0] \n", 282 | "____________________________________________________________________________________________________\n", 283 | "avgpool10 (GlobalAveragePooling2 (None, 43) 0 conv10[0][0] \n", 284 | "____________________________________________________________________________________________________\n", 285 | "softmax (Activation) (None, 43) 0 avgpool10[0][0] \n", 286 | "====================================================================================================\n", 287 | "Total params: 757,483\n", 288 | "Trainable params: 757,483\n", 289 | "Non-trainable params: 0\n", 290 | "____________________________________________________________________________________________________\n" 291 | ] 292 | } 293 | ], 294 | "source": [ 295 | "model = squeezeNet(nb_classes=43)" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 19, 301 | "metadata": { 302 | "collapsed": true 303 | }, 304 | "outputs": [], 305 | "source": [ 306 | "model_checkpoint = ModelCheckpoint('weights/model_squeezeNet_TSR.hdf5', monitor='val_loss', save_best_only=True)\n", 307 | "model_earlystopping = EarlyStopping(monitor='val_loss',patience=5)" 308 | ] 309 | }, 310 | { 311 | "cell_type": "markdown", 312 | "metadata": {}, 313 | "source": [ 314 | "# Train and Test Model" 315 | ] 316 | }, 317 | { 318 | "cell_type": "code", 319 | "execution_count": 20, 320 | "metadata": {}, 321 | "outputs": [], 322 | "source": [ 323 | "training_path = \"./dataset/Final_Training/\"\n", 324 | "test_path = \"./dataset/Final_Test/\"\n", 325 | "\n", 326 | "train_file = training_path + \"train.p\"\n", 327 | "test_file = test_path + \"test.p\"\n", 328 | "\n", 329 | "num_classes = 43\n", 330 | "batch_size = 256\n", 331 | "epochs = 500\n", 332 | "\n", 333 | "with open(train_file, mode='rb') as f:\n", 334 | " X, y = pickle.load(f)\n", 335 | "with open(test_file, mode='rb') as f:\n", 336 | " X_test, y_test = pickle.load(f)" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 21, 342 | "metadata": { 343 | "collapsed": true 344 | }, 345 | "outputs": [], 346 | "source": [ 347 | "X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=88)" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "execution_count": 22, 353 | "metadata": { 354 | "collapsed": true 355 | }, 356 | "outputs": [], 357 | "source": [ 358 | "from keras.utils import np_utils\n", 359 | "y_train = np_utils.to_categorical(y_train, num_classes)\n", 360 | "y_valid = np_utils.to_categorical(y_valid, num_classes)\n", 361 | "y_test = np_utils.to_categorical(y_test, num_classes)" 362 | ] 363 | }, 364 | { 365 | "cell_type": "code", 366 | "execution_count": 23, 367 | "metadata": { 368 | "collapsed": true 369 | }, 370 | "outputs": [], 371 | "source": [ 372 | "## Data Augmentation using Keras\n", 373 | "from keras.preprocessing.image import ImageDataGenerator\n", 374 | "\n", 375 | "train_datagen = ImageDataGenerator(\n", 376 | " featurewise_center=True,\n", 377 | " featurewise_std_normalization=True,\n", 378 | " rotation_range=20,\n", 379 | " width_shift_range=0.2,\n", 380 | " height_shift_range=0.2,\n", 381 | " shear_range=0.2,\n", 382 | " zoom_range=0.2,\n", 383 | " horizontal_flip=False)\n", 384 | "\n", 385 | "valid_datagen = ImageDataGenerator(\n", 386 | " featurewise_center=True,\n", 387 | " featurewise_std_normalization=True,\n", 388 | " rotation_range=20,\n", 389 | " width_shift_range=0.2,\n", 390 | " height_shift_range=0.2,\n", 391 | " shear_range=0.2,\n", 392 | " zoom_range=0.2,\n", 393 | " horizontal_flip=False)\n", 394 | "# compute quantities required for featurewise normalization\n", 395 | "# (std, mean, and principal components if ZCA whitening is applied)\n", 396 | "train_datagen.fit(X_train)\n", 397 | "valid_datagen.fit(X_valid)\n", 398 | "\n", 399 | "test_datagen = ImageDataGenerator(rescale=1./255)" 400 | ] 401 | }, 402 | { 403 | "cell_type": "code", 404 | "execution_count": 28, 405 | "metadata": { 406 | "scrolled": true 407 | }, 408 | "outputs": [ 409 | { 410 | "name": "stdout", 411 | "output_type": "stream", 412 | "text": [ 413 | "Epoch 1/500\n", 414 | "123/122 [==============================] - 13s - loss: 0.0978 - acc: 0.9710 - val_loss: 0.1068 - val_acc: 0.9697\n", 415 | "Epoch 2/500\n", 416 | "123/122 [==============================] - 13s - loss: 0.0914 - acc: 0.9733 - val_loss: 0.0969 - val_acc: 0.9708\n", 417 | "Epoch 3/500\n", 418 | "123/122 [==============================] - 13s - loss: 0.0958 - acc: 0.9725 - val_loss: 0.0864 - val_acc: 0.9722\n", 419 | "Epoch 4/500\n", 420 | "123/122 [==============================] - 12s - loss: 0.0907 - acc: 0.9730 - val_loss: 0.1010 - val_acc: 0.9719\n", 421 | "Epoch 5/500\n", 422 | "123/122 [==============================] - 13s - loss: 0.0890 - acc: 0.9730 - val_loss: 0.0943 - val_acc: 0.9736\n", 423 | "Epoch 6/500\n", 424 | "123/122 [==============================] - 13s - loss: 0.0884 - acc: 0.9723 - val_loss: 0.1336 - val_acc: 0.9612\n", 425 | "Epoch 7/500\n", 426 | "123/122 [==============================] - 13s - loss: 0.0935 - acc: 0.9724 - val_loss: 0.0882 - val_acc: 0.9726\n", 427 | "Epoch 8/500\n", 428 | "123/122 [==============================] - 13s - loss: 0.0914 - acc: 0.9738 - val_loss: 0.0702 - val_acc: 0.9787\n", 429 | "Epoch 9/500\n", 430 | "123/122 [==============================] - 13s - loss: 0.0852 - acc: 0.9753 - val_loss: 0.1014 - val_acc: 0.9691\n", 431 | "Epoch 10/500\n", 432 | "123/122 [==============================] - 13s - loss: 0.0794 - acc: 0.9745 - val_loss: 0.0968 - val_acc: 0.9711\n", 433 | "Epoch 11/500\n", 434 | "123/122 [==============================] - 13s - loss: 0.0891 - acc: 0.9747 - val_loss: 0.1550 - val_acc: 0.9566\n", 435 | "Epoch 12/500\n", 436 | "123/122 [==============================] - 13s - loss: 0.0982 - acc: 0.9722 - val_loss: 0.0786 - val_acc: 0.9779\n", 437 | "Epoch 13/500\n", 438 | "123/122 [==============================] - 13s - loss: 0.0860 - acc: 0.9750 - val_loss: 0.0938 - val_acc: 0.9714\n", 439 | "Epoch 14/500\n", 440 | "123/122 [==============================] - 13s - loss: 0.0823 - acc: 0.9761 - val_loss: 0.0849 - val_acc: 0.9739\n" 441 | ] 442 | }, 443 | { 444 | "data": { 445 | "text/plain": [ 446 | "" 447 | ] 448 | }, 449 | "execution_count": 28, 450 | "metadata": {}, 451 | "output_type": "execute_result" 452 | } 453 | ], 454 | "source": [ 455 | "model.fit_generator(train_datagen.flow(X_train, y_train, batch_size=batch_size),\n", 456 | " validation_data=valid_datagen.flow(X_valid, y_valid, batch_size=batch_size),\n", 457 | " validation_steps=len(X_valid)/batch_size,\n", 458 | " steps_per_epoch=len(X_train)/batch_size,\n", 459 | " epochs=epochs,\n", 460 | " callbacks=[model_checkpoint, model_earlystopping])" 461 | ] 462 | }, 463 | { 464 | "cell_type": "code", 465 | "execution_count": 29, 466 | "metadata": {}, 467 | "outputs": [ 468 | { 469 | "name": "stdout", 470 | "output_type": "stream", 471 | "text": [ 472 | "Accuracy = 0.7058\n" 473 | ] 474 | } 475 | ], 476 | "source": [ 477 | "scores = model.evaluate_generator(test_datagen.flow(X_test, y_test, batch_size=batch_size*2), steps=len(X_test)/batch_size)\n", 478 | "#print(\"Accuracy = {:0.2f}\".format(scores[1]))\n", 479 | "print(\"Accuracy = {:0.4f}\".format(scores[1]))" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 31, 485 | "metadata": { 486 | "collapsed": true 487 | }, 488 | "outputs": [], 489 | "source": [ 490 | "model_json = model.to_json()\n", 491 | "with open(\"weights/model_squeezeNet_TSR.json\", \"w\") as json_file:\n", 492 | " json_file.write(model_json)\n", 493 | "# serialize weights to HDF5" 494 | ] 495 | }, 496 | { 497 | "cell_type": "code", 498 | "execution_count": null, 499 | "metadata": { 500 | "collapsed": true 501 | }, 502 | "outputs": [], 503 | "source": [] 504 | } 505 | ], 506 | "metadata": { 507 | "kernelspec": { 508 | "display_name": "Python 3", 509 | "language": "python", 510 | "name": "python3" 511 | }, 512 | "language_info": { 513 | "codemirror_mode": { 514 | "name": "ipython", 515 | "version": 3 516 | }, 517 | "file_extension": ".py", 518 | "mimetype": "text/x-python", 519 | "name": "python", 520 | "nbconvert_exporter": "python", 521 | "pygments_lexer": "ipython3", 522 | "version": "3.5.2" 523 | } 524 | }, 525 | "nbformat": 4, 526 | "nbformat_minor": 2 527 | } 528 | -------------------------------------------------------------------------------- /weights/model_squeezeNet_TSR.hdf5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaeoh2/CoreML-Traffic-Sign-Classifier/1d999310fc3a23b40db5f01cbaff5fde0ef9505f/weights/model_squeezeNet_TSR.hdf5 -------------------------------------------------------------------------------- /weights/model_squeezeNet_TSR.json: -------------------------------------------------------------------------------- 1 | {"keras_version": "2.0.8", "class_name": "Model", "config": {"name": "model_1", "input_layers": [["input_1", 0, 0]], "layers": [{"inbound_nodes": [], "name": "input_1", "class_name": "InputLayer", "config": {"name": "input_1", "batch_input_shape": [null, 32, 32, 3], "dtype": "float32", "sparse": false}}, {"inbound_nodes": [[["input_1", 0, 0, {}]]], "name": "conv1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [2, 2], "data_format": "channels_last", "name": "conv1", "filters": 96, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [7, 7], "trainable": true, "bias_constraint": null, "activation": "relu", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["conv1", 0, 0, {}]]], "name": "maxpool1", "class_name": "MaxPooling2D", "config": {"padding": "valid", "pool_size": [3, 3], "strides": [2, 2], "trainable": true, "data_format": "channels_last", "name": "maxpool1"}}, {"inbound_nodes": [[["maxpool1", 0, 0, {}]]], "name": "fire2/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire2/squeeze1x1", "filters": 16, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire2/squeeze1x1", 0, 0, {}]]], "name": "fire2/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire2/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire2/relu_squeeze1x1", 0, 0, {}]]], "name": "fire2/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire2/expand1x1", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire2/relu_squeeze1x1", 0, 0, {}]]], "name": "fire2/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire2/expand3x3", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire2/expand1x1", 0, 0, {}]]], "name": "fire2/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire2/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire2/expand3x3", 0, 0, {}]]], "name": "fire2/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire2/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire2/relu_expand1x1", 0, 0, {}], ["fire2/relu_expand3x3", 0, 0, {}]]], "name": "fire2/concat", "class_name": "Concatenate", "config": {"name": "fire2/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire2/concat", 0, 0, {}]]], "name": "fire3/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire3/squeeze1x1", "filters": 16, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire3/squeeze1x1", 0, 0, {}]]], "name": "fire3/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire3/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire3/relu_squeeze1x1", 0, 0, {}]]], "name": "fire3/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire3/expand1x1", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire3/relu_squeeze1x1", 0, 0, {}]]], "name": "fire3/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire3/expand3x3", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire3/expand1x1", 0, 0, {}]]], "name": "fire3/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire3/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire3/expand3x3", 0, 0, {}]]], "name": "fire3/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire3/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire3/relu_expand1x1", 0, 0, {}], ["fire3/relu_expand3x3", 0, 0, {}]]], "name": "fire3/concat", "class_name": "Concatenate", "config": {"name": "fire3/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire3/concat", 0, 0, {}]]], "name": "fire4/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire4/squeeze1x1", "filters": 32, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire4/squeeze1x1", 0, 0, {}]]], "name": "fire4/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire4/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire4/relu_squeeze1x1", 0, 0, {}]]], "name": "fire4/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire4/expand1x1", "filters": 128, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire4/relu_squeeze1x1", 0, 0, {}]]], "name": "fire4/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire4/expand3x3", "filters": 128, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire4/expand1x1", 0, 0, {}]]], "name": "fire4/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire4/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire4/expand3x3", 0, 0, {}]]], "name": "fire4/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire4/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire4/relu_expand1x1", 0, 0, {}], ["fire4/relu_expand3x3", 0, 0, {}]]], "name": "fire4/concat", "class_name": "Concatenate", "config": {"name": "fire4/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire4/concat", 0, 0, {}]]], "name": "maxpool2", "class_name": "MaxPooling2D", "config": {"padding": "valid", "pool_size": [3, 3], "strides": [2, 2], "trainable": true, "data_format": "channels_last", "name": "maxpool2"}}, {"inbound_nodes": [[["maxpool2", 0, 0, {}]]], "name": "fire5/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire5/squeeze1x1", "filters": 32, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire5/squeeze1x1", 0, 0, {}]]], "name": "fire5/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire5/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire5/relu_squeeze1x1", 0, 0, {}]]], "name": "fire5/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire5/expand1x1", "filters": 128, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire5/relu_squeeze1x1", 0, 0, {}]]], "name": "fire5/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire5/expand3x3", "filters": 128, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire5/expand1x1", 0, 0, {}]]], "name": "fire5/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire5/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire5/expand3x3", 0, 0, {}]]], "name": "fire5/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire5/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire5/relu_expand1x1", 0, 0, {}], ["fire5/relu_expand3x3", 0, 0, {}]]], "name": "fire5/concat", "class_name": "Concatenate", "config": {"name": "fire5/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire5/concat", 0, 0, {}]]], "name": "fire6/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire6/squeeze1x1", "filters": 48, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire6/squeeze1x1", 0, 0, {}]]], "name": "fire6/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire6/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire6/relu_squeeze1x1", 0, 0, {}]]], "name": "fire6/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire6/expand1x1", "filters": 192, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire6/relu_squeeze1x1", 0, 0, {}]]], "name": "fire6/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire6/expand3x3", "filters": 192, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire6/expand1x1", 0, 0, {}]]], "name": "fire6/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire6/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire6/expand3x3", 0, 0, {}]]], "name": "fire6/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire6/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire6/relu_expand1x1", 0, 0, {}], ["fire6/relu_expand3x3", 0, 0, {}]]], "name": "fire6/concat", "class_name": "Concatenate", "config": {"name": "fire6/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire6/concat", 0, 0, {}]]], "name": "fire7/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire7/squeeze1x1", "filters": 48, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire7/squeeze1x1", 0, 0, {}]]], "name": "fire7/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire7/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire7/relu_squeeze1x1", 0, 0, {}]]], "name": "fire7/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire7/expand1x1", "filters": 192, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire7/relu_squeeze1x1", 0, 0, {}]]], "name": "fire7/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire7/expand3x3", "filters": 192, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire7/expand1x1", 0, 0, {}]]], "name": "fire7/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire7/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire7/expand3x3", 0, 0, {}]]], "name": "fire7/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire7/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire7/relu_expand1x1", 0, 0, {}], ["fire7/relu_expand3x3", 0, 0, {}]]], "name": "fire7/concat", "class_name": "Concatenate", "config": {"name": "fire7/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire7/concat", 0, 0, {}]]], "name": "fire8/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire8/squeeze1x1", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire8/squeeze1x1", 0, 0, {}]]], "name": "fire8/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire8/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire8/relu_squeeze1x1", 0, 0, {}]]], "name": "fire8/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire8/expand1x1", "filters": 256, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire8/relu_squeeze1x1", 0, 0, {}]]], "name": "fire8/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire8/expand3x3", "filters": 256, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire8/expand1x1", 0, 0, {}]]], "name": "fire8/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire8/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire8/expand3x3", 0, 0, {}]]], "name": "fire8/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire8/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire8/relu_expand1x1", 0, 0, {}], ["fire8/relu_expand3x3", 0, 0, {}]]], "name": "fire8/concat", "class_name": "Concatenate", "config": {"name": "fire8/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire8/concat", 0, 0, {}]]], "name": "maxpool3", "class_name": "MaxPooling2D", "config": {"padding": "valid", "pool_size": [3, 3], "strides": [2, 2], "trainable": true, "data_format": "channels_last", "name": "maxpool3"}}, {"inbound_nodes": [[["maxpool3", 0, 0, {}]]], "name": "fire9/squeeze1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire9/squeeze1x1", "filters": 64, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire9/squeeze1x1", 0, 0, {}]]], "name": "fire9/relu_squeeze1x1", "class_name": "Activation", "config": {"name": "fire9/relu_squeeze1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire9/relu_squeeze1x1", 0, 0, {}]]], "name": "fire9/expand1x1", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire9/expand1x1", "filters": 256, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire9/relu_squeeze1x1", 0, 0, {}]]], "name": "fire9/expand3x3", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "fire9/expand3x3", "filters": 256, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "same", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [3, 3], "trainable": true, "bias_constraint": null, "activation": "linear", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["fire9/expand1x1", 0, 0, {}]]], "name": "fire9/relu_expand1x1", "class_name": "Activation", "config": {"name": "fire9/relu_expand1x1", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire9/expand3x3", 0, 0, {}]]], "name": "fire9/relu_expand3x3", "class_name": "Activation", "config": {"name": "fire9/relu_expand3x3", "trainable": true, "activation": "relu"}}, {"inbound_nodes": [[["fire9/relu_expand1x1", 0, 0, {}], ["fire9/relu_expand3x3", 0, 0, {}]]], "name": "fire9/concat", "class_name": "Concatenate", "config": {"name": "fire9/concat", "trainable": true, "axis": 3}}, {"inbound_nodes": [[["fire9/concat", 0, 0, {}]]], "name": "drop9", "class_name": "Dropout", "config": {"name": "drop9", "rate": 0.5, "trainable": true}}, {"inbound_nodes": [[["drop9", 0, 0, {}]]], "name": "conv10", "class_name": "Conv2D", "config": {"bias_regularizer": null, "use_bias": true, "strides": [1, 1], "data_format": "channels_last", "name": "conv10", "filters": 43, "bias_initializer": {"class_name": "Zeros", "config": {}}, "kernel_initializer": {"class_name": "VarianceScaling", "config": {"mode": "fan_avg", "scale": 1.0, "seed": null, "distribution": "uniform"}}, "padding": "valid", "kernel_regularizer": null, "dilation_rate": [1, 1], "kernel_size": [1, 1], "trainable": true, "bias_constraint": null, "activation": "relu", "kernel_constraint": null, "activity_regularizer": null}}, {"inbound_nodes": [[["conv10", 0, 0, {}]]], "name": "avgpool10", "class_name": "GlobalAveragePooling2D", "config": {"name": "avgpool10", "trainable": true, "data_format": "channels_last"}}, {"inbound_nodes": [[["avgpool10", 0, 0, {}]]], "name": "softmax", "class_name": "Activation", "config": {"name": "softmax", "trainable": true, "activation": "softmax"}}], "output_layers": [["softmax", 0, 0]]}, "backend": "tensorflow"} --------------------------------------------------------------------------------