├── AlexNet.ipynb ├── AlexNet.png ├── DenseNet.ipynb ├── Inception.ipynb ├── LeNet5.ipynb ├── LeNet_Dropout.ipynb ├── MobileNetV1_CPU.ipynb ├── MobileNetV1_GPU.ipynb ├── NIN.ipynb ├── README.md ├── SqueezeNet.ipynb ├── VGG.ipynb ├── denseNet.png ├── inception_net.png └── squeeze_net.png /AlexNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senliuy/CNN-Structures/f717d728245f4a668e7522939feadd8077a0712a/AlexNet.png -------------------------------------------------------------------------------- /LeNet5.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/usr/local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 13 | " from ._conv import register_converters as _register_converters\n", 14 | "Using TensorFlow backend.\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "from keras.datasets import mnist\n", 20 | "from keras.layers import Flatten, Conv2D, MaxPool2D, Dense\n", 21 | "from keras.models import Sequential\n", 22 | "from keras.optimizers import SGD\n", 23 | "from keras.utils import plot_model, to_categorical\n", 24 | "\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", 35 | "#数据变成TensorFow为Backend的形式\n", 36 | "x_train=x_train.reshape(60000,28,28,1)\n", 37 | "x_test=x_test.reshape(10000,28,28,1)\n", 38 | "#把标签变成one-hot编码的形式\n", 39 | "y_train=to_categorical(y_train,num_classes=10)\n", 40 | "y_test=to_categorical(y_test,num_classes=10)" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "name": "stdout", 50 | "output_type": "stream", 51 | "text": [ 52 | "_________________________________________________________________\n", 53 | "Layer (type) Output Shape Param # \n", 54 | "=================================================================\n", 55 | "conv2d_1 (Conv2D) (None, 24, 24, 6) 156 \n", 56 | "_________________________________________________________________\n", 57 | "max_pooling2d_1 (MaxPooling2 (None, 12, 12, 6) 0 \n", 58 | "_________________________________________________________________\n", 59 | "conv2d_2 (Conv2D) (None, 8, 8, 16) 2416 \n", 60 | "_________________________________________________________________\n", 61 | "max_pooling2d_2 (MaxPooling2 (None, 4, 4, 16) 0 \n", 62 | "_________________________________________________________________\n", 63 | "flatten_1 (Flatten) (None, 256) 0 \n", 64 | "_________________________________________________________________\n", 65 | "dense_1 (Dense) (None, 120) 30840 \n", 66 | "_________________________________________________________________\n", 67 | "dense_2 (Dense) (None, 84) 10164 \n", 68 | "_________________________________________________________________\n", 69 | "dense_3 (Dense) (None, 10) 850 \n", 70 | "=================================================================\n", 71 | "Total params: 44,426\n", 72 | "Trainable params: 44,426\n", 73 | "Non-trainable params: 0\n", 74 | "_________________________________________________________________\n" 75 | ] 76 | } 77 | ], 78 | "source": [ 79 | "# 构建LeNet-5网络\n", 80 | "model = Sequential()\n", 81 | "model.add(Conv2D(input_shape = (28,28,1), filters=6, kernel_size=(5,5), padding='valid', activation='tanh'))\n", 82 | "model.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 83 | "model.add(Conv2D(input_shape=(14,14,6), filters=16, kernel_size=(5,5), padding='valid', activation='tanh'))\n", 84 | "model.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 85 | "model.add(Flatten())\n", 86 | "model.add(Dense(120, activation='tanh'))\n", 87 | "model.add(Dense(84, activation='tanh'))\n", 88 | "model.add(Dense(10, activation='softmax'))\n", 89 | "model.summary()" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 4, 95 | "metadata": {}, 96 | "outputs": [ 97 | { 98 | "name": "stdout", 99 | "output_type": "stream", 100 | "text": [ 101 | "Epoch 1/30\n", 102 | "60000/60000 [==============================] - 11s 189us/step - loss: 0.9287 - acc: 0.7676\n", 103 | "Epoch 2/30\n", 104 | "60000/60000 [==============================] - 12s 194us/step - loss: 0.3284 - acc: 0.9180\n", 105 | "Epoch 3/30\n", 106 | "60000/60000 [==============================] - 11s 185us/step - loss: 0.2356 - acc: 0.9375\n", 107 | "Epoch 4/30\n", 108 | "60000/60000 [==============================] - 11s 186us/step - loss: 0.1897 - acc: 0.9479\n", 109 | "Epoch 5/30\n", 110 | "60000/60000 [==============================] - 11s 191us/step - loss: 0.1618 - acc: 0.9543\n", 111 | "Epoch 6/30\n", 112 | "60000/60000 [==============================] - 11s 187us/step - loss: 0.1432 - acc: 0.9591\n", 113 | "Epoch 7/30\n", 114 | "60000/60000 [==============================] - 11s 188us/step - loss: 0.1308 - acc: 0.9622\n", 115 | "Epoch 8/30\n", 116 | "60000/60000 [==============================] - 13s 209us/step - loss: 0.1185 - acc: 0.9658\n", 117 | "Epoch 9/30\n", 118 | "60000/60000 [==============================] - 13s 213us/step - loss: 0.1121 - acc: 0.9675\n", 119 | "Epoch 10/30\n", 120 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.1036 - acc: 0.9697\n", 121 | "Epoch 11/30\n", 122 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0983 - acc: 0.9713\n", 123 | "Epoch 12/30\n", 124 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0936 - acc: 0.9722\n", 125 | "Epoch 13/30\n", 126 | "60000/60000 [==============================] - 11s 183us/step - loss: 0.0895 - acc: 0.9736\n", 127 | "Epoch 14/30\n", 128 | "60000/60000 [==============================] - 11s 188us/step - loss: 0.0867 - acc: 0.9742\n", 129 | "Epoch 15/30\n", 130 | "60000/60000 [==============================] - 11s 177us/step - loss: 0.0817 - acc: 0.9757\n", 131 | "Epoch 16/30\n", 132 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0784 - acc: 0.9769\n", 133 | "Epoch 17/30\n", 134 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.0765 - acc: 0.9775\n", 135 | "Epoch 18/30\n", 136 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.0736 - acc: 0.9781\n", 137 | "Epoch 19/30\n", 138 | "60000/60000 [==============================] - 11s 190us/step - loss: 0.0707 - acc: 0.9792\n", 139 | "Epoch 20/30\n", 140 | "60000/60000 [==============================] - 11s 183us/step - loss: 0.0691 - acc: 0.9797\n", 141 | "Epoch 21/30\n", 142 | "60000/60000 [==============================] - 11s 187us/step - loss: 0.0677 - acc: 0.9803\n", 143 | "Epoch 22/30\n", 144 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0658 - acc: 0.9803\n", 145 | "Epoch 23/30\n", 146 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.0641 - acc: 0.9812\n", 147 | "Epoch 24/30\n", 148 | "60000/60000 [==============================] - 11s 185us/step - loss: 0.0627 - acc: 0.9818\n", 149 | "Epoch 25/30\n", 150 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0610 - acc: 0.9824\n", 151 | "Epoch 26/30\n", 152 | "60000/60000 [==============================] - 11s 180us/step - loss: 0.0589 - acc: 0.9827\n", 153 | "Epoch 27/30\n", 154 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0576 - acc: 0.9829\n", 155 | "Epoch 28/30\n", 156 | "60000/60000 [==============================] - 11s 183us/step - loss: 0.0567 - acc: 0.9835\n", 157 | "Epoch 29/30\n", 158 | "60000/60000 [==============================] - 11s 181us/step - loss: 0.0556 - acc: 0.9837\n", 159 | "Epoch 30/30\n", 160 | "60000/60000 [==============================] - 12s 198us/step - loss: 0.0535 - acc: 0.9845\n", 161 | "dict_keys(['loss', 'acc'])\n" 162 | ] 163 | }, 164 | { 165 | "data": { 166 | "image/png": "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\n", 167 | "text/plain": [ 168 | "
" 169 | ] 170 | }, 171 | "metadata": {}, 172 | "output_type": "display_data" 173 | } 174 | ], 175 | "source": [ 176 | "model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])\n", 177 | "history = model.fit(x_train, y_train, batch_size=128, epochs=30)\n", 178 | "print(history.history.keys())\n", 179 | "# summarize history for accuracy\n", 180 | "plt.plot(history.history['loss'])\n", 181 | "plt.plot(history.history['acc'])\n", 182 | "plt.title('model accuracy')\n", 183 | "plt.ylabel('accuracy')\n", 184 | "plt.xlabel('epoch')\n", 185 | "plt.legend(['loss','acc'], loc='upper left')\n", 186 | "plt.show()" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 5, 192 | "metadata": {}, 193 | "outputs": [ 194 | { 195 | "name": "stdout", 196 | "output_type": "stream", 197 | "text": [ 198 | "10000/10000 [==============================] - 1s 133us/step\n", 199 | "Testing Loss: 0.056708887127041814\n", 200 | "Testing Accuracy of: 0.9825\n" 201 | ] 202 | } 203 | ], 204 | "source": [ 205 | "score=model.evaluate(x_test,y_test)\n", 206 | "print(\"Testing Loss:\", score[0])\n", 207 | "print(\"Testing Accuracy of:\", score[1])" 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": null, 213 | "metadata": {}, 214 | "outputs": [], 215 | "source": [] 216 | } 217 | ], 218 | "metadata": { 219 | "kernelspec": { 220 | "display_name": "Python 3", 221 | "language": "python", 222 | "name": "python3" 223 | }, 224 | "language_info": { 225 | "codemirror_mode": { 226 | "name": "ipython", 227 | "version": 3 228 | }, 229 | "file_extension": ".py", 230 | "mimetype": "text/x-python", 231 | "name": "python", 232 | "nbconvert_exporter": "python", 233 | "pygments_lexer": "ipython3", 234 | "version": "3.6.5" 235 | } 236 | }, 237 | "nbformat": 4, 238 | "nbformat_minor": 2 239 | } 240 | -------------------------------------------------------------------------------- /LeNet_Dropout.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/usr/local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 13 | " from ._conv import register_converters as _register_converters\n", 14 | "Using TensorFlow backend.\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "from keras.datasets import mnist\n", 20 | "from keras.layers import Flatten, Conv2D, MaxPool2D, Dense, Input,AveragePooling2D,Reshape,Activation,Dropout\n", 21 | "from keras.models import Sequential, Model\n", 22 | "from keras.optimizers import SGD\n", 23 | "from keras.utils import plot_model, to_categorical\n", 24 | "\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": {}, 32 | "outputs": [ 33 | { 34 | "name": "stdout", 35 | "output_type": "stream", 36 | "text": [ 37 | "(60000, 28, 28)\n", 38 | "(10000, 28, 28)\n" 39 | ] 40 | } 41 | ], 42 | "source": [ 43 | "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", 44 | "#数据变成TensorFow为Backend的形式\n", 45 | "print (x_train.shape)\n", 46 | "print (x_test.shape)\n", 47 | "x_train=x_train.reshape(60000,28,28,1)\n", 48 | "x_test=x_test.reshape(10000,28,28,1)\n", 49 | "#把标签变成one-hot编码的形式\n", 50 | "y_train=to_categorical(y_train,num_classes=10)\n", 51 | "y_test=to_categorical(y_test,num_classes=10)" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 3, 57 | "metadata": {}, 58 | "outputs": [ 59 | { 60 | "name": "stdout", 61 | "output_type": "stream", 62 | "text": [ 63 | "_________________________________________________________________\n", 64 | "Layer (type) Output Shape Param # \n", 65 | "=================================================================\n", 66 | "conv2d_1 (Conv2D) (None, 24, 24, 6) 156 \n", 67 | "_________________________________________________________________\n", 68 | "max_pooling2d_1 (MaxPooling2 (None, 12, 12, 6) 0 \n", 69 | "_________________________________________________________________\n", 70 | "conv2d_2 (Conv2D) (None, 8, 8, 16) 2416 \n", 71 | "_________________________________________________________________\n", 72 | "max_pooling2d_2 (MaxPooling2 (None, 4, 4, 16) 0 \n", 73 | "_________________________________________________________________\n", 74 | "flatten_1 (Flatten) (None, 256) 0 \n", 75 | "_________________________________________________________________\n", 76 | "dense_1 (Dense) (None, 120) 30840 \n", 77 | "_________________________________________________________________\n", 78 | "dense_2 (Dense) (None, 84) 10164 \n", 79 | "_________________________________________________________________\n", 80 | "dense_3 (Dense) (None, 10) 850 \n", 81 | "=================================================================\n", 82 | "Total params: 44,426\n", 83 | "Trainable params: 44,426\n", 84 | "Non-trainable params: 0\n", 85 | "_________________________________________________________________\n" 86 | ] 87 | } 88 | ], 89 | "source": [ 90 | "# 构建LeNet-5网络\n", 91 | "lenet = Sequential()\n", 92 | "lenet.add(Conv2D(input_shape = (28,28,1), filters=6, kernel_size=(5,5), padding='valid', activation='relu'))\n", 93 | "lenet.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 94 | "lenet.add(Conv2D(input_shape=(16,16,8), filters=16, kernel_size=(5,5), padding='valid', activation='relu'))\n", 95 | "lenet.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 96 | "lenet.add(Flatten())\n", 97 | "lenet.add(Dense(120, activation='relu'))\n", 98 | "lenet.add(Dense(84, activation='relu'))\n", 99 | "lenet.add(Dense(10, activation='softmax'))\n", 100 | "lenet.summary()" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": {}, 107 | "outputs": [ 108 | { 109 | "name": "stdout", 110 | "output_type": "stream", 111 | "text": [ 112 | "Epoch 1/20\n", 113 | "60000/60000 [==============================] - 11s 181us/step - loss: 1.1482 - acc: 0.8318\n", 114 | "Epoch 2/20\n", 115 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.1317 - acc: 0.9598\n", 116 | "Epoch 3/20\n", 117 | "60000/60000 [==============================] - 11s 178us/step - loss: 0.0980 - acc: 0.9701\n", 118 | "Epoch 4/20\n", 119 | "60000/60000 [==============================] - 11s 175us/step - loss: 0.0807 - acc: 0.9753\n", 120 | "Epoch 5/20\n", 121 | "60000/60000 [==============================] - 10s 175us/step - loss: 0.0703 - acc: 0.9787\n", 122 | "Epoch 6/20\n", 123 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0626 - acc: 0.9807\n", 124 | "Epoch 7/20\n", 125 | "60000/60000 [==============================] - 11s 186us/step - loss: 0.0547 - acc: 0.9825\n", 126 | "Epoch 8/20\n", 127 | "60000/60000 [==============================] - 12s 202us/step - loss: 0.0486 - acc: 0.9848\n", 128 | "Epoch 9/20\n", 129 | "60000/60000 [==============================] - 12s 193us/step - loss: 0.0445 - acc: 0.9868\n", 130 | "Epoch 10/20\n", 131 | "60000/60000 [==============================] - 12s 203us/step - loss: 0.0396 - acc: 0.9878\n", 132 | "Epoch 11/20\n", 133 | "60000/60000 [==============================] - 12s 201us/step - loss: 0.0368 - acc: 0.9882\n", 134 | "Epoch 12/20\n", 135 | "60000/60000 [==============================] - 13s 216us/step - loss: 0.0336 - acc: 0.9891\n", 136 | "Epoch 13/20\n", 137 | "60000/60000 [==============================] - 12s 200us/step - loss: 0.0297 - acc: 0.9907\n", 138 | "Epoch 14/20\n", 139 | "60000/60000 [==============================] - 11s 186us/step - loss: 0.0282 - acc: 0.9913\n", 140 | "Epoch 15/20\n", 141 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0251 - acc: 0.9919\n", 142 | "Epoch 16/20\n", 143 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0230 - acc: 0.9924\n", 144 | "Epoch 17/20\n", 145 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0211 - acc: 0.9935\n", 146 | "Epoch 18/20\n", 147 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.0192 - acc: 0.9940\n", 148 | "Epoch 19/20\n", 149 | "60000/60000 [==============================] - 11s 185us/step - loss: 0.0172 - acc: 0.9948\n", 150 | "Epoch 20/20\n", 151 | "60000/60000 [==============================] - 11s 185us/step - loss: 0.0155 - acc: 0.9953\n" 152 | ] 153 | } 154 | ], 155 | "source": [ 156 | "lenet.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])\n", 157 | "lenet_history = lenet.fit(x_train, y_train, batch_size=128, epochs=20)" 158 | ] 159 | }, 160 | { 161 | "cell_type": "code", 162 | "execution_count": 5, 163 | "metadata": {}, 164 | "outputs": [ 165 | { 166 | "name": "stdout", 167 | "output_type": "stream", 168 | "text": [ 169 | "10000/10000 [==============================] - 1s 126us/step\n", 170 | "Testing Loss: 0.06592238205773292\n", 171 | "Testing Accuracy of: 0.9826\n" 172 | ] 173 | } 174 | ], 175 | "source": [ 176 | "lenet_score=lenet.evaluate(x_test,y_test)\n", 177 | "print(\"Testing Loss:\", lenet_score[0])\n", 178 | "print(\"Testing Accuracy of:\", lenet_score[1])" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 6, 184 | "metadata": {}, 185 | "outputs": [ 186 | { 187 | "name": "stdout", 188 | "output_type": "stream", 189 | "text": [ 190 | "_________________________________________________________________\n", 191 | "Layer (type) Output Shape Param # \n", 192 | "=================================================================\n", 193 | "conv2d_3 (Conv2D) (None, 24, 24, 6) 156 \n", 194 | "_________________________________________________________________\n", 195 | "max_pooling2d_3 (MaxPooling2 (None, 12, 12, 6) 0 \n", 196 | "_________________________________________________________________\n", 197 | "conv2d_4 (Conv2D) (None, 8, 8, 16) 2416 \n", 198 | "_________________________________________________________________\n", 199 | "max_pooling2d_4 (MaxPooling2 (None, 4, 4, 16) 0 \n", 200 | "_________________________________________________________________\n", 201 | "flatten_2 (Flatten) (None, 256) 0 \n", 202 | "_________________________________________________________________\n", 203 | "dense_4 (Dense) (None, 120) 30840 \n", 204 | "_________________________________________________________________\n", 205 | "dropout_1 (Dropout) (None, 120) 0 \n", 206 | "_________________________________________________________________\n", 207 | "dense_5 (Dense) (None, 84) 10164 \n", 208 | "_________________________________________________________________\n", 209 | "dropout_2 (Dropout) (None, 84) 0 \n", 210 | "_________________________________________________________________\n", 211 | "dense_6 (Dense) (None, 10) 850 \n", 212 | "=================================================================\n", 213 | "Total params: 44,426\n", 214 | "Trainable params: 44,426\n", 215 | "Non-trainable params: 0\n", 216 | "_________________________________________________________________\n" 217 | ] 218 | } 219 | ], 220 | "source": [ 221 | "# 构建LeNet-5网络\n", 222 | "lenet_drop = Sequential()\n", 223 | "lenet_drop.add(Conv2D(input_shape = (28,28,1), filters=6, kernel_size=(5,5), padding='valid', activation='relu'))\n", 224 | "lenet_drop.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 225 | "lenet_drop.add(Conv2D(input_shape=(16,16,8), filters=16, kernel_size=(5,5), padding='valid', activation='relu'))\n", 226 | "lenet_drop.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 227 | "lenet_drop.add(Flatten())\n", 228 | "lenet_drop.add(Dense(120, activation='relu'))\n", 229 | "lenet_drop.add(Dropout(0.2))\n", 230 | "lenet_drop.add(Dense(84, activation='relu'))\n", 231 | "lenet_drop.add(Dropout(0.2))\n", 232 | "lenet_drop.add(Dense(10, activation='softmax'))\n", 233 | "lenet_drop.summary()" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 7, 239 | "metadata": {}, 240 | "outputs": [ 241 | { 242 | "name": "stdout", 243 | "output_type": "stream", 244 | "text": [ 245 | "Epoch 1/20\n", 246 | "60000/60000 [==============================] - 11s 186us/step - loss: 14.4106 - acc: 0.1054\n", 247 | "Epoch 2/20\n", 248 | "60000/60000 [==============================] - 11s 182us/step - loss: 1.6244 - acc: 0.6266\n", 249 | "Epoch 3/20\n", 250 | "60000/60000 [==============================] - 11s 184us/step - loss: 0.3582 - acc: 0.8957\n", 251 | "Epoch 4/20\n", 252 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.2443 - acc: 0.9284\n", 253 | "Epoch 5/20\n", 254 | "60000/60000 [==============================] - 11s 181us/step - loss: 0.1958 - acc: 0.9431\n", 255 | "Epoch 6/20\n", 256 | "60000/60000 [==============================] - 11s 181us/step - loss: 0.1689 - acc: 0.9507\n", 257 | "Epoch 7/20\n", 258 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.1504 - acc: 0.9555\n", 259 | "Epoch 8/20\n", 260 | "60000/60000 [==============================] - 11s 185us/step - loss: 0.1354 - acc: 0.9602\n", 261 | "Epoch 9/20\n", 262 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.1239 - acc: 0.9634\n", 263 | "Epoch 10/20\n", 264 | "60000/60000 [==============================] - 11s 182us/step - loss: 0.1177 - acc: 0.9654\n", 265 | "Epoch 11/20\n", 266 | "60000/60000 [==============================] - 11s 177us/step - loss: 0.1081 - acc: 0.9678\n", 267 | "Epoch 12/20\n", 268 | "60000/60000 [==============================] - 11s 176us/step - loss: 0.1034 - acc: 0.9694\n", 269 | "Epoch 13/20\n", 270 | "60000/60000 [==============================] - 11s 176us/step - loss: 0.0975 - acc: 0.9711\n", 271 | "Epoch 14/20\n", 272 | "60000/60000 [==============================] - 11s 183us/step - loss: 0.0942 - acc: 0.9719\n", 273 | "Epoch 15/20\n", 274 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0884 - acc: 0.9740\n", 275 | "Epoch 16/20\n", 276 | "60000/60000 [==============================] - 11s 186us/step - loss: 0.0828 - acc: 0.9753\n", 277 | "Epoch 17/20\n", 278 | "60000/60000 [==============================] - 11s 191us/step - loss: 0.0824 - acc: 0.9757\n", 279 | "Epoch 18/20\n", 280 | "60000/60000 [==============================] - 11s 183us/step - loss: 0.0779 - acc: 0.9763\n", 281 | "Epoch 19/20\n", 282 | "60000/60000 [==============================] - 11s 181us/step - loss: 0.0757 - acc: 0.9765\n", 283 | "Epoch 20/20\n", 284 | "60000/60000 [==============================] - 11s 181us/step - loss: 0.0735 - acc: 0.9776\n" 285 | ] 286 | } 287 | ], 288 | "source": [ 289 | "lenet_drop.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])\n", 290 | "lenet_drop_history = lenet_drop.fit(x_train, y_train, batch_size=128, epochs=20)" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": 8, 296 | "metadata": {}, 297 | "outputs": [ 298 | { 299 | "name": "stdout", 300 | "output_type": "stream", 301 | "text": [ 302 | "10000/10000 [==============================] - 1s 131us/step\n", 303 | "Testing Loss: 0.05491561537194575\n", 304 | "Testing Accuracy of: 0.9841\n" 305 | ] 306 | } 307 | ], 308 | "source": [ 309 | "lenet_drop_score=lenet_drop.evaluate(x_test,y_test)\n", 310 | "print(\"Testing Loss:\", lenet_drop_score[0])\n", 311 | "print(\"Testing Accuracy of:\", lenet_drop_score[1])" 312 | ] 313 | }, 314 | { 315 | "cell_type": "code", 316 | "execution_count": 9, 317 | "metadata": {}, 318 | "outputs": [ 319 | { 320 | "name": "stdout", 321 | "output_type": "stream", 322 | "text": [ 323 | "dict_keys(['loss', 'acc'])\n" 324 | ] 325 | }, 326 | { 327 | "data": { 328 | "image/png": "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riERkZwK1jVkZvcDLwAHmdlyM/tGodpqVmUfdQ2JiDSjkGcNndPC9P6FaruJij5Qp0QgIpJL576yGKCyCrbVqcyEiEgOMUgEKjMhItKczp8IKlJlJpQIRESy6fyJoDJ1UZkSgUixFLsMdTHaz9ezzz7L7Nmzs067++67ueSSS4ocUctikAjUNSTSGbS2DHV9fX0bRpNbc4mgver8iaBCewQiUSpGGep//etfjVcv//CHP2wc/+yzz3LssccycuRIDjnkEABuvPFGBg0axKBBg7j55psb4zn44IMZM2YMAwcOZPTo0WzaFJxgMnPmTIYMGcLgwYM5//zzG4vg9e/fnw8+CC6Dmjt3LscffzxLly5lypQp3HTTTdTU1DSWushm6dKlnHDCCVRXVzNixAjefTeow/nQQw8xaNAgDjvsMD73uc8B8OqrrzJ06FBqamqorq5m8eLFrftQMhTtgrLIlJQFZSaUCCSOnrgSVr7Stuv81GD48s/ymrVYZagnTZrERRddxLhx45g8eXKTafPnz2fhwoUMGDCAefPmMXXqVObMmYO7M2zYMI477jh69erFG2+8wZ133snw4cM5//zz+d///V8uueQSJkyYwMyZMznwwAMZN24ct912G5dddlnW99u/f38uvPBCKisrufzyy5vdNt/61rcYP34848eP56677uLSSy9l+vTpXHvttTz55JPss88+jeWyp0yZwqRJkxgzZgzbtm2joaEhr+2fr86/RwBB95AqkIoUXXoZ6sMPP5xFixY1/jfbUhnqmpoaLrjgAt5///0W2/nb3/7GOecEly6dd955TaYNHTqUAQMGADBr1iy++tWvUlFRQWVlJaeffnrjf+377rsvw4cPB2Ds2LHMmjWLN954gwEDBnDggQcCQVnr5557rg22DLzwwguce+65jTHPmjULCEpjT5gwgTvuuKPxB//oo4/mpz/9Kddddx3vvPMO3bp1a5MYUjr/HgEE3UMbVWZCYijP/9wLpZhlqM0s6/iKiopdWj7X+lJKS0tJJpMAbNmyJa828jFlyhTmzJnDY489xhFHHMG8efM499xzGTZsGI899hgnn3wyv/rVrzjhhBParM0Y7RGoa0ik2IpVhnr48OE88MADQFC9NJdjjz2W6dOns2nTJjZu3Mi0adM49thjAXj33Xd54YUXAPjd737HZz/7WQ466CCW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\n", 329 | "text/plain": [ 330 | "
" 331 | ] 332 | }, 333 | "metadata": {}, 334 | "output_type": "display_data" 335 | } 336 | ], 337 | "source": [ 338 | "print(lenet_history.history.keys())\n", 339 | "# summarize history for accuracy\n", 340 | "plt.plot(lenet_history.history['loss'])\n", 341 | "plt.plot(lenet_drop_history.history['loss'])\n", 342 | "plt.title('model accuracy')\n", 343 | "plt.ylabel('loss')\n", 344 | "plt.xlabel('epoch')\n", 345 | "plt.legend(['lenet loss','lenet dropout loss'], loc='upper right')\n", 346 | "plt.show()" 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": null, 352 | "metadata": {}, 353 | "outputs": [], 354 | "source": [] 355 | } 356 | ], 357 | "metadata": { 358 | "kernelspec": { 359 | "display_name": "Python 3", 360 | "language": "python", 361 | "name": "python3" 362 | }, 363 | "language_info": { 364 | "codemirror_mode": { 365 | "name": "ipython", 366 | "version": 3 367 | }, 368 | "file_extension": ".py", 369 | "mimetype": "text/x-python", 370 | "name": "python", 371 | "nbconvert_exporter": "python", 372 | "pygments_lexer": "ipython3", 373 | "version": "3.6.5" 374 | } 375 | }, 376 | "nbformat": 4, 377 | "nbformat_minor": 2 378 | } 379 | -------------------------------------------------------------------------------- /MobileNetV1_CPU.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 79, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import keras\n", 10 | "from keras.datasets import mnist\n", 11 | "from keras.utils import to_categorical\n", 12 | "from keras.layers import Conv2D, Input, GlobalAveragePooling2D,Dense, Activation, Flatten, BatchNormalization\n", 13 | "from keras.applications.mobilenet import relu6, DepthwiseConv2D\n", 14 | "from keras import Model\n", 15 | "from keras import optimizers\n", 16 | "import matplotlib.pyplot as plt" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 65, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "(60000, 10)\n", 29 | "(10000, 10)\n" 30 | ] 31 | } 32 | ], 33 | "source": [ 34 | "(train_x, train_y), (test_x, test_y) = mnist.load_data()\n", 35 | "train_x = train_x.reshape((60000,28,28,1)) / 255.0\n", 36 | "test_x = test_x.reshape((10000,28,28,1)) / 255.0\n", 37 | "\n", 38 | "train_y = keras.utils.to_categorical(train_y, num_classes = 10)\n", 39 | "test_y = keras.utils.to_categorical(test_y, num_classes = 10)\n", 40 | "print (train_y.shape)\n", 41 | "print (test_y.shape)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": {}, 47 | "source": [ 48 | "#### DepthwiseConv2D\n", 49 | "```py\n", 50 | "class DepthwiseConv2D(Conv2D):\n", 51 | " \"\"\"Depthwise separable 2D convolution.\n", 52 | " Depthwise Separable convolutions consist in performing\n", 53 | " just the first step in a depthwise spatial convolution\n", 54 | " (which acts on each input channel separately).\n", 55 | " It does not perform the pointwise convolution (second step).\n", 56 | " The `depth_multiplier` argument controls how many\n", 57 | " output channels are generated per input channel in the depthwise step.\n", 58 | " # Arguments\n", 59 | " kernel_size: An integer or tuple/list of 2 integers, specifying the\n", 60 | " width and height of the 2D convolution window.\n", 61 | " Can be a single integer to specify the same value for\n", 62 | " all spatial dimensions.\n", 63 | " strides: An integer or tuple/list of 2 integers,\n", 64 | " specifying the strides of the convolution along the width and height.\n", 65 | " Can be a single integer to specify the same value for\n", 66 | " all spatial dimensions.\n", 67 | " Specifying any stride value != 1 is incompatible with specifying\n", 68 | " any `dilation_rate` value != 1.\n", 69 | " padding: one of `\"valid\"` or `\"same\"` (case-insensitive).\n", 70 | " depth_multiplier: The number of depthwise convolution output channels\n", 71 | " for each input channel.\n", 72 | " The total number of depthwise convolution output\n", 73 | " channels will be equal to `filterss_in * depth_multiplier`.\n", 74 | " data_format: A string,\n", 75 | " one of `channels_last` (default) or `channels_first`.\n", 76 | " The ordering of the dimensions in the inputs.\n", 77 | " `channels_last` corresponds to inputs with shape\n", 78 | " `(batch, height, width, channels)` while `channels_first`\n", 79 | " corresponds to inputs with shape\n", 80 | " `(batch, channels, height, width)`.\n", 81 | " It defaults to the `image_data_format` value found in your\n", 82 | " Keras config file at `~/.keras/keras.json`.\n", 83 | " If you never set it, then it will be \"channels_last\".\n", 84 | " activation: Activation function to use\n", 85 | " (see [activations](../activations.md)).\n", 86 | " If you don't specify anything, no activation is applied\n", 87 | " (ie. \"linear\" activation: `a(x) = x`).\n", 88 | " use_bias: Boolean, whether the layer uses a bias vector.\n", 89 | " depthwise_initializer: Initializer for the depthwise kernel matrix\n", 90 | " (see [initializers](../initializers.md)).\n", 91 | " bias_initializer: Initializer for the bias vector\n", 92 | " (see [initializers](../initializers.md)).\n", 93 | " depthwise_regularizer: Regularizer function applied to\n", 94 | " the depthwise kernel matrix\n", 95 | " (see [regularizer](../regularizers.md)).\n", 96 | " bias_regularizer: Regularizer function applied to the bias vector\n", 97 | " (see [regularizer](../regularizers.md)).\n", 98 | " activity_regularizer: Regularizer function applied to\n", 99 | " the output of the layer (its \"activation\").\n", 100 | " (see [regularizer](../regularizers.md)).\n", 101 | " depthwise_constraint: Constraint function applied to\n", 102 | " the depthwise kernel matrix\n", 103 | " (see [constraints](../constraints.md)).\n", 104 | " bias_constraint: Constraint function applied to the bias vector\n", 105 | " (see [constraints](../constraints.md)).\n", 106 | " # Input shape\n", 107 | " 4D tensor with shape:\n", 108 | " `(batch, channels, rows, cols)` if data_format='channels_first'\n", 109 | " or 4D tensor with shape:\n", 110 | " `(batch, rows, cols, channels)` if data_format='channels_last'.\n", 111 | " # Output shape\n", 112 | " 4D tensor with shape:\n", 113 | " `(batch, filters, new_rows, new_cols)` if data_format='channels_first'\n", 114 | " or 4D tensor with shape:\n", 115 | " `(batch, new_rows, new_cols, filters)` if data_format='channels_last'.\n", 116 | " `rows` and `cols` values might have changed due to padding.\n", 117 | " \"\"\"\n", 118 | "```" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 8, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [ 127 | "def MobileNetV1(input_shape, k):\n", 128 | " inputs = Input(shape=input_shape)\n", 129 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 130 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 131 | " x = Conv2D(filters=64, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 132 | " x = DepthwiseConv2D(kernel_size=(3,3), padding='same', activation='relu',)(x)\n", 133 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 134 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 135 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 136 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 137 | " x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 138 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 139 | " x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 140 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 141 | " x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 142 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 143 | " x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 144 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 145 | " x = Conv2D(filters=1024, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 146 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 147 | " x = Conv2D(filters=1024, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 148 | " x = GlobalAveragePooling2D()(x)\n", 149 | " x = Dense(1024, activation='relu')(x)\n", 150 | " x = Dense(k, activation='softmax')(x)\n", 151 | " model = Model(inputs, x)\n", 152 | " return model" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": 11, 158 | "metadata": {}, 159 | "outputs": [], 160 | "source": [ 161 | "def NaiveConvNet(input_shape, k):\n", 162 | " inputs = Input(shape=input_shape)\n", 163 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 164 | " x = Conv2D(filters=64, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 165 | " x = Conv2D(filters=128, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 166 | " x = Conv2D(filters=128, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 167 | " x = Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 168 | " x = Conv2D(filters=256, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 169 | " x = Conv2D(filters=512, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 170 | " x = Conv2D(filters=512, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 171 | " x = Conv2D(filters=1024, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 172 | " x = Conv2D(filters=1024, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 173 | " x = GlobalAveragePooling2D()(x)\n", 174 | " x = Dense(1024, activation='relu')(x)\n", 175 | " x = Dense(k, activation='softmax')(x)\n", 176 | " model = Model(inputs, x)\n", 177 | " return model" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 14, 183 | "metadata": {}, 184 | "outputs": [ 185 | { 186 | "name": "stdout", 187 | "output_type": "stream", 188 | "text": [ 189 | "_________________________________________________________________\n", 190 | "Layer (type) Output Shape Param # \n", 191 | "=================================================================\n", 192 | "input_5 (InputLayer) (None, 224, 224, 3) 0 \n", 193 | "_________________________________________________________________\n", 194 | "conv2d_35 (Conv2D) (None, 112, 112, 32) 896 \n", 195 | "_________________________________________________________________\n", 196 | "depthwise_conv2d_22 (Depthwi (None, 112, 112, 32) 320 \n", 197 | "_________________________________________________________________\n", 198 | "conv2d_36 (Conv2D) (None, 112, 112, 64) 2112 \n", 199 | "_________________________________________________________________\n", 200 | "depthwise_conv2d_23 (Depthwi (None, 112, 112, 64) 640 \n", 201 | "_________________________________________________________________\n", 202 | "conv2d_37 (Conv2D) (None, 112, 112, 128) 8320 \n", 203 | "_________________________________________________________________\n", 204 | "depthwise_conv2d_24 (Depthwi (None, 56, 56, 128) 1280 \n", 205 | "_________________________________________________________________\n", 206 | "conv2d_38 (Conv2D) (None, 56, 56, 128) 16512 \n", 207 | "_________________________________________________________________\n", 208 | "depthwise_conv2d_25 (Depthwi (None, 56, 56, 128) 1280 \n", 209 | "_________________________________________________________________\n", 210 | "conv2d_39 (Conv2D) (None, 56, 56, 256) 33024 \n", 211 | "_________________________________________________________________\n", 212 | "depthwise_conv2d_26 (Depthwi (None, 28, 28, 256) 2560 \n", 213 | "_________________________________________________________________\n", 214 | "conv2d_40 (Conv2D) (None, 28, 28, 256) 65792 \n", 215 | "_________________________________________________________________\n", 216 | "depthwise_conv2d_27 (Depthwi (None, 28, 28, 256) 2560 \n", 217 | "_________________________________________________________________\n", 218 | "conv2d_41 (Conv2D) (None, 28, 28, 512) 131584 \n", 219 | "_________________________________________________________________\n", 220 | "depthwise_conv2d_28 (Depthwi (None, 14, 14, 512) 5120 \n", 221 | "_________________________________________________________________\n", 222 | "conv2d_42 (Conv2D) (None, 14, 14, 512) 262656 \n", 223 | "_________________________________________________________________\n", 224 | "depthwise_conv2d_29 (Depthwi (None, 7, 7, 512) 5120 \n", 225 | "_________________________________________________________________\n", 226 | "conv2d_43 (Conv2D) (None, 7, 7, 1024) 525312 \n", 227 | "_________________________________________________________________\n", 228 | "depthwise_conv2d_30 (Depthwi (None, 7, 7, 1024) 10240 \n", 229 | "_________________________________________________________________\n", 230 | "conv2d_44 (Conv2D) (None, 7, 7, 1024) 1049600 \n", 231 | "_________________________________________________________________\n", 232 | "global_average_pooling2d_4 ( (None, 1024) 0 \n", 233 | "_________________________________________________________________\n", 234 | "dense_8 (Dense) (None, 1024) 1049600 \n", 235 | "_________________________________________________________________\n", 236 | "dense_9 (Dense) (None, 1000) 1025000 \n", 237 | "=================================================================\n", 238 | "Total params: 4,199,528\n", 239 | "Trainable params: 4,199,528\n", 240 | "Non-trainable params: 0\n", 241 | "_________________________________________________________________\n" 242 | ] 243 | } 244 | ], 245 | "source": [ 246 | "MobileNet_v1_model = MobileNetV1((224,224,3), 1000)\n", 247 | "MobileNet_v1_model.summary()" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 15, 253 | "metadata": {}, 254 | "outputs": [ 255 | { 256 | "name": "stdout", 257 | "output_type": "stream", 258 | "text": [ 259 | "_________________________________________________________________\n", 260 | "Layer (type) Output Shape Param # \n", 261 | "=================================================================\n", 262 | "input_6 (InputLayer) (None, 224, 224, 3) 0 \n", 263 | "_________________________________________________________________\n", 264 | "conv2d_45 (Conv2D) (None, 112, 112, 32) 896 \n", 265 | "_________________________________________________________________\n", 266 | "conv2d_46 (Conv2D) (None, 112, 112, 64) 18496 \n", 267 | "_________________________________________________________________\n", 268 | "conv2d_47 (Conv2D) (None, 112, 112, 128) 73856 \n", 269 | "_________________________________________________________________\n", 270 | "conv2d_48 (Conv2D) (None, 56, 56, 128) 147584 \n", 271 | "_________________________________________________________________\n", 272 | "conv2d_49 (Conv2D) (None, 56, 56, 256) 295168 \n", 273 | "_________________________________________________________________\n", 274 | "conv2d_50 (Conv2D) (None, 28, 28, 256) 590080 \n", 275 | "_________________________________________________________________\n", 276 | "conv2d_51 (Conv2D) (None, 28, 28, 512) 1180160 \n", 277 | "_________________________________________________________________\n", 278 | "conv2d_52 (Conv2D) (None, 14, 14, 512) 2359808 \n", 279 | "_________________________________________________________________\n", 280 | "conv2d_53 (Conv2D) (None, 7, 7, 1024) 4719616 \n", 281 | "_________________________________________________________________\n", 282 | "conv2d_54 (Conv2D) (None, 7, 7, 1024) 9438208 \n", 283 | "_________________________________________________________________\n", 284 | "global_average_pooling2d_5 ( (None, 1024) 0 \n", 285 | "_________________________________________________________________\n", 286 | "dense_10 (Dense) (None, 1024) 1049600 \n", 287 | "_________________________________________________________________\n", 288 | "dense_11 (Dense) (None, 1000) 1025000 \n", 289 | "=================================================================\n", 290 | "Total params: 20,898,472\n", 291 | "Trainable params: 20,898,472\n", 292 | "Non-trainable params: 0\n", 293 | "_________________________________________________________________\n" 294 | ] 295 | } 296 | ], 297 | "source": [ 298 | "NaiveConvNet_model = NaiveConvNet((224,224,3), 1000)\n", 299 | "NaiveConvNet_model.summary()" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": 98, 305 | "metadata": {}, 306 | "outputs": [], 307 | "source": [ 308 | "def Simple_MobileNetV1(input_shape, k):\n", 309 | " inputs = Input(shape=input_shape)\n", 310 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu', name='m_conv_1')(inputs)\n", 311 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu', name = 'm_dc_2')(x)\n", 312 | " x = Conv2D(filters=64, kernel_size=(1,1),padding='same', activation='relu', name = 'm_pc_2')(x)\n", 313 | " x = DepthwiseConv2D(kernel_size=(3,3), padding='same', activation='relu', name = 'm_dc_3')(x)\n", 314 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu', name = 'm_pc_3')(x)\n", 315 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu', name = 'm_dc_4')(x)\n", 316 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu', name = 'm_pc_4')(x)\n", 317 | " x = GlobalAveragePooling2D(name='m_gap')(x)\n", 318 | " x = BatchNormalization(name='m_bn_1')(x)\n", 319 | " x = Dense(128, activation='relu', name='m_fc1')(x)\n", 320 | " x = BatchNormalization(name='m_bc_2')(x)\n", 321 | " x = Dense(k, activation='softmax', name='m_output')(x)\n", 322 | " model = Model(inputs, x)\n", 323 | " return model" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": 99, 329 | "metadata": {}, 330 | "outputs": [ 331 | { 332 | "name": "stdout", 333 | "output_type": "stream", 334 | "text": [ 335 | "_________________________________________________________________\n", 336 | "Layer (type) Output Shape Param # \n", 337 | "=================================================================\n", 338 | "input_45 (InputLayer) (None, 28, 28, 1) 0 \n", 339 | "_________________________________________________________________\n", 340 | "m_conv_1 (Conv2D) (None, 14, 14, 32) 320 \n", 341 | "_________________________________________________________________\n", 342 | "m_dc_2 (DepthwiseConv2D) (None, 14, 14, 32) 320 \n", 343 | "_________________________________________________________________\n", 344 | "m_pc_2 (Conv2D) (None, 14, 14, 64) 2112 \n", 345 | "_________________________________________________________________\n", 346 | "m_dc_3 (DepthwiseConv2D) (None, 14, 14, 64) 640 \n", 347 | "_________________________________________________________________\n", 348 | "m_pc_3 (Conv2D) (None, 14, 14, 128) 8320 \n", 349 | "_________________________________________________________________\n", 350 | "m_dc_4 (DepthwiseConv2D) (None, 7, 7, 128) 1280 \n", 351 | "_________________________________________________________________\n", 352 | "m_pc_4 (Conv2D) (None, 7, 7, 128) 16512 \n", 353 | "_________________________________________________________________\n", 354 | "m_gap (GlobalAveragePooling2 (None, 128) 0 \n", 355 | "_________________________________________________________________\n", 356 | "m_bn_1 (BatchNormalization) (None, 128) 512 \n", 357 | "_________________________________________________________________\n", 358 | "m_fc1 (Dense) (None, 128) 16512 \n", 359 | "_________________________________________________________________\n", 360 | "m_bc_2 (BatchNormalization) (None, 128) 512 \n", 361 | "_________________________________________________________________\n", 362 | "m_output (Dense) (None, 10) 1290 \n", 363 | "=================================================================\n", 364 | "Total params: 48,330\n", 365 | "Trainable params: 47,818\n", 366 | "Non-trainable params: 512\n", 367 | "_________________________________________________________________\n" 368 | ] 369 | } 370 | ], 371 | "source": [ 372 | "Simple_MobileNetV1_model = Simple_MobileNetV1((28,28,1), 10)\n", 373 | "Simple_MobileNetV1_model.summary()\n" 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "execution_count": 100, 379 | "metadata": {}, 380 | "outputs": [ 381 | { 382 | "name": "stdout", 383 | "output_type": "stream", 384 | "text": [ 385 | "Epoch 1/10\n", 386 | "60000/60000 [==============================] - 73s 1ms/step - loss: 0.5256 - acc: 0.8251\n", 387 | "Epoch 2/10\n", 388 | "60000/60000 [==============================] - 76s 1ms/step - loss: 0.2198 - acc: 0.9326\n", 389 | "Epoch 3/10\n", 390 | "60000/60000 [==============================] - 78s 1ms/step - loss: 0.1668 - acc: 0.9492\n", 391 | "Epoch 4/10\n", 392 | "60000/60000 [==============================] - 76s 1ms/step - loss: 0.1414 - acc: 0.9583\n", 393 | "Epoch 5/10\n", 394 | "60000/60000 [==============================] - 67s 1ms/step - loss: 0.1210 - acc: 0.9638\n", 395 | "Epoch 6/10\n", 396 | "60000/60000 [==============================] - 66s 1ms/step - loss: 0.1099 - acc: 0.9678\n", 397 | "Epoch 7/10\n", 398 | "60000/60000 [==============================] - 71s 1ms/step - loss: 0.1056 - acc: 0.9701\n", 399 | "Epoch 8/10\n", 400 | "60000/60000 [==============================] - 65s 1ms/step - loss: 0.0976 - acc: 0.9721\n", 401 | "Epoch 9/10\n", 402 | "60000/60000 [==============================] - 63s 1ms/step - loss: 0.0924 - acc: 0.9732\n", 403 | "Epoch 10/10\n", 404 | "60000/60000 [==============================] - 64s 1ms/step - loss: 0.0899 - acc: 0.9746\n" 405 | ] 406 | } 407 | ], 408 | "source": [ 409 | "Simple_MobileNetV1_model.compile(optimizer=optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['acc'])\n", 410 | "Simple_MobileNetV1_history = Simple_MobileNetV1_model.fit(train_x, train_y, epochs=10, batch_size=8)" 411 | ] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "execution_count": 96, 416 | "metadata": {}, 417 | "outputs": [], 418 | "source": [ 419 | "def Simple_NaiveConvNet(input_shape, k):\n", 420 | " inputs = Input(shape=input_shape)\n", 421 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu', name='n_conv_1')(inputs)\n", 422 | " x = Conv2D(filters=64, kernel_size=(3,3),padding='same', activation='relu', name='n_conv_2')(x)\n", 423 | " x = Conv2D(filters=128, kernel_size=(3,3),padding='same', activation='relu', name='n_conv_3')(x)\n", 424 | " x = Conv2D(filters=128, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu', name='n_conv_4')(x)\n", 425 | " x = GlobalAveragePooling2D(name='n_gap')(x)\n", 426 | " x = BatchNormalization(name='n_bn_1')(x)\n", 427 | " x = Dense(128, activation='relu', name='n_fc1')(x)\n", 428 | " x = BatchNormalization(name='n_bc_2')(x)\n", 429 | " x = Dense(k, activation='softmax', name='n_output')(x)\n", 430 | " model = Model(inputs, x)\n", 431 | " return model" 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "execution_count": 97, 437 | "metadata": {}, 438 | "outputs": [ 439 | { 440 | "name": "stdout", 441 | "output_type": "stream", 442 | "text": [ 443 | "_________________________________________________________________\n", 444 | "Layer (type) Output Shape Param # \n", 445 | "=================================================================\n", 446 | "input_44 (InputLayer) (None, 28, 28, 1) 0 \n", 447 | "_________________________________________________________________\n", 448 | "n_conv_1 (Conv2D) (None, 14, 14, 32) 320 \n", 449 | "_________________________________________________________________\n", 450 | "n_conv_2 (Conv2D) (None, 14, 14, 64) 18496 \n", 451 | "_________________________________________________________________\n", 452 | "n_conv_3 (Conv2D) (None, 14, 14, 128) 73856 \n", 453 | "_________________________________________________________________\n", 454 | "n_conv_4 (Conv2D) (None, 7, 7, 128) 147584 \n", 455 | "_________________________________________________________________\n", 456 | "n_gap (GlobalAveragePooling2 (None, 128) 0 \n", 457 | "_________________________________________________________________\n", 458 | "n_bn_1 (BatchNormalization) (None, 128) 512 \n", 459 | "_________________________________________________________________\n", 460 | "n_fc1 (Dense) (None, 128) 16512 \n", 461 | "_________________________________________________________________\n", 462 | "n_bc_2 (BatchNormalization) (None, 128) 512 \n", 463 | "_________________________________________________________________\n", 464 | "n_output (Dense) (None, 10) 1290 \n", 465 | "=================================================================\n", 466 | "Total params: 259,082\n", 467 | "Trainable params: 258,570\n", 468 | "Non-trainable params: 512\n", 469 | "_________________________________________________________________\n" 470 | ] 471 | } 472 | ], 473 | "source": [ 474 | "Simple_NaiveConvNet_model = Simple_NaiveConvNet((28,28,1), 10)\n", 475 | "Simple_NaiveConvNet_model.summary()" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": 101, 481 | "metadata": {}, 482 | "outputs": [ 483 | { 484 | "name": "stdout", 485 | "output_type": "stream", 486 | "text": [ 487 | "Epoch 1/10\n", 488 | "60000/60000 [==============================] - 139s 2ms/step - loss: 0.2385 - acc: 0.9263\n", 489 | "Epoch 2/10\n", 490 | "60000/60000 [==============================] - 146s 2ms/step - loss: 0.1085 - acc: 0.9688\n", 491 | "Epoch 3/10\n", 492 | "60000/60000 [==============================] - 139s 2ms/step - loss: 0.0833 - acc: 0.9765\n", 493 | "Epoch 4/10\n", 494 | "60000/60000 [==============================] - 141s 2ms/step - loss: 0.0720 - acc: 0.9797\n", 495 | "Epoch 5/10\n", 496 | "60000/60000 [==============================] - 141s 2ms/step - loss: 0.0686 - acc: 0.9805\n", 497 | "Epoch 6/10\n", 498 | "60000/60000 [==============================] - 140s 2ms/step - loss: 0.0593 - acc: 0.9834\n", 499 | "Epoch 7/10\n", 500 | "60000/60000 [==============================] - 134s 2ms/step - loss: 0.0531 - acc: 0.9852\n", 501 | "Epoch 8/10\n", 502 | "60000/60000 [==============================] - 138s 2ms/step - loss: 0.0513 - acc: 0.9858\n", 503 | "Epoch 9/10\n", 504 | "60000/60000 [==============================] - 142s 2ms/step - loss: 0.0476 - acc: 0.9869\n", 505 | "Epoch 10/10\n", 506 | "60000/60000 [==============================] - 160s 3ms/step - loss: 0.0463 - acc: 0.9877\n" 507 | ] 508 | } 509 | ], 510 | "source": [ 511 | "Simple_NaiveConvNet_model.compile(optimizer=optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['acc'])\n", 512 | "Simple_NaiveConvNet_history = Simple_NaiveConvNet_model.fit(train_x, train_y, epochs=10, batch_size=8)" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 106, 518 | "metadata": {}, 519 | "outputs": [], 520 | "source": [ 521 | "s_acc = Simple_NaiveConvNet_history.history['acc']\n", 522 | "s_loss = Simple_NaiveConvNet_history.history['loss']\n", 523 | "\n", 524 | "m_acc = Simple_MobileNetV1_history.history['acc']\n", 525 | "m_loss = Simple_MobileNetV1_history.history['loss']\n", 526 | "\n", 527 | "epochs = range(1, len(s_acc)+1)" 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "execution_count": 107, 533 | "metadata": {}, 534 | "outputs": [ 535 | { 536 | "data": { 537 | "text/plain": [ 538 | "" 539 | ] 540 | }, 541 | "execution_count": 107, 542 | "metadata": {}, 543 | "output_type": "execute_result" 544 | }, 545 | { 546 | "data": { 547 | "image/png": "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RES+FpF1InJlA+uPisj9/ircZ1kZEBELyemt/tHGBJuIiAimT5/O//zP/xy37p133uH8889n+PDhXHrppRw4cABwAnHGjBkUFhbSr18/PB4PAMXFxfTp04eKigp27NjBpEmTGDFiBGPGjOGbb7457v0fe+wxZs+ezdlnnw1AeHg4P/mJMyJv165dTJgwgdTUVC655BJ2794NwO23387dd9/N6NGjGTBgAAsXLgRg2rRp/Otftfdzuv3222vWpaWlER8fz+LFi4+rYfXq1YwbN44RI0Zw+eWXk5OTw8KFC8nMzOT73/8+w4YNo6Sk5Lj9FixYwD333EPfvn1ZuXJlTfuqVasYPXo0aWlpjBw5kiNHjlBVVcX999/POeecQ2pqKk899ZQP/2V81+joHREJB54BJuLc83aViCxyb5xS7dfA66r6ZxEZjHPDlf5e6/8beN9vVTdFVgb0HQUR0QH5eGNawm/f2cimfUV+fc/BveJ46DtDGt3upz/9KampqTzwwAN12i+66CI+//xzRITnnnuOxx57jD/96U816+Pj4xk2bBjLli1j/PjxvPvuu1x++eVERkYyffp0nn32WQYOHMgXX3zBXXfdxZIlS+q8/4YNG07YnTNz5kxuu+02brvtNubPn8/dd9/NW2+9BUBOTg4rVqzgm2++YfLkydxwww1MnTqV119/nauuuory8nI+/vhj/vznP/PFF18AMHv2bB588EEmTpxY8xkVFRXMnDmTt99+m6SkJF577TVmz57N/Pnzefrpp3n88cdJTz/+4LK0tJSPPvqIv/zlLxQUFLBgwQJGjx5NeXk5U6dO5bXXXuO8886jqKiI2NhY5s2bx65du1izZg0RERHk5+c3+t+kKXwZsjkS2K6qOwFE5FVgCnXvdatAnLscD9T8nSMi1wBZQLE/Cm6Sowfh4CYYemOrf7QxwSouLo5bb72V//3f/yU2NramPTs7m6lTp5KTk0N5eXmDQwqrQ278+PG8+uqr3HXXXRw9epTPPvuMG2+s/XdaVlbWpJpWrlzJm2++CcAtt9xS5xfSNddcQ1hYGIMHD6756+OKK67gnnvuoaysjH//+9+MHTu2zncZO9Y5B7hixYqati1btrBhw4aaXwRVVVX07Nmz0dreffddxo8fT2xsLNdffz2/+93veOKJJ9iyZQs9e/bkvPPOA5yfK8BHH33E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\n", 548 | "text/plain": [ 549 | "
" 550 | ] 551 | }, 552 | "metadata": {}, 553 | "output_type": "display_data" 554 | } 555 | ], 556 | "source": [ 557 | "plt.plot(epochs, s_acc, label='Naive ConvNet Acc')\n", 558 | "plt.plot(epochs, m_acc, label='MobileNet Acc')\n", 559 | "plt.legend()" 560 | ] 561 | }, 562 | { 563 | "cell_type": "code", 564 | "execution_count": 108, 565 | "metadata": {}, 566 | "outputs": [ 567 | { 568 | "data": { 569 | "text/plain": [ 570 | "" 571 | ] 572 | }, 573 | "execution_count": 108, 574 | "metadata": {}, 575 | "output_type": "execute_result" 576 | }, 577 | { 578 | "data": { 579 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xl8VPW9//HXZ2aSTBaSAAlrgCTIFiCAbBYREhZBQLCLBetG8dZ6raK3eq0t1+ql2nqtdal6pe79Va8bVcGtFkEQVFSoiOxrgAhCSEiA7JP5/v44k5CVDMkkJ5n5PB+PPOZsM+fjqO9z5nu+53vEGINSSqng4rC7AKWUUoGn4a6UUkFIw10ppYKQhrtSSgUhDXellApCGu5KKRWENNyVUioIabgrpVQQ0nBXSqkg5LJrxwkJCSY5Odmu3SulVLu0cePG48aYxMa2sy3ck5OT2bBhg127V0qpdklEDviznTbLKKVUENJwV0qpIKThrpRSQci2NnelVE3l5eVkZ2dTUlJidymqDXC73SQlJREWFtak92u4K9VGZGdn06FDB5KTkxERu8tRNjLGkJubS3Z2NikpKU36DG2WUaqNKCkpoXPnzhrsChGhc+fOzfoVp+GuVBuiwa4qNfe/hfYX7oe+gBV3gz4eUCmlGtT+wv3I1/DJI5C3z+5KlAo6IsJtt91WNf/ggw9yzz33nPU9y5cv5/777w/I/t9//31GjRpFWloaI0aMqFFLIKxevRoR4e23365aNmvWLFavXn3W973wwgscPny43nXz589n6dKlgSwzINpfuKdmWq/7VttahlLBKCIigjfeeIPjx4/7/Z7Zs2dz5513NnvfW7Zs4aabbuLFF19k27ZtbNiwgfPOO6/Zn1tbUlIS99133zm952zh3la1v3Dv3Bdik2DfR3ZXolTQcblcXH/99Tz88MN11r399tuMHTuWESNGMGXKFI4ePQpYwXfTTTdRUFBAnz598Hq9ABQWFtKrVy/Ky8vZu3cv06dPZ+TIkVx00UXs2LGjzuc/8MADLFq0iIEDBwLgdDr593//dwCysrKYNGkS6enpTJ48mYMHDwLWWfPChQsZN24cqampVWfQ8+bN491336367Opn18OGDSMuLo4VK1bUqWHjxo1MnDiRkSNHMm3aNI4cOcLSpUvZsGEDV155JcOHD6e4uLjB72/lypWMGDGCoUOHsmDBAkpLSwG48847SUtLIz09ndtvvx2A119/nSFDhjBs2DAmTJhwtn8tTdL+ukKKQN8M2P42eCvA4bS7IqUC7r/f3sq2wycD+plpPWK5+9LBjW73i1/8gvT0dO64444ay8ePH8/69esREZ555hkeeOAB/vSnP1Wtj4uLY/jw4axZs4bMzEzeeecdpk2bRlhYGNdffz1LliyhX79+fP7559x4442sWrWqxudv2bKlwWaYm2++mWuvvZZrr72W5557joULF/LWW28BcOTIEdatW8eOHTuYPXs2P/rRj5g7dy6vvfYaM2fOpKysjJUrV/Lkk0/y+eefA7Bo0SLuuusupk6dWrWP8vJybr75ZpYtW0ZiYiKvvvoqixYt4rnnnuPxxx/nwQcfZNSoUQ1+byUlJcyfP5+VK1fSv39/rrnmGp588kmuvvpq3nzzTXbs2IGIkJ+fD8DixYv54IMP6NmzZ9WyQGp/Z+5gNc2UFMDhTXZXolTQiY2N5ZprruHPf/5zjeXZ2dlMmzaNoUOH8sc//pGtW7fWee/cuXN59dVXAXjllVeYO3cup0+f5tNPP+Xyyy9n+PDh/PznP+fIkSPnVNNnn33GT37yEwCuvvpq1q1bV7Xusssuw+FwkJaWVvVr4pJLLuGjjz6itLSU999/nwkTJhAZGVn1nsoz5eqfs3PnTrZs2cLUqVMZPnw49957L9nZ2X7XuHPnTlJSUujfvz8A1157LR9//DFxcXG43W6uu+463njjDaKiogC48MILmT9/Pk8//TQVFRXn9H34o/2duQOkTLRe962CpJH21qJUC/DnDLsl3XrrrZx//vn89Kc/rVp2880388tf/pLZs2ezevXqei+0zp49m9/85jfk5eWxceNGJk2aRGFhIfHx8WzadPaTscGDB7Nx40aGDRt2TrVGRERUTRtfLzq3201GRgYffPABr776KvPmzavzvkWLFnHvvfficrmq3jt48GA+++yzc9p/Y1wuF1988QUrV65k6dKlPP7446xatYolS5bw+eef8+677zJy5Eg2btxI586dA7bf9nnmHpMI3YbCvjV2V6JUUOrUqRM//vGPefbZZ6uWFRQU0LNnTwD++te/1vu+mJgYRo8ezS233MKsWbNwOp3ExsaSkpLC66+/Dlgh+vXXX9d573/+53/y+9//nl27dgHg9XpZsmQJAOPGjeOVV14B4KWXXuKiiy5q9J9h7ty5PP/886xdu5bp06fXWX/xxRdz4sQJNm/eDMCAAQPIycmpCvfy8vKqXycdOnTg1KlTZ93fgAEDyMrKYs+ePQD87W9/Y+LEiZw+fZqCggJmzJjBww8/XPXPvnfvXsaOHcvixYtJTEzk0KFDjf4znQu/wl1EpovIThHZIyJ1LouLyHwRyRGRTb6/fwtolfVJzYSD66GssMV3pVQouu2222r0mrnnnnu4/PLLGTlyJAkJCQ2+b+7cubz44ovMnTu3atlLL73Es88+y7Bhwxg8eDDLli2r87709HQeeeQRrrjiCgYNGsSQIUPYt8/q8vzYY4/x/PPPk56ezt/+9jceffTRRuu/+OKLWbNmDVOmTCE8PLzebRYtWlQVquHh4SxdupRf/epXDBs2jOHDh/Ppp58C1gXZG2644awXVN1uN88//zyXX345Q4cOxeFwcMMNN3Dq1ClmzZpFeno648eP56GHHgKsg9nQoUMZMmQI48aNO+dfLI0R08jNQCLiBHYBU4Fs4EvgCmPMtmrbzAdGGWNu8nfHo0aNMs16WMeelfDiD+DKpdBvauPbK9XGbd++nUGDBtldhmpD6vtvQkQ2GmMavrLr48+Z+xhgjzFmnzGmDHgFmNOkSgOpzzhwRmh/d6WUqoc/4d4TqN4YlO1bVtsPRWSziCwVkV4Bqe5swiKh9wWwV/u7K6VUbYG6oPo2kGyMSQdWAPVebRGR60Vkg4hsyMnJaf5eUzPg2FY4dbT5n6WUUkHEn3D/Fqh+Jp7kW1bFGJNrjCn1zT4D1Ns/0RjzlDFmlDFmVGJiow/vblxf31AE+7XXjFJKVedPuH8J9BORFBEJB+YBy6tvICLdq83OBrYHrsSz6DYMIjtq04xSStXS6E1MxhiPiNwEfAA4geeMMVtFZDGwwRizHFgoIrMBD5AHzG/Bms9wOKwbmvZ9ZA0BrGNhK6UU4GebuzHmPWNMf2NMX2PMfb5lv/UFO8aYXxtjBhtjhhljMo0xdUcFail9M+HUETi+q9V2qVSwEhGuuuqqqnmPx0NiYiKzZs066/vuueceHnzwwTrLDx8+zI9+9CPAGm63sc8JpSF5W1r7vEO1usohgLVpRqlmi46OZsuWLVU36qxYsaLqrtSm6NGjxzkHa6gMydvS2n+4d+wDHVN0CGClAmTGjBlVw+W+/PLLXHHFFVXr8vLyuOyyy0hPT+eCCy6ounUf4Ouvv+Z73/se/fr14+mnnwasoXqHDBlSZx+FhYUsWLCAMWPGMGLEiBp3rIbKkLwtrX0OHFZb30zY/BpUlIMzzO5qlGq+9++E774J7Gd2GwqXNP7EpHnz5rF48WJmzZrF5s2bWbBgAWvXrgXg7rvvZsSIEbz11lusWrWKa665pmpAsM2bN7N+/XoKCwsZMWIEM2fObHAf9913H5MmTeK5554jPz+fMWPGMGXKlKr1oTAkb0tr/2fuYPV3LzsN2c0YzkApBVhjvGRlZfHyyy8zY8aMGuvWrVvH1VdfDcCkSZPIzc3l5Elr3Pk5c+YQGRlJQkICmZmZfPHFFw3u45///Cf3338/w4cPJyMjg5KSkqoHcEBoDMnb0oLjzD1lAojDaprp8z27q1Gq+fw4w25Js2fP5vbbb2f16tXk5ub69R6p1Vut9nx1xhj+/ve/M2DAgBrLK8djh+AfkrelBceZe2RH6DFCx5lRKkAWLFjA3XffzdChQ2ssv+iii3jppZcAq2dLQkICsbGxACxbtoySkhJyc3NZvXo1o0ePbvDzp02bxmOPPVY1/vpXX31VZ5tgH5K3pQXHmTtYTTPrHrGe0OSOs7sapdq1pKQkFi5cWGf5Pffcw4IFC0hPTycqKqrGuO7p6elkZmZy/Phx7rrrLnr06EFWVla9n3/XXXdx6623kp6ejtfrJSUlhXfeeafOdosWLWLOHGucwsoheRcuXEhBQQEej4dbb72VwYMHVw3JGxkZyWeffVbjqUuVqg/J6/F4GD16NDfccAN5eXnMmTOHkpISjDE1huTdvXs3xhgmT54c8CF5W1qjQ/62lGYP+Vvb/rXw11kw7/9gYMMXcpRqq3TIX1VbSw/52z70GgNhUdo0o5RSBFO4uyKsMd71ZiallAqicAfrbtXc3VDgf/copdoSu5pJVdvT3P8WgivcK4cA1qYZ1Q653W5yc3M14BXGGHJzc3G73U3+jODpLQPQJQ2iu1hNMyOuanx7pdqQpKQksrOzCciDbFS753a7SUpKavL7gyvcRawukXtXgddrDQmsVDsRFhZGSkqK3WWoIBF86dc3E4qOW4/fU0qpEBV84Z6aYb1qrxmlVAgLvnCP7QEJA/SiqlIqpAVfuIPVNHPgUygvsbsSpZSyRXCGe2oGeIrh0Od2V6KUUrYIznBPHg8OlzbNKKVCVnCGe0QHSBqtj95TSoWs4Ax3sJpmDm+Cojy7K1FKqVYXxOGeCRjY/7HdlSilVKsL3nDvORLCO2jTjFIqJAVvuDtdkHKR3syklApJwRvuYDXN5B+AvP12V6KUUq0qyMM9w3rVphmlVIgJ7nBP6AexPbVpRikVcoI73EWsppn9H4O3wu5qlFKq1QR3uIPVNFOSD0c22V2JUkq1mtAId9CmGaVUSAn+cI9JhK5DdZwZpVRI8SvcRWS6iOwUkT0icudZtvuhiBgRGRW4EgMgdaI1QmRZkd2VKKVUq2g03EXECTwBXAKkAVeISFo923UAbgHa3ji7fTOhoswa410ppUKAP2fuY4A9xph9xpgy4BVgTj3b/Q74H6DtPSGj9zhwhmt/d6VUyPAn3HsCh6rNZ/uWVRGR84Fexph3A1hb4IRHQa+x2u6ulAoZzb6gKiIO4CHgNj+2vV5ENojIhpycnObu+tz0zYSjW+D0sdbdr1JK2cCfcP8W6FVtPsm3rFIHYAiwWkSygAuA5fVdVDXGPGWMGWWMGZWYmNj0qpsiNdN63bemdferlFI28CfcvwT6iUiKiIQD84DllSuNMQXGmARjTLIxJhlYD8w2xmxokYqbqvswcMdru7tSKiQ0Gu7GGA9wE/ABsB14zRizVUQWi8jsli4wYBxOq0vkvtVgjN3VKKVUi3L5s5Ex5j3gvVrLftvAthnNL6uFpGbCtmVwfDck9re7GqWUajHBf4dqdakZ1qs2zSilglxohXunFOiYrF0ilVJBL7TCHXxDAK+FinK7K1FKqRYTguGeAWWn4NuNdleilFItJvTCPWUCINo0o5QKaqEX7lGdoMdwHd9dKRXUQi/cwWp3z/4SSk7aXYlSSrWI0Az3vplgKuDAJ3ZXopRSLSI0w73XWHBFatOMUipohWa4uyKgzzi9mUkpFbRCM9zBapo5vgsKvm18W6WUamdCN9xTM6xX7RKplApCoRvuXQZDdKI2zSilglLohrvDYZ296xDASqkgFLrhDla4F+bA0a12V6KUUgEV4uFe+eg9bZpRSgWX0A73uJ6Q0F8vqiqlgk5ohztYTTNZn4Cn1O5KlFIqYDTcUzPBUwyHvrC7EqWUChgN9+TxIE5td1dKBRUNd3csJI3ScWaUUkFFwx2sppnDX0HxCbsrUUqpgNBwB2ucGQzs/9juSpRSKiA03AF6joTwDto0o5QKGhruAM4w68Kq9ndXSgUJDfdKfTPhxH44kWV3JUop1Wwa7pVSM6xXbZpRSgUBDfdKCf2hQw9tmlFKBQUN90oi1tn7/jXgrbC7GqWUahYN9+r6Zlp93Y98bXclSinVLBru1aVmWK/aNKOUauc03KuL6WI9fk/HmVFKtXMa7rX1zYSD66GsyO5KlFKqyfwKdxGZLiI7RWSPiNxZz/obROQbEdkkIutEJC3wpbaS1EyoKIODn9ldiVJKNVmj4S4iTuAJ4BIgDbiinvD+P2PMUGPMcOAB4KGAV9pa+nwPnOHaNKOUatf8OXMfA+wxxuwzxpQBrwBzqm9gjDlZbTYaMIErsZWFR0OvsbB3td2VKKVUk/kT7j2BQ9Xms33LahCRX4jIXqwz94X1fZCIXC8iG0RkQ05OTlPqbR2pGXD0GzjdhmtUSqmzCNgFVWPME8aYvsCvgP9qYJunjDGjjDGjEhMTA7XrwEvNtF73r7G3DqWUaiJ/wv1boFe1+STfsoa8AlzWnKJs12M4uON1nBmlVLvlT7h/CfQTkRQRCQfmAcurbyAi/arNzgR2B65EGzickDLBupnJtN/LB0qp0NVouBtjPMBNwAfAduA1Y8xWEVksIrN9m90kIltFZBPwS+DaFqu4taRmwMlsyN1jdyVKKXXOXP5sZIx5D3iv1rLfVpu+JcB12a+vr91932pI6HfWTZVSqq3RO1Qb0ikV4vtou7tSql3ScD+b1AzIWgsVHrsrUUqpc6LhfjZ9M6H0JBz+l92VKKXUOdFwP5uUiYBo04xSqt3RcD+bqE7QfZiOM6OUanc03BvTNxOyv4TSU3ZXopRSftNwb0xqJng9kPWJ3ZUopZTfNNwb02ssuNzaNKOUalc03BsT5oY+4/S5qkqpdkXD3R+pGZCzA04etrsSpZTyi4a7P1KrDUWglFLtgIa7P7oOgagEDXelVLuh4e4PhwNSJ+oQwEqpdkPD3V+pmXD6KBzbZnclSinVKA13f6VmWK/aNKOUagc03P0V3ws6n6fjzCil2gUN93ORmgkHPgFPqd2VKKXUWWm4n4u+mVBeZI01o5RSbVi7C3ev17D9yEl7dp48HsSpTTNKqTav3YX7Ix/u4rInPuFAbmHr79wdBz1H6jgzSqk2r92F+0/G9iHM6WDRm1swdvQ575sJh7+C4hOtv2+llPJTuwv3bnFu7pg+gHV7jvPWpm9bv4DUDDBe2L+29fetlFJ+anfhDnDl2D6M6B3P797ZzonCstbdedJoCI/R/u5KqTatXYa70yH84QdDOVlczn3vbW/lnYdZF1a13V0p1Ya1y3AHGNgtlp9NSGXpxmw+3XO8dXeemgF5++DEgdbdr1JK+andhjvALZP70adzFIve2kJJeUXr7ViHAFZKtXHtOtzdYU7uu2wo+48X8sRHe1pvx4kDoEN32PNh6+1TKaXOQbsOd4Dx/RL4wYieLFmzl11HT7XOTkVg4CzYvhyWXgeFrdwspJRSjWj34Q6waOYgYiJc/PqNb/B6W6nv+7TfQ8ZvYNsyeHw0bH5Nx3pXSrUZQRHunWMiWDQzjY0HTvDylwdbZ6eucMj4FdywFjr3hTd+Bi9dDvmHWmf/Sil1FkER7gA/PL8n4/p25v73d3DsZEnr7bjLIFjwAUz/H2vEyP+9AL54Grze1qtBKaVqCZpwFxHu+/5QSj1e/vvtVn5aksMJF9wAN66HXmPgvdvh+UsgZ1fr1qGUUj5+hbuITBeRnSKyR0TurGf9L0Vkm4hsFpGVItIn8KU2LiUhmoWTzuPdb46wcvvR1i+gYx+46g24bAnk7IAlF8LHf4SK8tavRSkV0hoNdxFxAk8AlwBpwBUiklZrs6+AUcaYdGAp8ECgC/XX9RP60r9rDL9dtpXCUk/rFyACw6+Am76EgTNh1b3wVAZ8+6/Wr0UpFbL8OXMfA+wxxuwzxpQBrwBzqm9gjPnIGFPkm10PJAW2TP+Fuxz84QdD+Ta/mIdW2NgsEtMFLn8B5v0fFOXCM5Phn/8FZUWNvlUppZrLn3DvCVTvApLtW9aQ64D3m1NUc43s04krx/bm+U/28012gZ2lWGfvN66H86+BTx+DJ8fB/o/trUkpFfQCekFVRK4CRgF/bGD99SKyQUQ25OTkBHLXddwxfSAJMRHc+cZmPBU291yJjIdLH4Vr37Gabf56KSy/GYrz7a1LKRW0/An3b4Fe1eaTfMtqEJEpwCJgtjGm3idIG2OeMsaMMsaMSkxMbEq9fouLDOOe2YPZevgkz3+S1aL78lvKRfDvn8KFt8BXL8ITY2H7O3ZXpZQKQv6E+5dAPxFJEZFwYB6wvPoGIjIC+AtWsB8LfJlNc8mQbkwe2IWHVuziUF4baesOi4Spi+FnqyA6EV69El67Bk7Z0LtHKRW0Gg13Y4wHuAn4ANgOvGaM2Soii0Vktm+zPwIxwOsisklEljfwca1KRFh82RBE4K5lNj2WryE9RsD1H8Gku2DnP+CJMfDVSzqEgVIqIMSuwBs1apTZsGFDq+zr2XX7+d0723jsihFcOqxHq+zznOTsgrcXwsHPrOGEL33U6jOvlFK1iMhGY8yoxrYLmjtUz2b+uGTSk+L477e3UVDUBm8oSuwP89+DGQ9C9pfWEAbrnwRvK45Rr5QKKiER7k6H8PvvD+VEURn3/6OVH8vnL4cDxvzM6jaZPB7+cSc8ezEca6P1KqXatJAId4AhPeO4bnwKL39xiC/259ldTsPie8FPXoMfPGM9ym/JRbD6fvC08oPAlVLtWsiEO8CtU/rRMz6SX7+xmVJPG27yEIH0y60hDAZfBqv/AH+ZANmtc41CKdX+hVS4R4W7uPf7Q9ibU8iS1fvsLqdx0Qnww2esM/nSk/DMFPjHr6Gs0O7KlFJtXEiFO0DmgC5cOqwHT3y0hz3HTttdjn/6T7Pa4kdfB+v/17rguneV3VUppdqwkAt3gN/OSsMd5mDRm9+0rb7vZ+OOhZl/gp++D85w+Nv34a0boagNXz9QStkmJMM9sUMEv5kxiM/35/H6hmy7yzk3fcbBDZ/A+F/C169YQxh8/hcoqDMihFIqhIVkuAP8eFQvxiR34r73tnP8dL1D4bRdYW6YcjdcvxrikuD9O+DhNGvc+DV/hKNb9U5XpUJcSNyh2pA9x04x49F1XDK0G4/OG2FrLU1mDBzfBTvehZ3vWTdBAXRMhgEzYeAM6HUBOF22lqmUCgx/71AN6XAHeHjFLh5duZsXfjqajAFd7C6n+U59Bzvft4J+32qoKIPITtB/uhX0fSdBeLTdVSqlmkjD3U+lngoueXQtZR4v//yPCUSFB9EZbukp2LPSCvpd/4CSAnC5rfFrBs6A/pdATMsOvayUCiwN93Owfl8u855az88npPLrGYPsLqdlVJTDgU+toN/xHhQcBAR6jbGeFjVgJiScZ3eVSqlGaLifo18t3czSf2Wz/KYLGdwjzu5yWpYx8N03vqB/F77bbC1P6H8m6HuOtMa7UUq1KRru5yi/qIwpD62hZ3wkb9x4IU6H2F1S68k/aLXT73gXDnwCXg/EdIUBl1hBnzLB6qGjlLKdhnsTLNv0Lbe8som7L03jpxem2F2OPYpPwO4VVtDv+RDKTkNYNJw3GQbOgv4XQ2RHu6tUKmRpuDeBMYb5z3/Jhqw8VvxyIj3iI+0uyV6eUti/Fna8Y53Zn/4OxGndSDVwlnVRNr633VUqFVI03JvoUF4RUx9ew/jzEnn6mpGIhFDzzNl4vXD4K1/Qvwc5O6zlXYdaIT9wJnRLt0a0VEq1GA33ZvjLmr384f0dLLnqfKYP6W53OW1T7t4zF2QPrgcMRCVA8oWQfJH1wJHEgRr2SgWYhnszeCq8zH78E46fLuXD2yYS6w6zu6S2rfA47PoAstZazTgnfeP1VIZ9n/Fnwl574CjVLBruzfT1oXy+/7+fcOXYPvzusiF2l9N+GAP5ByBr3Zm/gkPWuqjO0KfWmb2GvVLnxN9wD6LbMQNrWK94rh2XzAufZnHZiJ6M7KM9RPwiYo1r0zEZRlxlLTtRK+y3L7eWR3aq1YwzSMNeqQDRM/ezOF3qYepDa4h1h/HOwvGEOTV4AuLEAas/fdY6qykn/6C1PLKT1ROnMuy7pGnYK1WLnrkHQEyEi9/NGcK//b8NPPXxPn6RqbfnB0THPtbf8J9Y81Vh/4kV9jvesZZHdvQ14/ja7LsM1rBXyk8a7o2YktaVS4Z049GVu5k5tDvJCTqiYsDVDvv8g76gXwcH1mnYK9UE2izjh6MnS5jypzWk94rjxevGat/31pZ/yHdmv9YK/BNZ1nJ3fM2w7zpEw14FPW2WCaCusW7uuGQgd721hTe/+pYfnJ9kd0mhJb4XxM+DYfOs+YLsM004Wetg57vWcncc9B4HiQOsC7qdUqzX2CR9WIkKOXrm7iev1/CjJZ+y/3ghK2/LoFN0uN0lqUqVYX9gnXVDVd5+8JafWe9wQVyvmoHfMeXMfEQHmwpX6txpP/cWsPO7U8z881rmDO/Jn348zO5yVEO8FXDysNV8c2K/9Zq3/8x88Yma20d1rhn2lV05O6ZAh+7a1KPaFG2WaQEDunXg5xNTeeKjvfzg/J5ceF6C3SWp+jicvqacXpByUd31xfnWjVbVA/9ElvX82a1vgqk4s60zwnfBN7n+A0BYiA8up9osPXM/RyXlFUx/5GMA/nHrBNxhTpsrUgFVUW7dUVvjbD/LOgDkZUHZqZrbx3Sr29TTMdkaLdMdZ4W/XoBXAaTNMi3okz3HufKZz7liTC9umdyfbnH6IIuQYAwU5VU72/cFfuX8ycNArf+fxGG16UfEQniMb7oDRMQ0sLzaX3i1bSJiwBXR+v/Mqs0JaLOMiEwHHgWcwDPGmPtrrZ8APAKkA/OMMUvPveT248LzErjqgt68uP4gL39xiPSkOKYM6srUtK4M7NZBu0oGKxGI7mz9JY2su768xDrrz9tvvZaesv7KTvumT0LpaetB5QXZ1Zafos5BoT7O8GqhH1vrINHAcne89VStDt2s+wT0v82Q0eiZu4g4gV3AVCAb+BK4whizrdo2yUAzEvgZAAAMRklEQVQscDuw3J9wb89n7mA92GPPsdOs2H6UFduOsulQPsZAUsdIpgzqysVpXRmd0kmHLFCN83qhvOhM0Jeespp/quZP+w4Mp2oeEGps71teXtTwfpzhVtDHdLGakzp0rf81OlG7jrZhgTxzHwPsMcbs833wK8AcoCrcjTFZvnXeJlXbDokI/bp2oF/XDtyYcR7HTpWwavsxVmw7ystfHOSFT7OIdbvIHNiFKYO6kjEgkQ46dLCqj8PhO9OOAZr5/IAKT80DQPEJ6wlap47Cad/fqe+sZqSDn0FxXj0fIhCdUH/wx3SxfgVU/hrQC8ptlj/h3hM4VG0+GxjbMuW0X106uJk3pjfzxvSmqMzD2t3H+XDbUVbuOMayTYcJcwoXpHZmalpXpgzqqo/wUy3D6YLIeOvPH56yM6FfGfy1X49uhdPHavYiqhQR5wv+rmcCv75Xd5w2CbWyVv3tJSLXA9cD9O4dvM/ejAp3MW1wN6YN7kaF1/DVwROs2GY13/x22VZ+u2wrg3vEVgX94B6x2k6v7OEKP9Nt9Gy8FdbF5KpfAd/VOhAcg283WOs8xXXf73BZAe+O971W+4usvqyB6TDttHCu/Glz/x5wjzFmmm/+1wDGmD/Us+0LwDuh0ObeVHtzTrNi21E+3HaUjQdPYAz0iHMzJc26IDs2pTPhLm2nV+2UMdb1gaoDgO+1KA9K8q2LybX/ivOhovTsn+uMqOdAENfAQcE3X7ltRKx1EAsSAesKKSIurAuqk4FvsS6o/sQYs7WebV9Aw91vx0+XsmqH1U6/dncOJeVeOkS4mDggkalpXckY0IW4SG2nVyGgvKRW6OfXevUdBOocHHzLvJ6zf35YlO8XQBS43Fa30gZfI+pZ3sC2zka2bYEL0wHt5y4iM7C6OjqB54wx94nIYmCDMWa5iIwG3gQ6AiXAd8aYwWf7TA33morLKvhkz3FWbDvKyh1HOX66DJdDGJvaiSmDrOabXp2i7C5TqbbHGKuXUKMHgXwoLwZPKXhKqr2WWNceaizzvfrTRfVsxOkL+/CaoT/xDhjyw6Z9pN7E1H55vYavDuXzoa+b5Z5jpwEY2K0DF6d1ZUpaV4b2jNN2eqVakjHWHcuVYV9RWuuAUPsgUdrAgaKebUbOh/MmN6ksDfcgsv94IR9uO8qK7UfZkJWH10C3WDeTB3VhalpXRid3IjpC+yUrFQo03INUXmEZq3Yc48NtR/l4dw5FZVb3tISYCPp0jqJPpyh6d46ypjtH06dTFJ2iw/UsX6kgoeEeAkrKK/hsXy7bDp/kYG4RB/IKOZhbxJGTJVT/1xoT4aJ3Jyvwe3eOItkX+r07R9E9LhKnQ4NfqfZCh/wNAe4wJ5kDupA5oEuN5SXlFWSfKOZAbiEHcos4mFfEgdxCdh49xcrtxyirOHMjcbjTQVLHyKrQrzwI9OkcRVLHKB31Uql2SsM9CLnDnJzXJYbzusTUWVfhNRwpKPad6Rf5wt86CGzIOsHp0jNdykSstn2ruSf6THOPb1q7aSrVdmm4hxinQ0jqaJ2Vj6u1zhhDXmEZB/KKrPCv1tSzcscxjp+ueaNJx6gwevuaePr4wj4q3EVUuBN3mJOocGeN6chwJ1FhLiLDnYQ5Ra8DKNWCNNxVFRGhc0wEnWMiOL93xzrrC0s9viaeM2f7B3KL+OrQCd795ggVXv+v3zgdQlSYFfiR4U4ifdNR4U4ifQeA6utrTFdt7yKy2oEjMsxJdLiL2EiXHjhUyNNwV36LjnAxqHssg7rH1lnnqfBSWFZBcVkFxeUVFJV5qk1X1Jgu8a0/M11RY/pEYXGdzyiv8P/AEeFy0CM+ku5xbnrER9Ijzk33+Mga0zHadVQFOf0vXAWEy+kgLtLRYu3w5RVeist9BwnfwaC43ENxmdc6CPjWnS71cPRkCYcLSjicX8y63cc5dqqE2j8qYt2uqgNA9/hIelZOx1nTXeMiiHDpxWTVfmm4q3YhzOkgzOkgtglj4pdXeDl2qpTD+cUczi/miC/4D+eXcKSgmK+zC8grLKvzvoSYCHrEu+kRF0l332uP+DPTiR0itBuparM03FXQC3M66Ok7O29IcVkFRwqs4P82v5gjvuA/XFDCnpzTrN2dQ2FZzfHMXQ6ha6ybHvHWGX+P+Miq6e5xbjpGh9MxKozIMKdeA1CtTsNdKSAy3ElqYgypiXW7j4LVk+hkicd35n/mrP9wvvUrYNOhfN7fcqTeawPhLgcdo8LoGBVu/UWHER8VXrWsajratz4qjFh3GA79VaCaQcNdKT+ICHGRYcRFhtV7QRmsAd+OF5ZyJL+E706WcKKwjBNF5eQXlXGi6Mz0zu9OkV9UTn5xeYM9jBwCcZGV4e87MPh+CcRHnTkIxPsOFpXb6XUCVUnDXakAcTiELh3cdOngZpgf23u9hlOlHl/4l3OiqIz8ojLyCuseEI4UlLD9yEnyisooKW/4UcXR4c4agd/B7aq6XmH9SZ1pl1MI9y1zVa2vu12N9zgchLsq328tD682HeZw6C8Pm2m4K2UTh+PMr4E+nf1/X0l5hRX8VQeBct983V8Kh/OL8XgN5R4v5V5DeYW3xnRLDi3ldEhV0EeEOapucIsKdxIdYd2jEB1h3dMQHW7dtxAdXnnzm2/bCJdvnXUPQ+WyyDCnXsxuhIa7Uu2MO8zpu2jbvIesG2Oo8Bo8XkNZhRdPhRX4ZR6vdUCo8Pr+ak17vHi8XsoqDB7f8urT1bf3VBhKPV5KPV6KyzxV90KcLvWQc6qUQt+9DIWl1v0M5/Y91DxgnJl2+Q4g1g1x0RFnloW7HFUHHafDgcsh1p9vPswhOH3zLoej2nTteeu9Tt/By+n7nLb0a0XDXakQJeILKidtYoA4r9dU3ehWeZNbUZmHwtK6yypvfCsq81DkW195oDhRVFzjQFJY5mnRXyjVOYQ6B4Wqg0jVvHDrlP5cOqxHi9ai4a6UahMcDiE6wuV78ExEwD7XGENJuXWzW+UvFOsXi/ULpca8b7rca6jwzXt8v24qvNavkspfOxUV3mrrrF8rles8vnXWct9n+eY9FYb4qJYfdE/DXSkV1ESkalyiUOKwuwCllFKBp+GulFJBSMNdKaWCkIa7UkoFIQ13pZQKQhruSikVhDTclVIqCGm4K6VUEBLTWvfl1t6xSA5wwJadB04CcNzuItoQ/T7O0O+iJv0+amrO99HHGJPY2Ea2hXswEJENxphRdtfRVuj3cYZ+FzXp91FTa3wf2iyjlFJBSMNdKaWCkIZ78zxldwFtjH4fZ+h3UZN+HzW1+Pehbe5KKRWE9MxdKaWCkIZ7E4hILxH5SES2ichWEbnF7prsJiJOEflKRN6xuxa7iUi8iCwVkR0isl1Evmd3TXYSkf/w/X+yRUReFhG33TW1FhF5TkSOiciWass6icgKEdnte+3YEvvWcG8aD3CbMSYNuAD4hYik2VyT3W4BtttdRBvxKPAPY8xAYBgh/L2ISE9gITDKGDMEcALz7K2qVb0ATK+17E5gpTGmH7DSNx9wGu5NYIw5Yoz5l2/6FNb/vD3trco+IpIEzASesbsWu4lIHDABeBbAGFNmjMm3tyrbuYBIEXEBUcBhm+tpNcaYj4G8WovnAH/1Tf8VuKwl9q3h3kwikgyMAD63txJbPQLcAXjtLqQNSAFygOd9zVTPiEi03UXZxRjzLfAgcBA4AhQYY/5pb1W262qMOeKb/g7o2hI70XBvBhGJAf4O3GqMOWl3PXYQkVnAMWPMRrtraSNcwPnAk8aYEUAhLfSzuz3wtSfPwTro9QCiReQqe6tqO4zVXbFFuixquDeRiIRhBftLxpg37K7HRhcCs0UkC3gFmCQiL9pbkq2ygWxjTOUvuaVYYR+qpgD7jTE5xphy4A1gnM012e2oiHQH8L0ea4mdaLg3gYgIVpvqdmPMQ3bXYydjzK+NMUnGmGSsC2WrjDEhe2ZmjPkOOCQiA3yLJgPbbCzJbgeBC0Qkyvf/zWRC+AKzz3LgWt/0tcCyltiJhnvTXAhcjXWWusn3N8PuolSbcTPwkohsBoYDv7e5Htv4fsEsBf4FfIOVOSFzt6qIvAx8BgwQkWwRuQ64H5gqIruxftnc3yL71jtUlVIq+OiZu1JKBSENd6WUCkIa7kopFYQ03JVSKghpuCulVBDScFdKqSCk4a6UUkFIw10ppYLQ/wegrX7KKbCvIgAAAABJRU5ErkJggg==\n", 580 | "text/plain": [ 581 | "
" 582 | ] 583 | }, 584 | "metadata": {}, 585 | "output_type": "display_data" 586 | } 587 | ], 588 | "source": [ 589 | "plt.plot(epochs, s_loss, label='Naive ConvNet loss')\n", 590 | "plt.plot(epochs, m_loss, label='MobileNet loss')\n", 591 | "plt.legend()" 592 | ] 593 | }, 594 | { 595 | "cell_type": "code", 596 | "execution_count": null, 597 | "metadata": {}, 598 | "outputs": [], 599 | "source": [] 600 | } 601 | ], 602 | "metadata": { 603 | "kernelspec": { 604 | "display_name": "Python 2", 605 | "language": "python", 606 | "name": "python2" 607 | }, 608 | "language_info": { 609 | "codemirror_mode": { 610 | "name": "ipython", 611 | "version": 3 612 | }, 613 | "file_extension": ".py", 614 | "mimetype": "text/x-python", 615 | "name": "python", 616 | "nbconvert_exporter": "python", 617 | "pygments_lexer": "ipython3", 618 | "version": "3.6.5" 619 | } 620 | }, 621 | "nbformat": 4, 622 | "nbformat_minor": 2 623 | } 624 | -------------------------------------------------------------------------------- /MobileNetV1_GPU.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 6, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import keras\n", 10 | "from keras.datasets import mnist\n", 11 | "from keras.utils import to_categorical\n", 12 | "from keras.layers import Conv2D=================================================================================================================================================================================================================================================================, Input, GlobalAveragePooling2D,Dense, Activation, Flatten, BatchNormalization\n", 13 | "# from keras.applications.mobilenet import relu6, DepthwiseConv2D\n", 14 | "from keras.layers import DepthwiseConv2D\n", 15 | "from keras import Model\n", 16 | "from keras import optimizers\n", 17 | "# from keras import activations" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 8, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "name": "stdout", 27 | "output_type": "stream", 28 | "text": [ 29 | "Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz\n", 30 | "11493376/11490434 [==============================] - 25s 2us/step\n", 31 | "(60000, 10)\n", 32 | "(10000, 10)\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "(train_x, train_y), (test_x, test_y) = mnist.load_data()\n", 38 | "train_x = train_x.reshape((60000,28,28,1)) / 255.0\n", 39 | "test_x = test_x.reshape((10000,28,28,1)) / 255.0\n", 40 | "\n", 41 | "train_y = keras.utils.to_categorical(train_y, num_classes = 10)\n", 42 | "test_y = keras.utils.to_categorical(test_y, num_classes = 10)\n", 43 | "print (train_y.shape)\n", 44 | "print (test_y.shape)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": {}, 50 | "source": [ 51 | "#### DepthwiseConv2D\n", 52 | "```py\n", 53 | "class DepthwiseConv2D(Conv2D):\n", 54 | " \"\"\"Depthwise separable 2D convolution.\n", 55 | " Depthwise Separable convolutions consist in performing\n", 56 | " just the first step in a depthwise spatial convolution\n", 57 | " (which acts on each input channel separately).\n", 58 | " It does not perform the pointwise convolution (second step).\n", 59 | " The `depth_multiplier` argument controls how many\n", 60 | " output channels are generated per input channel in the depthwise step.\n", 61 | " # Arguments\n", 62 | " kernel_size: An integer or tuple/list of 2 integers, specifying the\n", 63 | " width and height of the 2D convolution window.\n", 64 | " Can be a single integer to specify the same value for\n", 65 | " all spatial dimensions.\n", 66 | " strides: An integer or tuple/list of 2 integers,\n", 67 | " specifying the strides of the convolution along the width and height.\n", 68 | " Can be a single integer to specify the same value for\n", 69 | " all spatial dimensions.\n", 70 | " Specifying any stride value != 1 is incompatible with specifying\n", 71 | " any `dilation_rate` value != 1.\n", 72 | " padding: one of `\"valid\"` or `\"same\"` (case-insensitive).\n", 73 | " depth_multiplier: The number of depthwise convolution output channels\n", 74 | " for each input channel.\n", 75 | " The total number of depthwise convolution output\n", 76 | " channels will be equal to `filterss_in * depth_multiplier`.\n", 77 | " data_format: A string,\n", 78 | " one of `channels_last` (default) or `channels_first`.\n", 79 | " The ordering of the dimensions in the inputs.\n", 80 | " `channels_last` corresponds to inputs with shape\n", 81 | " `(batch, height, width, channels)` while `channels_first`\n", 82 | " corresponds to inputs with shape\n", 83 | " `(batch, channels, height, width)`.\n", 84 | " It defaults to the `image_data_format` value found in your\n", 85 | " Keras config file at `~/.keras/keras.json`.\n", 86 | " If you never set it, then it will be \"channels_last\".\n", 87 | " activation: Activation function to use\n", 88 | " (see [activations](../activations.md)).\n", 89 | " If you don't specify anything, no activation is applied\n", 90 | " (ie. \"linear\" activation: `a(x) = x`).\n", 91 | " use_bias: Boolean, whether the layer uses a bias vector.\n", 92 | " depthwise_initializer: Initializer for the depthwise kernel matrix\n", 93 | " (see [initializers](../initializers.md)).\n", 94 | " bias_initializer: Initializer for the bias vector\n", 95 | " (see [initializers](../initializers.md)).\n", 96 | " depthwise_regularizer: Regularizer function applied to\n", 97 | " the depthwise kernel matrix\n", 98 | " (see [regularizer](../regularizers.md)).\n", 99 | " bias_regularizer: Regularizer function applied to the bias vector\n", 100 | " (see [regularizer](../regularizers.md)).\n", 101 | " activity_regularizer: Regularizer function applied to\n", 102 | " the output of the layer (its \"activation\").\n", 103 | " (see [regularizer](../regularizers.md)).\n", 104 | " depthwise_constraint: Constraint function applied to\n", 105 | " the depthwise kernel matrix\n", 106 | " (see [constraints](../constraints.md)).\n", 107 | " bias_constraint: Constraint function applied to the bias vector\n", 108 | " (see [constraints](../constraints.md)).\n", 109 | " # Input shape\n", 110 | " 4D tensor with shape:\n", 111 | " `(batch, channels, rows, cols)` if data_format='channels_first'\n", 112 | " or 4D tensor with shape:\n", 113 | " `(batch, rows, cols, channels)` if data_format='channels_last'.\n", 114 | " # Output shape\n", 115 | " 4D tensor with shape:\n", 116 | " `(batch, filters, new_rows, new_cols)` if data_format='channels_first'\n", 117 | " or 4D tensor with shape:\n", 118 | " `(batch, new_rows, new_cols, filters)` if data_format='channels_last'.\n", 119 | " `rows` and `cols` values might have changed due to padding.\n", 120 | " \"\"\"\n", 121 | "```" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 9, 127 | "metadata": {}, 128 | "outputs": [], 129 | "source": [ 130 | "def MobileNetV1(input_shape, k):\n", 131 | " inputs = Input(shape=input_shape)\n", 132 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 133 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 134 | " x = Conv2D(filters=64, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 135 | " x = DepthwiseConv2D(kernel_size=(3,3), padding='same', activation='relu',)(x)\n", 136 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 137 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 138 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 139 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 140 | " x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 141 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 142 | " x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 143 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 144 | " x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 145 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 146 | " x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 147 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 148 | " x = Conv2D(filters=1024, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 149 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 150 | " x = Conv2D(filters=1024, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 151 | " x = GlobalAveragePooling2D()(x)\n", 152 | " x = Dense(1024, activation='relu')(x)\n", 153 | " x = Dense(k, activation='softmax')(x)\n", 154 | " model = Model(inputs, x)\n", 155 | " return model" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 10, 161 | "metadata": {}, 162 | "outputs": [], 163 | "source": [ 164 | "def NaiveConvNet(input_shape, k):\n", 165 | " inputs = Input(shape=input_shape)\n", 166 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 167 | " x = Conv2D(filters=64, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 168 | " x = Conv2D(filters=128, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 169 | " x = Conv2D(filters=128, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 170 | " x = Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 171 | " x = Conv2D(filters=256, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 172 | " x = Conv2D(filters=512, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 173 | " x = Conv2D(filters=512, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 174 | " x = Conv2D(filters=1024, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 175 | " x = Conv2D(filters=1024, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 176 | " x = GlobalAveragePooling2D()(x)\n", 177 | " x = Dense(1024, activation='relu')(x)\n", 178 | " x = Dense(k, activation='softmax')(x)\n", 179 | " model = Model(inputs, x)\n", 180 | " return model" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 11, 186 | "metadata": {}, 187 | "outputs": [ 188 | { 189 | "name": "stdout", 190 | "output_type": "stream", 191 | "text": [ 192 | "_________________________________________________________________\n", 193 | "Layer (type) Output Shape Param # \n", 194 | "=================================================================\n", 195 | "input_3 (InputLayer) (None, 224, 224, 3) 0 \n", 196 | "_________________________________________________________________\n", 197 | "conv2d_12 (Conv2D) (None, 112, 112, 32) 896 \n", 198 | "_________________________________________________________________\n", 199 | "depthwise_conv2d_1 (Depthwis (None, 112, 112, 32) 320 \n", 200 | "_________________________________________________________________\n", 201 | "conv2d_13 (Conv2D) (None, 112, 112, 64) 2112 \n", 202 | "_________________________________________________________________\n", 203 | "depthwise_conv2d_2 (Depthwis (None, 112, 112, 64) 640 \n", 204 | "_________________________________________________________________\n", 205 | "conv2d_14 (Conv2D) (None, 112, 112, 128) 8320 \n", 206 | "_________________________________________________________________\n", 207 | "depthwise_conv2d_3 (Depthwis (None, 56, 56, 128) 1280 \n", 208 | "_________________________________________________________________\n", 209 | "conv2d_15 (Conv2D) (None, 56, 56, 128) 16512 \n", 210 | "_________________________________________________________________\n", 211 | "depthwise_conv2d_4 (Depthwis (None, 56, 56, 128) 1280 \n", 212 | "_________________________________________________________________\n", 213 | "conv2d_16 (Conv2D) (None, 56, 56, 256) 33024 \n", 214 | "_________________________________________________________________\n", 215 | "depthwise_conv2d_5 (Depthwis (None, 28, 28, 256) 2560 \n", 216 | "_________________________________________________________________\n", 217 | "conv2d_17 (Conv2D) (None, 28, 28, 256) 65792 \n", 218 | "_________________________________________________________________\n", 219 | "depthwise_conv2d_6 (Depthwis (None, 28, 28, 256) 2560 \n", 220 | "_________________________________________________________________\n", 221 | "conv2d_18 (Conv2D) (None, 28, 28, 512) 131584 \n", 222 | "_________________________________________________________________\n", 223 | "depthwise_conv2d_7 (Depthwis (None, 14, 14, 512) 5120 \n", 224 | "_________________________________________________________________\n", 225 | "conv2d_19 (Conv2D) (None, 14, 14, 512) 262656 \n", 226 | "_________________________________________________________________\n", 227 | "depthwise_conv2d_8 (Depthwis (None, 7, 7, 512) 5120 \n", 228 | "_________________________________________________________________\n", 229 | "conv2d_20 (Conv2D) (None, 7, 7, 1024) 525312 \n", 230 | "_________________________________________________________________\n", 231 | "depthwise_conv2d_9 (Depthwis (None, 7, 7, 1024) 10240 \n", 232 | "_________________________________________________________________\n", 233 | "conv2d_21 (Conv2D) (None, 7, 7, 1024) 1049600 \n", 234 | "_________________________________________________________________\n", 235 | "global_average_pooling2d_2 ( (None, 1024) 0 \n", 236 | "_________________________________________________________________\n", 237 | "dense_3 (Dense) (None, 1024) 1049600 \n", 238 | "_________________________________________________________________\n", 239 | "dense_4 (Dense) (None, 1000) 1025000 \n", 240 | "=================================================================\n", 241 | "Total params: 4,199,528\n", 242 | "Trainable params: 4,199,528\n", 243 | "Non-trainable params: 0\n", 244 | "_________________________________________________________________\n" 245 | ] 246 | } 247 | ], 248 | "source": [ 249 | "MobileNet_v1_model = MobileNetV1((224,224,3), 1000)\n", 250 | "MobileNet_v1_model.summary()" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": 12, 256 | "metadata": {}, 257 | "outputs": [ 258 | { 259 | "name": "stdout", 260 | "output_type": "stream", 261 | "text": [ 262 | "_________________________________________________________________\n", 263 | "Layer (type) Output Shape Param # \n", 264 | "=================================================================\n", 265 | "input_4 (InputLayer) (None, 224, 224, 3) 0 \n", 266 | "_________________________________________________________________\n", 267 | "conv2d_22 (Conv2D) (None, 112, 112, 32) 896 \n", 268 | "_________________________________________________________________\n", 269 | "conv2d_23 (Conv2D) (None, 112, 112, 64) 18496 \n", 270 | "_________________________________________________________________\n", 271 | "conv2d_24 (Conv2D) (None, 112, 112, 128) 73856 \n", 272 | "_________________________________________________________________\n", 273 | "conv2d_25 (Conv2D) (None, 56, 56, 128) 147584 \n", 274 | "_________________________________________________________________\n", 275 | "conv2d_26 (Conv2D) (None, 56, 56, 256) 295168 \n", 276 | "_________________________________________________________________\n", 277 | "conv2d_27 (Conv2D) (None, 28, 28, 256) 590080 \n", 278 | "_________________________________________________________________\n", 279 | "conv2d_28 (Conv2D) (None, 28, 28, 512) 1180160 \n", 280 | "_________________________________________________________________\n", 281 | "conv2d_29 (Conv2D) (None, 14, 14, 512) 2359808 \n", 282 | "_________________________________________________________________\n", 283 | "conv2d_30 (Conv2D) (None, 7, 7, 1024) 4719616 \n", 284 | "_________________________________________________________________\n", 285 | "conv2d_31 (Conv2D) (None, 7, 7, 1024) 9438208 \n", 286 | "_________________________________________________________________\n", 287 | "global_average_pooling2d_3 ( (None, 1024) 0 \n", 288 | "_________________________________________________________________\n", 289 | "dense_5 (Dense) (None, 1024) 1049600 \n", 290 | "_________________________________________________________________\n", 291 | "dense_6 (Dense) (None, 1000) 1025000 \n", 292 | "=================================================================\n", 293 | "Total params: 20,898,472\n", 294 | "Trainable params: 20,898,472\n", 295 | "Non-trainable params: 0\n", 296 | "_________________________________________________________________\n" 297 | ] 298 | } 299 | ], 300 | "source": [ 301 | "NaiveConvNet_model = NaiveConvNet((224,224,3), 1000)\n", 302 | "NaiveConvNet_model.summary()" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 13, 308 | "metadata": {}, 309 | "outputs": [], 310 | "source": [ 311 | "def Simple_MobileNetV1(input_shape, k):\n", 312 | " inputs = Input(shape=input_shape)\n", 313 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 314 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 315 | " x = Conv2D(filters=64, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 316 | " x = DepthwiseConv2D(kernel_size=(3,3), padding='same', activation='relu',)(x)\n", 317 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 318 | " x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 319 | " x = Conv2D(filters=128, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 320 | " x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 321 | "# x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 322 | "# x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 323 | "# x = Conv2D(filters=256, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 324 | "# # x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 325 | "# # x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 326 | "# # x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 327 | "# # x = Conv2D(filters=512, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 328 | "# # x = DepthwiseConv2D(kernel_size=(3,3), strides=(2,2),padding='same', activation='relu',)(x)\n", 329 | "# # x = Conv2D(filters=1024, kernel_size=(1,1),padding='same', activation='relu')(x)\n", 330 | "# # x = DepthwiseConv2D(kernel_size=(3,3),padding='same', activation='relu',)(x)\n", 331 | " x = Conv2D(filters=128, kernel_size=(1,1), padding='same', activation='relu')(x)\n", 332 | " x = GlobalAveragePooling2D()(x)\n", 333 | " x = BatchNormalization()(x)\n", 334 | " x = Dense(128, activation='relu')(x)\n", 335 | " x = BatchNormalization()(x)\n", 336 | " x = Dense(k, activation='softmax')(x)\n", 337 | " model = Model(inputs, x)\n", 338 | " return model" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 15, 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "name": "stdout", 348 | "output_type": "stream", 349 | "text": [ 350 | "_________________________________________________________________\n", 351 | "Layer (type) Output Shape Param # \n", 352 | "=================================================================\n", 353 | "input_6 (InputLayer) (None, 28, 28, 1) 0 \n", 354 | "_________________________________________________________________\n", 355 | "conv2d_37 (Conv2D) (None, 14, 14, 32) 320 \n", 356 | "_________________________________________________________________\n", 357 | "depthwise_conv2d_14 (Depthwi (None, 14, 14, 32) 320 \n", 358 | "_________________________________________________________________\n", 359 | "conv2d_38 (Conv2D) (None, 14, 14, 64) 2112 \n", 360 | "_________________________________________________________________\n", 361 | "depthwise_conv2d_15 (Depthwi (None, 14, 14, 64) 640 \n", 362 | "_________________________________________________________________\n", 363 | "conv2d_39 (Conv2D) (None, 14, 14, 128) 8320 \n", 364 | "_________________________________________________________________\n", 365 | "depthwise_conv2d_16 (Depthwi (None, 7, 7, 128) 1280 \n", 366 | "_________________________________________________________________\n", 367 | "conv2d_40 (Conv2D) (None, 7, 7, 128) 16512 \n", 368 | "_________________________________________________________________\n", 369 | "depthwise_conv2d_17 (Depthwi (None, 7, 7, 128) 1280 \n", 370 | "_________________________________________________________________\n", 371 | "conv2d_41 (Conv2D) (None, 7, 7, 128) 16512 \n", 372 | "_________________________________________________________________\n", 373 | "global_average_pooling2d_5 ( (None, 128) 0 \n", 374 | "_________________________________________________________________\n", 375 | "batch_normalization_3 (Batch (None, 128) 512 \n", 376 | "_________________________________________________________________\n", 377 | "dense_9 (Dense) (None, 128) 16512 \n", 378 | "_________________________________________________________________\n", 379 | "batch_normalization_4 (Batch (None, 128) 512 \n", 380 | "_________________________________________________________________\n", 381 | "dense_10 (Dense) (None, 10) 1290 \n", 382 | "=================================================================\n", 383 | "Total params: 66,122\n", 384 | "Trainable params: 65,610\n", 385 | "Non-trainable params: 512\n", 386 | "_________________________________________________________________\n", 387 | "Epoch 1/20\n", 388 | "60000/60000 [==============================] - 48s 800us/step - loss: 0.5188 - acc: 0.8251\n", 389 | "Epoch 2/20\n", 390 | "60000/60000 [==============================] - 47s 778us/step - loss: 0.1834 - acc: 0.9452\n", 391 | "Epoch 3/20\n", 392 | "60000/60000 [==============================] - 46s 767us/step - loss: 0.1320 - acc: 0.9601\n", 393 | "Epoch 4/20\n", 394 | "60000/60000 [==============================] - 46s 766us/step - loss: 0.1172 - acc: 0.9654\n", 395 | "Epoch 5/20\n", 396 | "60000/60000 [==============================] - 46s 768us/step - loss: 0.1007 - acc: 0.9703\n", 397 | "Epoch 6/20\n", 398 | "60000/60000 [==============================] - 51s 845us/step - loss: 0.0936 - acc: 0.9726\n", 399 | "Epoch 7/20\n", 400 | "60000/60000 [==============================] - 50s 825us/step - loss: 0.0885 - acc: 0.9751\n", 401 | "Epoch 8/20\n", 402 | "60000/60000 [==============================] - 50s 834us/step - loss: 0.0840 - acc: 0.9762\n", 403 | "Epoch 9/20\n", 404 | "60000/60000 [==============================] - 51s 846us/step - loss: 0.0801 - acc: 0.9772\n", 405 | "Epoch 10/20\n", 406 | "60000/60000 [==============================] - 49s 818us/step - loss: 0.0810 - acc: 0.9776\n", 407 | "Epoch 11/20\n", 408 | "60000/60000 [==============================] - 50s 834us/step - loss: 0.0733 - acc: 0.9793\n", 409 | "Epoch 12/20\n", 410 | "60000/60000 [==============================] - 51s 853us/step - loss: 0.0701 - acc: 0.9802\n", 411 | "Epoch 13/20\n", 412 | "60000/60000 [==============================] - 51s 847us/step - loss: 0.0702 - acc: 0.9802\n", 413 | "Epoch 14/20\n", 414 | "60000/60000 [==============================] - 49s 817us/step - loss: 0.0663 - acc: 0.9815\n", 415 | "Epoch 15/20\n", 416 | "60000/60000 [==============================] - 49s 814us/step - loss: 0.0684 - acc: 0.9822\n", 417 | "Epoch 16/20\n", 418 | "60000/60000 [==============================] - 49s 823us/step - loss: 0.0665 - acc: 0.9825\n", 419 | "Epoch 17/20\n", 420 | "60000/60000 [==============================] - 51s 852us/step - loss: 0.0646 - acc: 0.9830\n", 421 | "Epoch 18/20\n", 422 | "60000/60000 [==============================] - 47s 785us/step - loss: 0.0610 - acc: 0.9838\n", 423 | "Epoch 19/20\n", 424 | "60000/60000 [==============================] - 48s 798us/step - loss: 0.0587 - acc: 0.9839\n", 425 | "Epoch 20/20\n", 426 | "60000/60000 [==============================] - 51s 846us/step - loss: 0.0566 - acc: 0.9851\n" 427 | ] 428 | } 429 | ], 430 | "source": [ 431 | "Simple_MobileNetV1_model = Simple_MobileNetV1((28,28,1), 10)\n", 432 | "Simple_MobileNetV1_model.summary()\n", 433 | "Simple_MobileNetV1_model.compile(optimizer=optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['acc'])\n", 434 | "Simple_MobileNetV1_history = Simple_MobileNetV1_model.fit(train_x, train_y, epochs=20, batch_size=8)" 435 | ] 436 | }, 437 | { 438 | "cell_type": "code", 439 | "execution_count": 16, 440 | "metadata": {}, 441 | "outputs": [ 442 | { 443 | "name": "stdout", 444 | "output_type": "stream", 445 | "text": [ 446 | "10000/10000 [==============================] - 1s 66us/step\n" 447 | ] 448 | }, 449 | { 450 | "data": { 451 | "text/plain": [ 452 | "[0.0815806967404671, 0.9776]" 453 | ] 454 | }, 455 | "execution_count": 16, 456 | "metadata": {}, 457 | "output_type": "execute_result" 458 | } 459 | ], 460 | "source": [ 461 | "Simple_MobileNetV1_model.evaluate(test_x, test_y)" 462 | ] 463 | }, 464 | { 465 | "cell_type": "code", 466 | "execution_count": 17, 467 | "metadata": {}, 468 | "outputs": [], 469 | "source": [ 470 | "def Simple_NaiveConvNet(input_shape, k):\n", 471 | " inputs = Input(shape=input_shape)\n", 472 | " x = Conv2D(filters=32, kernel_size=(3,3), strides=(2,2), padding='same', activation='relu')(inputs)\n", 473 | " x = Conv2D(filters=64, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 474 | " x = Conv2D(filters=128, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 475 | " x = Conv2D(filters=128, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 476 | "# x = Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 477 | "# x = Conv2D(filters=256, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 478 | "# x = Conv2D(filters=512, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 479 | "# x = Conv2D(filters=512, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 480 | "# x = Conv2D(filters=1024, kernel_size=(3,3), strides=(2,2),padding='same', activation='relu')(x)\n", 481 | "# x = Conv2D(filters=1024, kernel_size=(3,3),padding='same', activation='relu')(x)\n", 482 | " x = GlobalAveragePooling2D()(x)\n", 483 | " x = BatchNormalization()(x)\n", 484 | " x = Dense(128, activation='relu')(x)\n", 485 | " x = BatchNormalization()(x)\n", 486 | " x = Dense(k, activation='softmax')(x)\n", 487 | " model = Model(inputs, x)\n", 488 | " return model" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": 18, 494 | "metadata": {}, 495 | "outputs": [ 496 | { 497 | "name": "stdout", 498 | "output_type": "stream", 499 | "text": [ 500 | "_________________________________________________________________\n", 501 | "Layer (type) Output Shape Param # \n", 502 | "=================================================================\n", 503 | "input_7 (InputLayer) (None, 28, 28, 1) 0 \n", 504 | "_________________________________________________________________\n", 505 | "conv2d_42 (Conv2D) (None, 14, 14, 32) 320 \n", 506 | "_________________________________________________________________\n", 507 | "conv2d_43 (Conv2D) (None, 14, 14, 64) 18496 \n", 508 | "_________________________________________________________________\n", 509 | "conv2d_44 (Conv2D) (None, 14, 14, 128) 73856 \n", 510 | "_________________________________________________________________\n", 511 | "conv2d_45 (Conv2D) (None, 7, 7, 128) 147584 \n", 512 | "_________________________________________________________________\n", 513 | "global_average_pooling2d_6 ( (None, 128) 0 \n", 514 | "_________________________________________________________________\n", 515 | "batch_normalization_5 (Batch (None, 128) 512 \n", 516 | "_________________________________________________________________\n", 517 | "dense_11 (Dense) (None, 128) 16512 \n", 518 | "_________________________________________________________________\n", 519 | "batch_normalization_6 (Batch (None, 128) 512 \n", 520 | "_________________________________________________________________\n", 521 | "dense_12 (Dense) (None, 10) 1290 \n", 522 | "=================================================================\n", 523 | "Total params: 259,082\n", 524 | "Trainable params: 258,570\n", 525 | "Non-trainable params: 512\n", 526 | "_________________________________________________________________\n", 527 | "Epoch 1/50\n", 528 | "60000/60000 [==============================] - 40s 664us/step - loss: 0.2388 - acc: 0.9250\n", 529 | "Epoch 2/50\n", 530 | "60000/60000 [==============================] - 40s 662us/step - loss: 0.1058 - acc: 0.9693\n", 531 | "Epoch 3/50\n", 532 | "60000/60000 [==============================] - 40s 659us/step - loss: 0.0862 - acc: 0.9758\n", 533 | "Epoch 4/50\n", 534 | "60000/60000 [==============================] - 43s 709us/step - loss: 0.0736 - acc: 0.9790\n", 535 | "Epoch 5/50\n", 536 | "60000/60000 [==============================] - 41s 676us/step - loss: 0.0662 - acc: 0.9808\n", 537 | "Epoch 6/50\n", 538 | "60000/60000 [==============================] - 39s 653us/step - loss: 0.0572 - acc: 0.9842\n", 539 | "Epoch 7/50\n", 540 | "60000/60000 [==============================] - 40s 659us/step - loss: 0.0542 - acc: 0.9849\n", 541 | "Epoch 8/50\n", 542 | "60000/60000 [==============================] - 41s 684us/step - loss: 0.0478 - acc: 0.9870\n", 543 | "Epoch 9/50\n", 544 | "60000/60000 [==============================] - 39s 652us/step - loss: 0.0453 - acc: 0.9885\n", 545 | "Epoch 10/50\n", 546 | "60000/60000 [==============================] - 39s 653us/step - loss: 0.0433 - acc: 0.9885\n", 547 | "Epoch 11/50\n", 548 | "60000/60000 [==============================] - 39s 653us/step - loss: 0.0408 - acc: 0.9892\n", 549 | "Epoch 12/50\n", 550 | "60000/60000 [==============================] - 39s 653us/step - loss: 0.0397 - acc: 0.9895\n", 551 | "Epoch 13/50\n", 552 | "60000/60000 [==============================] - 39s 650us/step - loss: 0.0345 - acc: 0.9905\n", 553 | "Epoch 14/50\n", 554 | "60000/60000 [==============================] - 39s 649us/step - loss: 0.0378 - acc: 0.9902\n", 555 | "Epoch 15/50\n", 556 | "60000/60000 [==============================] - 39s 645us/step - loss: 0.0334 - acc: 0.9912\n", 557 | "Epoch 16/50\n", 558 | "60000/60000 [==============================] - 39s 646us/step - loss: 0.0341 - acc: 0.9912\n", 559 | "Epoch 17/50\n", 560 | "60000/60000 [==============================] - 39s 646us/step - loss: 0.0296 - acc: 0.9919\n", 561 | "Epoch 18/50\n", 562 | "60000/60000 [==============================] - 39s 645us/step - loss: 0.0308 - acc: 0.9923\n", 563 | "Epoch 19/50\n", 564 | "60000/60000 [==============================] - 39s 645us/step - loss: 0.0317 - acc: 0.9918\n", 565 | "Epoch 20/50\n", 566 | "60000/60000 [==============================] - 39s 645us/step - loss: 0.0269 - acc: 0.9934\n", 567 | "Epoch 21/50\n", 568 | "60000/60000 [==============================] - 39s 644us/step - loss: 0.0286 - acc: 0.9928\n", 569 | "Epoch 22/50\n", 570 | "60000/60000 [==============================] - 39s 646us/step - loss: 0.0270 - acc: 0.9933\n", 571 | "Epoch 23/50\n", 572 | "60000/60000 [==============================] - 39s 654us/step - loss: 0.0273 - acc: 0.9933\n", 573 | "Epoch 24/50\n", 574 | "60000/60000 [==============================] - 39s 645us/step - loss: 0.0223 - acc: 0.9939\n", 575 | "Epoch 25/50\n", 576 | "60000/60000 [==============================] - 39s 646us/step - loss: 0.0242 - acc: 0.9936\n", 577 | "Epoch 26/50\n", 578 | "60000/60000 [==============================] - 39s 646us/step - loss: 0.0249 - acc: 0.9944\n", 579 | "Epoch 27/50\n", 580 | "60000/60000 [==============================] - 39s 648us/step - loss: 0.0224 - acc: 0.9944\n", 581 | "Epoch 28/50\n", 582 | "60000/60000 [==============================] - 39s 648us/step - loss: 0.0242 - acc: 0.9939\n", 583 | "Epoch 29/50\n", 584 | "60000/60000 [==============================] - 39s 649us/step - loss: 0.0244 - acc: 0.9940\n", 585 | "Epoch 30/50\n", 586 | "60000/60000 [==============================] - 40s 659us/step - loss: 0.0208 - acc: 0.9946\n", 587 | "Epoch 31/50\n", 588 | "60000/60000 [==============================] - 39s 654us/step - loss: 0.0232 - acc: 0.9945\n", 589 | "Epoch 32/50\n", 590 | "60000/60000 [==============================] - 41s 686us/step - loss: 0.0188 - acc: 0.9952\n", 591 | "Epoch 33/50\n", 592 | "60000/60000 [==============================] - 42s 706us/step - loss: 0.0216 - acc: 0.9949\n", 593 | "Epoch 34/50\n", 594 | "60000/60000 [==============================] - 43s 709us/step - loss: 0.0222 - acc: 0.9944\n", 595 | "Epoch 35/50\n", 596 | "60000/60000 [==============================] - 43s 721us/step - loss: 0.0183 - acc: 0.9958\n", 597 | "Epoch 36/50\n", 598 | "60000/60000 [==============================] - 45s 747us/step - loss: 0.0182 - acc: 0.9953\n", 599 | "Epoch 37/50\n", 600 | "60000/60000 [==============================] - 44s 741us/step - loss: 0.0198 - acc: 0.9953\n", 601 | "Epoch 38/50\n", 602 | "60000/60000 [==============================] - 44s 727us/step - loss: 0.0185 - acc: 0.9955\n", 603 | "Epoch 39/50\n", 604 | "60000/60000 [==============================] - 44s 732us/step - loss: 0.0187 - acc: 0.9956\n", 605 | "Epoch 40/50\n", 606 | "60000/60000 [==============================] - 42s 708us/step - loss: 0.0160 - acc: 0.9963\n", 607 | "Epoch 41/50\n", 608 | "60000/60000 [==============================] - 41s 686us/step - loss: 0.0153 - acc: 0.9965\n", 609 | "Epoch 42/50\n", 610 | "60000/60000 [==============================] - 44s 730us/step - loss: 0.0168 - acc: 0.9961\n", 611 | "Epoch 43/50\n", 612 | "60000/60000 [==============================] - 44s 737us/step - loss: 0.0206 - acc: 0.9955\n", 613 | "Epoch 44/50\n", 614 | "60000/60000 [==============================] - 44s 737us/step - loss: 0.0225 - acc: 0.9956\n", 615 | "Epoch 45/50\n", 616 | "60000/60000 [==============================] - 44s 735us/step - loss: 0.0166 - acc: 0.9960\n", 617 | "Epoch 46/50\n", 618 | "60000/60000 [==============================] - 44s 741us/step - loss: 0.0165 - acc: 0.9964\n", 619 | "Epoch 47/50\n", 620 | "60000/60000 [==============================] - 44s 737us/step - loss: 0.0136 - acc: 0.9970\n", 621 | "Epoch 48/50\n", 622 | "60000/60000 [==============================] - 45s 742us/step - loss: 0.0172 - acc: 0.9962\n", 623 | "Epoch 49/50\n", 624 | "60000/60000 [==============================] - 44s 741us/step - loss: 0.0142 - acc: 0.9967\n", 625 | "Epoch 50/50\n", 626 | "60000/60000 [==============================] - 45s 746us/step - loss: 0.0161 - acc: 0.9966\n" 627 | ] 628 | } 629 | ], 630 | "source": [ 631 | "Simple_NaiveConvNet_model = Simple_NaiveConvNet((28,28,1), 10)\n", 632 | "Simple_NaiveConvNet_model.summary()\n", 633 | "Simple_NaiveConvNet_model.compile(optimizer=optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['acc'])\n", 634 | "Simple_NaiveConvNet_history = Simple_NaiveConvNet_model.fit(train_x, train_y, epochs=50, batch_size=8)" 635 | ] 636 | }, 637 | { 638 | "cell_type": "code", 639 | "execution_count": null, 640 | "metadata": {}, 641 | "outputs": [], 642 | "source": [] 643 | } 644 | ], 645 | "metadata": { 646 | "kernelspec": { 647 | "display_name": "Python 3", 648 | "language": "python", 649 | "name": "python3" 650 | }, 651 | "language_info": { 652 | "codemirror_mode": { 653 | "name": "ipython", 654 | "version": 3 655 | }, 656 | "file_extension": ".py", 657 | "mimetype": "text/x-python", 658 | "name": "python", 659 | "nbconvert_exporter": "python", 660 | "pygments_lexer": "ipython3", 661 | "version": "3.6.5" 662 | } 663 | }, 664 | "nbformat": 4, 665 | "nbformat_minor": 2 666 | } 667 | -------------------------------------------------------------------------------- /NIN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/usr/local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 13 | " from ._conv import register_converters as _register_converters\n", 14 | "Using TensorFlow backend.\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "from keras.datasets import mnist\n", 20 | "from keras.layers import Flatten, Conv2D, MaxPool2D, Dense, Input,AveragePooling2D,Reshape,Activation\n", 21 | "from keras.models import Sequential, Model\n", 22 | "from keras.optimizers import SGD\n", 23 | "from keras.utils import plot_model, to_categorical\n", 24 | "\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 2, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", 35 | "#数据变成TensorFow为Backend的形式\n", 36 | "x_train=x_train.reshape(60000,28,28,1)\n", 37 | "x_test=x_test.reshape(10000,28,28,1)\n", 38 | "#把标签变成one-hot编码的形式\n", 39 | "y_train=to_categorical(y_train,num_classes=10)\n", 40 | "y_test=to_categorical(y_test,num_classes=10)" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 33, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "name": "stdout", 50 | "output_type": "stream", 51 | "text": [ 52 | "_________________________________________________________________\n", 53 | "Layer (type) Output Shape Param # \n", 54 | "=================================================================\n", 55 | "conv2d_45 (Conv2D) (None, 28, 28, 8) 208 \n", 56 | "_________________________________________________________________\n", 57 | "conv2d_46 (Conv2D) (None, 28, 28, 8) 72 \n", 58 | "_________________________________________________________________\n", 59 | "max_pooling2d_5 (MaxPooling2 (None, 14, 14, 8) 0 \n", 60 | "_________________________________________________________________\n", 61 | "conv2d_47 (Conv2D) (None, 14, 14, 16) 3216 \n", 62 | "_________________________________________________________________\n", 63 | "conv2d_48 (Conv2D) (None, 14, 14, 16) 272 \n", 64 | "_________________________________________________________________\n", 65 | "max_pooling2d_6 (MaxPooling2 (None, 7, 7, 16) 0 \n", 66 | "_________________________________________________________________\n", 67 | "flatten_31 (Flatten) (None, 784) 0 \n", 68 | "_________________________________________________________________\n", 69 | "dense_59 (Dense) (None, 120) 94200 \n", 70 | "_________________________________________________________________\n", 71 | "dense_60 (Dense) (None, 84) 10164 \n", 72 | "_________________________________________________________________\n", 73 | "dense_61 (Dense) (None, 10) 850 \n", 74 | "_________________________________________________________________\n", 75 | "activation_13 (Activation) (None, 10) 0 \n", 76 | "=================================================================\n", 77 | "Total params: 108,982\n", 78 | "Trainable params: 108,982\n", 79 | "Non-trainable params: 0\n", 80 | "_________________________________________________________________\n" 81 | ] 82 | } 83 | ], 84 | "source": [ 85 | "NIN = Sequential()\n", 86 | "NIN.add(Conv2D(input_shape=(28,28,1), filters= 8, kernel_size = (5,5),padding = 'same',activation = 'relu'))\n", 87 | "NIN.add(Conv2D(input_shape=(28,28,1), filters= 8, kernel_size = (1,1),padding = 'same',activation = 'relu'))\n", 88 | "NIN.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 89 | "NIN.add(Conv2D(16,(5,5),padding = 'same',activation = 'relu'))\n", 90 | "NIN.add(Conv2D(16,(1,1),padding = 'same',activation = 'relu'))\n", 91 | "NIN.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 92 | "NIN.add(Flatten())\n", 93 | "NIN.add(Dense(120,activation = 'relu'))\n", 94 | "NIN.add(Dense(84,activation = 'relu'))\n", 95 | "NIN.add(Dense(10))\n", 96 | "NIN.add(Activation('softmax'))\n", 97 | "NIN.summary()" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": {}, 104 | "outputs": [ 105 | { 106 | "name": "stdout", 107 | "output_type": "stream", 108 | "text": [ 109 | "Epoch 1/10\n", 110 | "60000/60000 [==============================] - 23s 386us/step - loss: 0.6457 - acc: 0.8714\n", 111 | "Epoch 2/10\n", 112 | "60000/60000 [==============================] - 23s 377us/step - loss: 0.1116 - acc: 0.9656\n", 113 | "Epoch 3/10\n", 114 | "60000/60000 [==============================] - 22s 373us/step - loss: 0.0794 - acc: 0.9751\n", 115 | "Epoch 4/10\n", 116 | "60000/60000 [==============================] - 23s 377us/step - loss: 0.0640 - acc: 0.9801\n", 117 | "Epoch 5/10\n", 118 | "60000/60000 [==============================] - 22s 373us/step - loss: 0.0535 - acc: 0.9831\n", 119 | "Epoch 6/10\n", 120 | "60000/60000 [==============================] - 23s 390us/step - loss: 0.0455 - acc: 0.9848\n", 121 | "Epoch 7/10\n", 122 | "60000/60000 [==============================] - 24s 394us/step - loss: 0.0395 - acc: 0.9878\n", 123 | "Epoch 8/10\n", 124 | "60000/60000 [==============================] - 24s 393us/step - loss: 0.0342 - acc: 0.9887\n", 125 | "Epoch 9/10\n", 126 | "53632/60000 [=========================>....] - ETA: 2s - loss: 0.0306 - acc: 0.9905" 127 | ] 128 | } 129 | ], 130 | "source": [ 131 | "NIN.compile(optimizer=SGD(lr=0.01),loss = 'categorical_crossentropy', metrics=['accuracy'])\n", 132 | "# x_train,y_train,x_test,y_test = preprocess()\n", 133 | "history3 = NIN.fit(x_train,y_train,epochs=10,batch_size=128,shuffle=True)" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 9, 139 | "metadata": {}, 140 | "outputs": [ 141 | { 142 | "name": "stdout", 143 | "output_type": "stream", 144 | "text": [ 145 | "_________________________________________________________________\n", 146 | "Layer (type) Output Shape Param # \n", 147 | "=================================================================\n", 148 | "conv2d_7 (Conv2D) (None, 24, 24, 8) 208 \n", 149 | "_________________________________________________________________\n", 150 | "max_pooling2d_3 (MaxPooling2 (None, 12, 12, 8) 0 \n", 151 | "_________________________________________________________________\n", 152 | "conv2d_8 (Conv2D) (None, 8, 8, 16) 3216 \n", 153 | "_________________________________________________________________\n", 154 | "max_pooling2d_4 (MaxPooling2 (None, 4, 4, 16) 0 \n", 155 | "_________________________________________________________________\n", 156 | "flatten_8 (Flatten) (None, 256) 0 \n", 157 | "_________________________________________________________________\n", 158 | "dense_14 (Dense) (None, 120) 30840 \n", 159 | "_________________________________________________________________\n", 160 | "dense_15 (Dense) (None, 84) 10164 \n", 161 | "_________________________________________________________________\n", 162 | "dense_16 (Dense) (None, 10) 850 \n", 163 | "=================================================================\n", 164 | "Total params: 45,278\n", 165 | "Trainable params: 45,278\n", 166 | "Non-trainable params: 0\n", 167 | "_________________________________________________________________\n" 168 | ] 169 | } 170 | ], 171 | "source": [ 172 | "# 构建LeNet-5网络\n", 173 | "lenet = Sequential()\n", 174 | "lenet.add(Conv2D(input_shape = (28,28,1), filters=8, kernel_size=(5,5), padding='valid', activation='relu'))\n", 175 | "lenet.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 176 | "lenet.add(Conv2D(input_shape=(16,16,8), filters=16, kernel_size=(5,5), padding='valid', activation='relu'))\n", 177 | "lenet.add(MaxPool2D(pool_size=(2,2), strides=2))\n", 178 | "lenet.add(Flatten())\n", 179 | "lenet.add(Dense(120, activation='relu'))\n", 180 | "lenet.add(Dense(84, activation='relu'))\n", 181 | "lenet.add(Dense(10, activation='softmax'))\n", 182 | "lenet.summary()" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 10, 188 | "metadata": {}, 189 | "outputs": [ 190 | { 191 | "name": "stdout", 192 | "output_type": "stream", 193 | "text": [ 194 | "Epoch 1/10\n", 195 | "60000/60000 [==============================] - 10s 172us/step - loss: 0.4354 - acc: 0.8739\n", 196 | "Epoch 2/10\n", 197 | "60000/60000 [==============================] - 10s 168us/step - loss: 0.1316 - acc: 0.9594\n", 198 | "Epoch 3/10\n", 199 | "60000/60000 [==============================] - 10s 169us/step - loss: 0.0968 - acc: 0.9703\n", 200 | "Epoch 4/10\n", 201 | "60000/60000 [==============================] - 10s 166us/step - loss: 0.0791 - acc: 0.9758\n", 202 | "Epoch 5/10\n", 203 | "60000/60000 [==============================] - 10s 169us/step - loss: 0.0669 - acc: 0.9795\n", 204 | "Epoch 6/10\n", 205 | "60000/60000 [==============================] - 10s 172us/step - loss: 0.0591 - acc: 0.9813\n", 206 | "Epoch 7/10\n", 207 | "60000/60000 [==============================] - 10s 172us/step - loss: 0.0514 - acc: 0.9840\n", 208 | "Epoch 8/10\n", 209 | "60000/60000 [==============================] - 11s 179us/step - loss: 0.0452 - acc: 0.9858\n", 210 | "Epoch 9/10\n", 211 | "60000/60000 [==============================] - 10s 172us/step - loss: 0.0408 - acc: 0.9869\n", 212 | "Epoch 10/10\n", 213 | "60000/60000 [==============================] - 10s 172us/step - loss: 0.0370 - acc: 0.9886\n" 214 | ] 215 | } 216 | ], 217 | "source": [ 218 | "lenet.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])\n", 219 | "lenet_history = lenet.fit(x_train, y_train, batch_size=128, epochs=10)" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 32, 225 | "metadata": {}, 226 | "outputs": [ 227 | { 228 | "data": { 229 | "image/png": "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\n", 230 | "text/plain": [ 231 | "
" 232 | ] 233 | }, 234 | "metadata": {}, 235 | "output_type": "display_data" 236 | } 237 | ], 238 | "source": [ 239 | "# summarize history for accuracy\n", 240 | "plt.plot(lenet_history.history['loss'])\n", 241 | "plt.plot(history3.history['loss'])\n", 242 | "plt.title('model accuracy')\n", 243 | "plt.ylabel('loss')\n", 244 | "plt.xlabel('epoch')\n", 245 | "plt.legend(['lenet loss','NIN loss'], loc='upper right')\n", 246 | "plt.show()" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": null, 252 | "metadata": {}, 253 | "outputs": [], 254 | "source": [] 255 | } 256 | ], 257 | "metadata": { 258 | "kernelspec": { 259 | "display_name": "Python 3", 260 | "language": "python", 261 | "name": "python3" 262 | }, 263 | "language_info": { 264 | "codemirror_mode": { 265 | "name": "ipython", 266 | "version": 3 267 | }, 268 | "file_extension": ".py", 269 | "mimetype": "text/x-python", 270 | "name": "python", 271 | "nbconvert_exporter": "python", 272 | "pygments_lexer": "ipython3", 273 | "version": "3.6.5" 274 | } 275 | }, 276 | "nbformat": 4, 277 | "nbformat_minor": 2 278 | } 279 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CNN-Structures 2 | keras在各经典CNN网络的实现 -------------------------------------------------------------------------------- /VGG.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "/usr/local/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", 13 | " from ._conv import register_converters as _register_converters\n", 14 | "Using TensorFlow backend.\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "from keras.layers import Flatten, Conv2D, MaxPooling2D, Dense, Dropout, Input, Activation\n", 20 | "from keras.models import Model" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "name": "stdout", 30 | "output_type": "stream", 31 | "text": [ 32 | "_________________________________________________________________\n", 33 | "Layer (type) Output Shape Param # \n", 34 | "=================================================================\n", 35 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 36 | "_________________________________________________________________\n", 37 | "conv2d_1 (Conv2D) (None, 224, 224, 64) 640 \n", 38 | "_________________________________________________________________\n", 39 | "max_pooling2d_1 (MaxPooling2 (None, 112, 112, 64) 0 \n", 40 | "_________________________________________________________________\n", 41 | "conv2d_2 (Conv2D) (None, 112, 112, 128) 73856 \n", 42 | "_________________________________________________________________\n", 43 | "max_pooling2d_2 (MaxPooling2 (None, 56, 56, 128) 0 \n", 44 | "_________________________________________________________________\n", 45 | "conv2d_3 (Conv2D) (None, 56, 56, 256) 295168 \n", 46 | "_________________________________________________________________\n", 47 | "conv2d_4 (Conv2D) (None, 56, 56, 256) 590080 \n", 48 | "_________________________________________________________________\n", 49 | "max_pooling2d_3 (MaxPooling2 (None, 28, 28, 256) 0 \n", 50 | "_________________________________________________________________\n", 51 | "conv2d_5 (Conv2D) (None, 28, 28, 512) 1180160 \n", 52 | "_________________________________________________________________\n", 53 | "conv2d_6 (Conv2D) (None, 28, 28, 512) 2359808 \n", 54 | "_________________________________________________________________\n", 55 | "max_pooling2d_4 (MaxPooling2 (None, 14, 14, 512) 0 \n", 56 | "_________________________________________________________________\n", 57 | "conv2d_7 (Conv2D) (None, 14, 14, 512) 2359808 \n", 58 | "_________________________________________________________________\n", 59 | "conv2d_8 (Conv2D) (None, 14, 14, 512) 2359808 \n", 60 | "_________________________________________________________________\n", 61 | "max_pooling2d_5 (MaxPooling2 (None, 7, 7, 512) 0 \n", 62 | "_________________________________________________________________\n", 63 | "dense_1 (Dense) (None, 7, 7, 4096) 2101248 \n", 64 | "_________________________________________________________________\n", 65 | "dropout_1 (Dropout) (None, 7, 7, 4096) 0 \n", 66 | "_________________________________________________________________\n", 67 | "dense_2 (Dense) (None, 7, 7, 4096) 16781312 \n", 68 | "_________________________________________________________________\n", 69 | "dropout_2 (Dropout) (None, 7, 7, 4096) 0 \n", 70 | "_________________________________________________________________\n", 71 | "dense_3 (Dense) (None, 7, 7, 10) 40970 \n", 72 | "_________________________________________________________________\n", 73 | "activation_1 (Activation) (None, 7, 7, 10) 0 \n", 74 | "=================================================================\n", 75 | "Total params: 28,142,858\n", 76 | "Trainable params: 28,142,858\n", 77 | "Non-trainable params: 0\n", 78 | "_________________________________________________________________\n" 79 | ] 80 | } 81 | ], 82 | "source": [ 83 | "# VGG-A\n", 84 | "def vgg_a(x):\n", 85 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 86 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 87 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 88 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 89 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 90 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 91 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 92 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 93 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 94 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 95 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 96 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 97 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 98 | " x1 = Dense(4096, activation='relu')(x1)\n", 99 | " x1 = Dropout(0.5)(x1)\n", 100 | " x1 = Dense(4096, activation='relu')(x1)\n", 101 | " x1 = Dropout(0.5)(x1)\n", 102 | " x1 = Dense(10)(x1)\n", 103 | " output = Activation('softmax')(x1)\n", 104 | " return output\n", 105 | "\n", 106 | "input_img = Input(shape = (224,224,1))\n", 107 | "VGG_A = Model(input_img,vgg_a(input_img))\n", 108 | "VGG_A.summary()" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 3, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "name": "stdout", 118 | "output_type": "stream", 119 | "text": [ 120 | "_________________________________________________________________\n", 121 | "Layer (type) Output Shape Param # \n", 122 | "=================================================================\n", 123 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 124 | "_________________________________________________________________\n", 125 | "conv2d_9 (Conv2D) (None, 224, 224, 64) 640 \n", 126 | "_________________________________________________________________\n", 127 | "conv2d_10 (Conv2D) (None, 224, 224, 64) 36928 \n", 128 | "_________________________________________________________________\n", 129 | "max_pooling2d_6 (MaxPooling2 (None, 112, 112, 64) 0 \n", 130 | "_________________________________________________________________\n", 131 | "conv2d_11 (Conv2D) (None, 112, 112, 128) 73856 \n", 132 | "_________________________________________________________________\n", 133 | "conv2d_12 (Conv2D) (None, 112, 112, 128) 147584 \n", 134 | "_________________________________________________________________\n", 135 | "max_pooling2d_7 (MaxPooling2 (None, 56, 56, 128) 0 \n", 136 | "_________________________________________________________________\n", 137 | "conv2d_13 (Conv2D) (None, 56, 56, 256) 295168 \n", 138 | "_________________________________________________________________\n", 139 | "conv2d_14 (Conv2D) (None, 56, 56, 256) 590080 \n", 140 | "_________________________________________________________________\n", 141 | "max_pooling2d_8 (MaxPooling2 (None, 28, 28, 256) 0 \n", 142 | "_________________________________________________________________\n", 143 | "conv2d_15 (Conv2D) (None, 28, 28, 512) 1180160 \n", 144 | "_________________________________________________________________\n", 145 | "conv2d_16 (Conv2D) (None, 28, 28, 512) 2359808 \n", 146 | "_________________________________________________________________\n", 147 | "max_pooling2d_9 (MaxPooling2 (None, 14, 14, 512) 0 \n", 148 | "_________________________________________________________________\n", 149 | "conv2d_17 (Conv2D) (None, 14, 14, 512) 2359808 \n", 150 | "_________________________________________________________________\n", 151 | "conv2d_18 (Conv2D) (None, 14, 14, 512) 2359808 \n", 152 | "_________________________________________________________________\n", 153 | "max_pooling2d_10 (MaxPooling (None, 7, 7, 512) 0 \n", 154 | "_________________________________________________________________\n", 155 | "dense_4 (Dense) (None, 7, 7, 4096) 2101248 \n", 156 | "_________________________________________________________________\n", 157 | "dropout_3 (Dropout) (None, 7, 7, 4096) 0 \n", 158 | "_________________________________________________________________\n", 159 | "dense_5 (Dense) (None, 7, 7, 4096) 16781312 \n", 160 | "_________________________________________________________________\n", 161 | "dropout_4 (Dropout) (None, 7, 7, 4096) 0 \n", 162 | "_________________________________________________________________\n", 163 | "dense_6 (Dense) (None, 7, 7, 10) 40970 \n", 164 | "_________________________________________________________________\n", 165 | "activation_2 (Activation) (None, 7, 7, 10) 0 \n", 166 | "=================================================================\n", 167 | "Total params: 28,327,370\n", 168 | "Trainable params: 28,327,370\n", 169 | "Non-trainable params: 0\n", 170 | "_________________________________________________________________\n" 171 | ] 172 | } 173 | ], 174 | "source": [ 175 | "# VGG-B\n", 176 | "def vgg_b(x):\n", 177 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 178 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x1)\n", 179 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 180 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 181 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 182 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 183 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 184 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 185 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 186 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 187 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 188 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 189 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 190 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 191 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 192 | " x1 = Dense(4096, activation='relu')(x1)\n", 193 | " x1 = Dropout(0.5)(x1)\n", 194 | " x1 = Dense(4096, activation='relu')(x1)\n", 195 | " x1 = Dropout(0.5)(x1)\n", 196 | " x1 = Dense(10)(x1)\n", 197 | " output = Activation('softmax')(x1)\n", 198 | " return output\n", 199 | "\n", 200 | "VGG_B = Model(input_img,vgg_b(input_img))\n", 201 | "VGG_B.summary()" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": 4, 207 | "metadata": {}, 208 | "outputs": [ 209 | { 210 | "name": "stdout", 211 | "output_type": "stream", 212 | "text": [ 213 | "_________________________________________________________________\n", 214 | "Layer (type) Output Shape Param # \n", 215 | "=================================================================\n", 216 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 217 | "_________________________________________________________________\n", 218 | "conv2d_19 (Conv2D) (None, 224, 224, 64) 640 \n", 219 | "_________________________________________________________________\n", 220 | "conv2d_20 (Conv2D) (None, 224, 224, 64) 36928 \n", 221 | "_________________________________________________________________\n", 222 | "max_pooling2d_11 (MaxPooling (None, 112, 112, 64) 0 \n", 223 | "_________________________________________________________________\n", 224 | "conv2d_21 (Conv2D) (None, 112, 112, 128) 73856 \n", 225 | "_________________________________________________________________\n", 226 | "conv2d_22 (Conv2D) (None, 112, 112, 128) 147584 \n", 227 | "_________________________________________________________________\n", 228 | "max_pooling2d_12 (MaxPooling (None, 56, 56, 128) 0 \n", 229 | "_________________________________________________________________\n", 230 | "conv2d_23 (Conv2D) (None, 56, 56, 256) 295168 \n", 231 | "_________________________________________________________________\n", 232 | "conv2d_24 (Conv2D) (None, 56, 56, 256) 590080 \n", 233 | "_________________________________________________________________\n", 234 | "conv2d_25 (Conv2D) (None, 56, 56, 256) 65792 \n", 235 | "_________________________________________________________________\n", 236 | "max_pooling2d_13 (MaxPooling (None, 28, 28, 256) 0 \n", 237 | "_________________________________________________________________\n", 238 | "conv2d_26 (Conv2D) (None, 28, 28, 512) 1180160 \n", 239 | "_________________________________________________________________\n", 240 | "conv2d_27 (Conv2D) (None, 28, 28, 512) 2359808 \n", 241 | "_________________________________________________________________\n", 242 | "conv2d_28 (Conv2D) (None, 28, 28, 512) 262656 \n", 243 | "_________________________________________________________________\n", 244 | "max_pooling2d_14 (MaxPooling (None, 14, 14, 512) 0 \n", 245 | "_________________________________________________________________\n", 246 | "conv2d_29 (Conv2D) (None, 14, 14, 512) 2359808 \n", 247 | "_________________________________________________________________\n", 248 | "conv2d_30 (Conv2D) (None, 14, 14, 512) 2359808 \n", 249 | "_________________________________________________________________\n", 250 | "conv2d_31 (Conv2D) (None, 14, 14, 512) 262656 \n", 251 | "_________________________________________________________________\n", 252 | "max_pooling2d_15 (MaxPooling (None, 7, 7, 512) 0 \n", 253 | "_________________________________________________________________\n", 254 | "dense_7 (Dense) (None, 7, 7, 4096) 2101248 \n", 255 | "_________________________________________________________________\n", 256 | "dropout_5 (Dropout) (None, 7, 7, 4096) 0 \n", 257 | "_________________________________________________________________\n", 258 | "dense_8 (Dense) (None, 7, 7, 4096) 16781312 \n", 259 | "_________________________________________________________________\n", 260 | "dropout_6 (Dropout) (None, 7, 7, 4096) 0 \n", 261 | "_________________________________________________________________\n", 262 | "dense_9 (Dense) (None, 7, 7, 10) 40970 \n", 263 | "_________________________________________________________________\n", 264 | "activation_3 (Activation) (None, 7, 7, 10) 0 \n", 265 | "=================================================================\n", 266 | "Total params: 28,918,474\n", 267 | "Trainable params: 28,918,474\n", 268 | "Non-trainable params: 0\n", 269 | "_________________________________________________________________\n" 270 | ] 271 | } 272 | ], 273 | "source": [ 274 | "# VGG-C\n", 275 | "def vgg_c(x):\n", 276 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 277 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x1)\n", 278 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 279 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 280 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 281 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 282 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 283 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 284 | " x1 = Conv2D(256, (1,1), padding = 'same', activation='relu')(x1)\n", 285 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 286 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 287 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 288 | " x1 = Conv2D(512, (1,1), padding = 'same', activation='relu')(x1)\n", 289 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 290 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 291 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 292 | " x1 = Conv2D(512, (1,1), padding = 'same', activation='relu')(x1)\n", 293 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 294 | " x1 = Dense(4096, activation='relu')(x1)\n", 295 | " x1 = Dropout(0.5)(x1)\n", 296 | " x1 = Dense(4096, activation='relu')(x1)\n", 297 | " x1 = Dropout(0.5)(x1)\n", 298 | " x1 = Dense(10)(x1)\n", 299 | " output = Activation('softmax')(x1)\n", 300 | " return output\n", 301 | "\n", 302 | "VGG_C = Model(input_img,vgg_c(input_img))\n", 303 | "VGG_C.summary()" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 5, 309 | "metadata": {}, 310 | "outputs": [ 311 | { 312 | "name": "stdout", 313 | "output_type": "stream", 314 | "text": [ 315 | "_________________________________________________________________\n", 316 | "Layer (type) Output Shape Param # \n", 317 | "=================================================================\n", 318 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 319 | "_________________________________________________________________\n", 320 | "conv2d_32 (Conv2D) (None, 224, 224, 64) 640 \n", 321 | "_________________________________________________________________\n", 322 | "conv2d_33 (Conv2D) (None, 224, 224, 64) 36928 \n", 323 | "_________________________________________________________________\n", 324 | "max_pooling2d_16 (MaxPooling (None, 112, 112, 64) 0 \n", 325 | "_________________________________________________________________\n", 326 | "conv2d_34 (Conv2D) (None, 112, 112, 128) 73856 \n", 327 | "_________________________________________________________________\n", 328 | "conv2d_35 (Conv2D) (None, 112, 112, 128) 147584 \n", 329 | "_________________________________________________________________\n", 330 | "max_pooling2d_17 (MaxPooling (None, 56, 56, 128) 0 \n", 331 | "_________________________________________________________________\n", 332 | "conv2d_36 (Conv2D) (None, 56, 56, 256) 295168 \n", 333 | "_________________________________________________________________\n", 334 | "conv2d_37 (Conv2D) (None, 56, 56, 256) 590080 \n", 335 | "_________________________________________________________________\n", 336 | "conv2d_38 (Conv2D) (None, 56, 56, 256) 590080 \n", 337 | "_________________________________________________________________\n", 338 | "max_pooling2d_18 (MaxPooling (None, 28, 28, 256) 0 \n", 339 | "_________________________________________________________________\n", 340 | "conv2d_39 (Conv2D) (None, 28, 28, 512) 1180160 \n", 341 | "_________________________________________________________________\n", 342 | "conv2d_40 (Conv2D) (None, 28, 28, 512) 2359808 \n", 343 | "_________________________________________________________________\n", 344 | "conv2d_41 (Conv2D) (None, 28, 28, 512) 2359808 \n", 345 | "_________________________________________________________________\n", 346 | "max_pooling2d_19 (MaxPooling (None, 14, 14, 512) 0 \n", 347 | "_________________________________________________________________\n", 348 | "conv2d_42 (Conv2D) (None, 14, 14, 512) 2359808 \n", 349 | "_________________________________________________________________\n", 350 | "conv2d_43 (Conv2D) (None, 14, 14, 512) 2359808 \n", 351 | "_________________________________________________________________\n", 352 | "conv2d_44 (Conv2D) (None, 14, 14, 512) 2359808 \n", 353 | "_________________________________________________________________\n", 354 | "max_pooling2d_20 (MaxPooling (None, 7, 7, 512) 0 \n", 355 | "_________________________________________________________________\n", 356 | "dense_10 (Dense) (None, 7, 7, 4096) 2101248 \n", 357 | "_________________________________________________________________\n", 358 | "dropout_7 (Dropout) (None, 7, 7, 4096) 0 \n", 359 | "_________________________________________________________________\n", 360 | "dense_11 (Dense) (None, 7, 7, 4096) 16781312 \n", 361 | "_________________________________________________________________\n", 362 | "dropout_8 (Dropout) (None, 7, 7, 4096) 0 \n", 363 | "_________________________________________________________________\n", 364 | "dense_12 (Dense) (None, 7, 7, 10) 40970 \n", 365 | "_________________________________________________________________\n", 366 | "activation_4 (Activation) (None, 7, 7, 10) 0 \n", 367 | "=================================================================\n", 368 | "Total params: 33,637,066\n", 369 | "Trainable params: 33,637,066\n", 370 | "Non-trainable params: 0\n", 371 | "_________________________________________________________________\n" 372 | ] 373 | } 374 | ], 375 | "source": [ 376 | "# VGG-D\n", 377 | "def vgg_d(x):\n", 378 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 379 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x1)\n", 380 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 381 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 382 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 383 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 384 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 385 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 386 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 387 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 388 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 389 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 390 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 391 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 392 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 393 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 394 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 395 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 396 | " x1 = Flatten()(x1)\n", 397 | " x1 = Dense(4096, activation='relu')(x1)\n", 398 | " x1 = Dropout(0.5)(x1)\n", 399 | " x1 = Dense(4096, activation='relu')(x1)\n", 400 | " x1 = Dropout(0.5)(x1)\n", 401 | " x1 = Dense(10)(x1)\n", 402 | " output = Activation('softmax')(x1)\n", 403 | " return output\n", 404 | "\n", 405 | "VGG_D = Model(input_img,vgg_d(input_img))\n", 406 | "VGG_D.summary()" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": 14, 412 | "metadata": {}, 413 | "outputs": [ 414 | { 415 | "name": "stdout", 416 | "output_type": "stream", 417 | "text": [ 418 | "_________________________________________________________________\n", 419 | "Layer (type) Output Shape Param # \n", 420 | "=================================================================\n", 421 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 422 | "_________________________________________________________________\n", 423 | "conv2d_187 (Conv2D) (None, 224, 224, 64) 640 \n", 424 | "_________________________________________________________________\n", 425 | "conv2d_188 (Conv2D) (None, 224, 224, 64) 36928 \n", 426 | "_________________________________________________________________\n", 427 | "max_pooling2d_61 (MaxPooling (None, 112, 112, 64) 0 \n", 428 | "_________________________________________________________________\n", 429 | "conv2d_189 (Conv2D) (None, 112, 112, 128) 73856 \n", 430 | "_________________________________________________________________\n", 431 | "conv2d_190 (Conv2D) (None, 112, 112, 128) 147584 \n", 432 | "_________________________________________________________________\n", 433 | "max_pooling2d_62 (MaxPooling (None, 56, 56, 128) 0 \n", 434 | "_________________________________________________________________\n", 435 | "conv2d_191 (Conv2D) (None, 56, 56, 256) 295168 \n", 436 | "_________________________________________________________________\n", 437 | "conv2d_192 (Conv2D) (None, 56, 56, 256) 590080 \n", 438 | "_________________________________________________________________\n", 439 | "conv2d_193 (Conv2D) (None, 56, 56, 256) 590080 \n", 440 | "_________________________________________________________________\n", 441 | "conv2d_194 (Conv2D) (None, 56, 56, 256) 590080 \n", 442 | "_________________________________________________________________\n", 443 | "max_pooling2d_63 (MaxPooling (None, 28, 28, 256) 0 \n", 444 | "_________________________________________________________________\n", 445 | "conv2d_195 (Conv2D) (None, 28, 28, 512) 1180160 \n", 446 | "_________________________________________________________________\n", 447 | "conv2d_196 (Conv2D) (None, 28, 28, 512) 2359808 \n", 448 | "_________________________________________________________________\n", 449 | "conv2d_197 (Conv2D) (None, 28, 28, 512) 2359808 \n", 450 | "_________________________________________________________________\n", 451 | "conv2d_198 (Conv2D) (None, 28, 28, 512) 2359808 \n", 452 | "_________________________________________________________________\n", 453 | "max_pooling2d_64 (MaxPooling (None, 14, 14, 512) 0 \n", 454 | "_________________________________________________________________\n", 455 | "conv2d_199 (Conv2D) (None, 14, 14, 512) 2359808 \n", 456 | "_________________________________________________________________\n", 457 | "conv2d_200 (Conv2D) (None, 14, 14, 512) 2359808 \n", 458 | "_________________________________________________________________\n", 459 | "conv2d_201 (Conv2D) (None, 14, 14, 512) 2359808 \n", 460 | "_________________________________________________________________\n", 461 | "conv2d_202 (Conv2D) (None, 14, 14, 512) 2359808 \n", 462 | "_________________________________________________________________\n", 463 | "max_pooling2d_65 (MaxPooling (None, 7, 7, 512) 0 \n", 464 | "_________________________________________________________________\n", 465 | "flatten_3 (Flatten) (None, 25088) 0 \n", 466 | "_________________________________________________________________\n", 467 | "dense_22 (Dense) (None, 4096) 102764544 \n", 468 | "_________________________________________________________________\n", 469 | "dropout_23 (Dropout) (None, 4096) 0 \n", 470 | "_________________________________________________________________\n", 471 | "dense_23 (Dense) (None, 4096) 16781312 \n", 472 | "_________________________________________________________________\n", 473 | "dropout_24 (Dropout) (None, 4096) 0 \n", 474 | "_________________________________________________________________\n", 475 | "dense_24 (Dense) (None, 10) 40970 \n", 476 | "_________________________________________________________________\n", 477 | "activation_12 (Activation) (None, 10) 0 \n", 478 | "=================================================================\n", 479 | "Total params: 139,610,058\n", 480 | "Trainable params: 139,610,058\n", 481 | "Non-trainable params: 0\n", 482 | "_________________________________________________________________\n" 483 | ] 484 | } 485 | ], 486 | "source": [ 487 | "# VGG-E\n", 488 | "def vgg_e(x):\n", 489 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 490 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x1)\n", 491 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 492 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 493 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 494 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 495 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 496 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 497 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 498 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 499 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 500 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 501 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 502 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 503 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 504 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 505 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 506 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 507 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 508 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 509 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 510 | " x1 = Flatten()(x1)\n", 511 | " x1 = Dense(4096, activation='relu')(x1)\n", 512 | " x1 = Dropout(0.5)(x1)\n", 513 | " x1 = Dense(4096, activation='relu')(x1)\n", 514 | " x1 = Dropout(0.5)(x1)\n", 515 | " x1 = Dense(10)(x1)\n", 516 | " output = Activation('softmax')(x1)\n", 517 | " return output\n", 518 | "\n", 519 | "VGG_E = Model(input_img,vgg_e(input_img))\n", 520 | "VGG_E.summary()" 521 | ] 522 | }, 523 | { 524 | "cell_type": "code", 525 | "execution_count": 15, 526 | "metadata": {}, 527 | "outputs": [ 528 | { 529 | "name": "stdout", 530 | "output_type": "stream", 531 | "text": [ 532 | "_________________________________________________________________\n", 533 | "Layer (type) Output Shape Param # \n", 534 | "=================================================================\n", 535 | "input_1 (InputLayer) (None, 224, 224, 1) 0 \n", 536 | "_________________________________________________________________\n", 537 | "conv2d_203 (Conv2D) (None, 224, 224, 64) 640 \n", 538 | "_________________________________________________________________\n", 539 | "conv2d_204 (Conv2D) (None, 224, 224, 64) 36928 \n", 540 | "_________________________________________________________________\n", 541 | "max_pooling2d_66 (MaxPooling (None, 112, 112, 64) 0 \n", 542 | "_________________________________________________________________\n", 543 | "conv2d_205 (Conv2D) (None, 112, 112, 128) 73856 \n", 544 | "_________________________________________________________________\n", 545 | "conv2d_206 (Conv2D) (None, 112, 112, 128) 147584 \n", 546 | "_________________________________________________________________\n", 547 | "max_pooling2d_67 (MaxPooling (None, 56, 56, 128) 0 \n", 548 | "_________________________________________________________________\n", 549 | "conv2d_207 (Conv2D) (None, 56, 56, 256) 295168 \n", 550 | "_________________________________________________________________\n", 551 | "conv2d_208 (Conv2D) (None, 56, 56, 256) 590080 \n", 552 | "_________________________________________________________________\n", 553 | "conv2d_209 (Conv2D) (None, 56, 56, 256) 590080 \n", 554 | "_________________________________________________________________\n", 555 | "conv2d_210 (Conv2D) (None, 56, 56, 256) 590080 \n", 556 | "_________________________________________________________________\n", 557 | "max_pooling2d_68 (MaxPooling (None, 28, 28, 256) 0 \n", 558 | "_________________________________________________________________\n", 559 | "conv2d_211 (Conv2D) (None, 28, 28, 512) 1180160 \n", 560 | "_________________________________________________________________\n", 561 | "conv2d_212 (Conv2D) (None, 28, 28, 512) 2359808 \n", 562 | "_________________________________________________________________\n", 563 | "conv2d_213 (Conv2D) (None, 28, 28, 512) 2359808 \n", 564 | "_________________________________________________________________\n", 565 | "conv2d_214 (Conv2D) (None, 28, 28, 512) 2359808 \n", 566 | "_________________________________________________________________\n", 567 | "max_pooling2d_69 (MaxPooling (None, 14, 14, 512) 0 \n", 568 | "_________________________________________________________________\n", 569 | "conv2d_215 (Conv2D) (None, 14, 14, 512) 2359808 \n", 570 | "_________________________________________________________________\n", 571 | "conv2d_216 (Conv2D) (None, 14, 14, 512) 2359808 \n", 572 | "_________________________________________________________________\n", 573 | "conv2d_217 (Conv2D) (None, 14, 14, 512) 2359808 \n", 574 | "_________________________________________________________________\n", 575 | "conv2d_218 (Conv2D) (None, 14, 14, 512) 2359808 \n", 576 | "_________________________________________________________________\n", 577 | "max_pooling2d_70 (MaxPooling (None, 7, 7, 512) 0 \n", 578 | "_________________________________________________________________\n", 579 | "conv2d_219 (Conv2D) (None, 1, 1, 4096) 102764544 \n", 580 | "_________________________________________________________________\n", 581 | "dropout_25 (Dropout) (None, 1, 1, 4096) 0 \n", 582 | "_________________________________________________________________\n", 583 | "conv2d_220 (Conv2D) (None, 1, 1, 4096) 16781312 \n", 584 | "_________________________________________________________________\n", 585 | "dropout_26 (Dropout) (None, 1, 1, 4096) 0 \n", 586 | "_________________________________________________________________\n", 587 | "conv2d_221 (Conv2D) (None, 1, 1, 10) 40970 \n", 588 | "_________________________________________________________________\n", 589 | "activation_13 (Activation) (None, 1, 1, 10) 0 \n", 590 | "=================================================================\n", 591 | "Total params: 139,610,058\n", 592 | "Trainable params: 139,610,058\n", 593 | "Non-trainable params: 0\n", 594 | "_________________________________________________________________\n" 595 | ] 596 | } 597 | ], 598 | "source": [ 599 | "# VGG-E-test\n", 600 | "def vgg_e_test(x):\n", 601 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x)\n", 602 | " x1 = Conv2D(64, (3,3), padding = 'same', activation='relu')(x1)\n", 603 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 604 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 605 | " x1 = Conv2D(128, (3,3), padding = 'same', activation='relu')(x1)\n", 606 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 607 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 608 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 609 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 610 | " x1 = Conv2D(256, (3,3), padding = 'same', activation='relu')(x1)\n", 611 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 612 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 613 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 614 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 615 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 616 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1)\n", 617 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 618 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 619 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 620 | " x1 = Conv2D(512, (3,3), padding = 'same', activation='relu')(x1)\n", 621 | " x1 = MaxPooling2D(pool_size=(2,2), strides=2)(x1) \n", 622 | " x1 = Conv2D(4096, (7,7), activation='relu')(x1)\n", 623 | " x1 = Dropout(0.5)(x1)\n", 624 | " x1 = Conv2D(4096, (1, 1), activation='relu')(x1)\n", 625 | " x1 = Dropout(0.5)(x1)\n", 626 | " x1 = Conv2D(10,(1,1))(x1)\n", 627 | " output = Activation('softmax')(x1)\n", 628 | " return output\n", 629 | "\n", 630 | "VGG_E = Model(input_img,vgg_e_test(input_img))\n", 631 | "VGG_E.summary()" 632 | ] 633 | }, 634 | { 635 | "cell_type": "code", 636 | "execution_count": null, 637 | "metadata": {}, 638 | "outputs": [], 639 | "source": [] 640 | } 641 | ], 642 | "metadata": { 643 | "kernelspec": { 644 | "display_name": "Python 3", 645 | "language": "python", 646 | "name": "python3" 647 | }, 648 | "language_info": { 649 | "codemirror_mode": { 650 | "name": "ipython", 651 | "version": 3 652 | }, 653 | "file_extension": ".py", 654 | "mimetype": "text/x-python", 655 | "name": "python", 656 | "nbconvert_exporter": "python", 657 | "pygments_lexer": "ipython3", 658 | "version": "3.6.5" 659 | } 660 | }, 661 | "nbformat": 4, 662 | "nbformat_minor": 2 663 | } 664 | -------------------------------------------------------------------------------- /denseNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senliuy/CNN-Structures/f717d728245f4a668e7522939feadd8077a0712a/denseNet.png -------------------------------------------------------------------------------- /inception_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senliuy/CNN-Structures/f717d728245f4a668e7522939feadd8077a0712a/inception_net.png -------------------------------------------------------------------------------- /squeeze_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senliuy/CNN-Structures/f717d728245f4a668e7522939feadd8077a0712a/squeeze_net.png --------------------------------------------------------------------------------