├── .gitignore ├── 01.mnist_mpl.ipynb ├── 02.save_model.ipynb ├── 03.load_model.ipynb ├── 04.plot_acc_loss.ipynb ├── 05.mnist_cnn.ipynb ├── 06.cifar10_cnn.ipynb ├── 07.mnist_lstm.ipynb ├── 08.vgg-16.ipynb ├── 09.conv_filter_visualization.ipynb ├── 10.variational_autoencoder.ipynb ├── 11.mnist_transfer_cnn.ipynb ├── 12.mnist_sklearn_wrapper.ipynb ├── 13.Keras_with_tensorflow.ipynb ├── 14.finetune_InceptionV3.ipynb ├── 15.autoencoder.ipynb ├── 16.Convolutional_autoencoder.ipynb └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /*/.ipynb_checkpoints/* 2 | /.ipynb_checkpoints/* 3 | *-checkpoint.ipynb 4 | *.pyc 5 | *.h5 6 | *.png 7 | *.jpg 8 | /data/* 9 | -------------------------------------------------------------------------------- /01.mnist_mpl.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含两个隐藏层的神经网络。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": true 27 | }, 28 | "outputs": [], 29 | "source": [ 30 | "from __future__ import print_function\n", 31 | "import numpy as np\n", 32 | "np.random.seed(1337) # for reproducibility" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stderr", 44 | "output_type": "stream", 45 | "text": [ 46 | "Using TensorFlow backend.\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "from keras.datasets import mnist\n", 52 | "from keras.models import Sequential\n", 53 | "from keras.layers.core import Dense, Dropout, Activation\n", 54 | "from keras.optimizers import SGD, Adam, RMSprop\n", 55 | "from keras.utils import np_utils" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "#### 如需绘制模型请加载plot" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "from keras.utils.visualize_util import plot" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "## 2.变量初始化" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "batch_size = 128 \n", 92 | "nb_classes = 10\n", 93 | "nb_epoch = 20 " 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "## 3.准备数据" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 5, 106 | "metadata": { 107 | "collapsed": false 108 | }, 109 | "outputs": [ 110 | { 111 | "name": "stdout", 112 | "output_type": "stream", 113 | "text": [ 114 | "60000 train samples\n", 115 | "10000 test samples\n" 116 | ] 117 | } 118 | ], 119 | "source": [ 120 | "# the data, shuffled and split between train and test sets\n", 121 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 122 | "\n", 123 | "X_train = X_train.reshape(60000, 784)\n", 124 | "X_test = X_test.reshape(10000, 784)\n", 125 | "X_train = X_train.astype('float32')\n", 126 | "X_test = X_test.astype('float32')\n", 127 | "X_train /= 255\n", 128 | "X_test /= 255\n", 129 | "print(X_train.shape[0], 'train samples')\n", 130 | "print(X_test.shape[0], 'test samples')" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "### 转换类标号" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 6, 143 | "metadata": { 144 | "collapsed": true 145 | }, 146 | "outputs": [], 147 | "source": [ 148 | "# convert class vectors to binary class matrices\n", 149 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 150 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "## 4.建立模型\n", 158 | "### 使用Sequential()" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 7, 164 | "metadata": { 165 | "collapsed": true 166 | }, 167 | "outputs": [], 168 | "source": [ 169 | "model = Sequential()\n", 170 | "model.add(Dense(512, input_shape=(784,)))\n", 171 | "model.add(Activation('relu'))\n", 172 | "model.add(Dropout(0.2))\n", 173 | "model.add(Dense(512))\n", 174 | "model.add(Activation('relu'))\n", 175 | "model.add(Dropout(0.2))\n", 176 | "model.add(Dense(10))\n", 177 | "model.add(Activation('softmax'))" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": {}, 183 | "source": [ 184 | "### 打印模型" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": 8, 190 | "metadata": { 191 | "collapsed": false 192 | }, 193 | "outputs": [ 194 | { 195 | "name": "stdout", 196 | "output_type": "stream", 197 | "text": [ 198 | "____________________________________________________________________________________________________\n", 199 | "Layer (type) Output Shape Param # Connected to \n", 200 | "====================================================================================================\n", 201 | "dense_1 (Dense) (None, 512) 401920 dense_input_1[0][0] \n", 202 | "____________________________________________________________________________________________________\n", 203 | "activation_1 (Activation) (None, 512) 0 dense_1[0][0] \n", 204 | "____________________________________________________________________________________________________\n", 205 | "dropout_1 (Dropout) (None, 512) 0 activation_1[0][0] \n", 206 | "____________________________________________________________________________________________________\n", 207 | "dense_2 (Dense) (None, 512) 262656 dropout_1[0][0] \n", 208 | "____________________________________________________________________________________________________\n", 209 | "activation_2 (Activation) (None, 512) 0 dense_2[0][0] \n", 210 | "____________________________________________________________________________________________________\n", 211 | "dropout_2 (Dropout) (None, 512) 0 activation_2[0][0] \n", 212 | "____________________________________________________________________________________________________\n", 213 | "dense_3 (Dense) (None, 10) 5130 dropout_2[0][0] \n", 214 | "____________________________________________________________________________________________________\n", 215 | "activation_3 (Activation) (None, 10) 0 dense_3[0][0] \n", 216 | "====================================================================================================\n", 217 | "Total params: 669706\n", 218 | "____________________________________________________________________________________________________\n" 219 | ] 220 | } 221 | ], 222 | "source": [ 223 | "model.summary()" 224 | ] 225 | }, 226 | { 227 | "cell_type": "markdown", 228 | "metadata": {}, 229 | "source": [ 230 | "### 绘制模型结构图,并保存成图片" 231 | ] 232 | }, 233 | { 234 | "cell_type": "code", 235 | "execution_count": 9, 236 | "metadata": { 237 | "collapsed": true 238 | }, 239 | "outputs": [], 240 | "source": [ 241 | "plot(model, to_file='model.png')" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "#### 显示绘制的图片\n", 249 | "![image](http://p1.bpimg.com/4851/4025c3b85df0e4f2.png)" 250 | ] 251 | }, 252 | { 253 | "cell_type": "markdown", 254 | "metadata": {}, 255 | "source": [ 256 | "## 5.训练与评估\n", 257 | "### 编译模型" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 10, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "model.compile(loss='categorical_crossentropy',\n", 269 | " optimizer=RMSprop(),\n", 270 | " metrics=['accuracy'])" 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "metadata": {}, 276 | "source": [ 277 | "### 迭代训练" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 11, 283 | "metadata": { 284 | "collapsed": false 285 | }, 286 | "outputs": [ 287 | { 288 | "name": "stdout", 289 | "output_type": "stream", 290 | "text": [ 291 | "Train on 60000 samples, validate on 10000 samples\n", 292 | "Epoch 1/20\n", 293 | "60000/60000 [==============================] - 4s - loss: 0.2448 - acc: 0.9239 - val_loss: 0.1220 - val_acc: 0.9623\n", 294 | "Epoch 2/20\n", 295 | "60000/60000 [==============================] - 4s - loss: 0.1026 - acc: 0.9689 - val_loss: 0.0788 - val_acc: 0.9749\n", 296 | "Epoch 3/20\n", 297 | "60000/60000 [==============================] - 5s - loss: 0.0752 - acc: 0.9770 - val_loss: 0.0734 - val_acc: 0.9779\n", 298 | "Epoch 4/20\n", 299 | "60000/60000 [==============================] - 5s - loss: 0.0609 - acc: 0.9817 - val_loss: 0.0777 - val_acc: 0.9780\n", 300 | "Epoch 5/20\n", 301 | "60000/60000 [==============================] - 5s - loss: 0.0515 - acc: 0.9847 - val_loss: 0.0888 - val_acc: 0.9782\n", 302 | "Epoch 6/20\n", 303 | "60000/60000 [==============================] - 5s - loss: 0.0451 - acc: 0.9864 - val_loss: 0.0799 - val_acc: 0.9803\n", 304 | "Epoch 7/20\n", 305 | "60000/60000 [==============================] - 5s - loss: 0.0398 - acc: 0.9878 - val_loss: 0.0814 - val_acc: 0.9809\n", 306 | "Epoch 8/20\n", 307 | "60000/60000 [==============================] - 5s - loss: 0.0362 - acc: 0.9896 - val_loss: 0.0765 - val_acc: 0.9830\n", 308 | "Epoch 9/20\n", 309 | "60000/60000 [==============================] - 5s - loss: 0.0325 - acc: 0.9905 - val_loss: 0.0917 - val_acc: 0.9802\n", 310 | "Epoch 10/20\n", 311 | "60000/60000 [==============================] - 5s - loss: 0.0279 - acc: 0.9921 - val_loss: 0.0808 - val_acc: 0.9844\n", 312 | "Epoch 11/20\n", 313 | "60000/60000 [==============================] - 5s - loss: 0.0272 - acc: 0.9925 - val_loss: 0.0991 - val_acc: 0.9811\n", 314 | "Epoch 12/20\n", 315 | "60000/60000 [==============================] - 5s - loss: 0.0248 - acc: 0.9930 - val_loss: 0.0864 - val_acc: 0.9839\n", 316 | "Epoch 13/20\n", 317 | "60000/60000 [==============================] - 5s - loss: 0.0240 - acc: 0.9935 - val_loss: 0.1061 - val_acc: 0.9809\n", 318 | "Epoch 14/20\n", 319 | "60000/60000 [==============================] - 5s - loss: 0.0240 - acc: 0.9931 - val_loss: 0.1010 - val_acc: 0.9843\n", 320 | "Epoch 15/20\n", 321 | "60000/60000 [==============================] - 5s - loss: 0.0200 - acc: 0.9946 - val_loss: 0.1102 - val_acc: 0.9803\n", 322 | "Epoch 16/20\n", 323 | "60000/60000 [==============================] - 5s - loss: 0.0207 - acc: 0.9942 - val_loss: 0.1020 - val_acc: 0.9833\n", 324 | "Epoch 17/20\n", 325 | "60000/60000 [==============================] - 5s - loss: 0.0196 - acc: 0.9946 - val_loss: 0.1205 - val_acc: 0.9812\n", 326 | "Epoch 18/20\n", 327 | "60000/60000 [==============================] - 4s - loss: 0.0208 - acc: 0.9950 - val_loss: 0.1081 - val_acc: 0.9829\n", 328 | "Epoch 19/20\n", 329 | "60000/60000 [==============================] - 3s - loss: 0.0199 - acc: 0.9951 - val_loss: 0.1113 - val_acc: 0.9835\n", 330 | "Epoch 20/20\n", 331 | "60000/60000 [==============================] - 4s - loss: 0.0186 - acc: 0.9953 - val_loss: 0.1168 - val_acc: 0.9849\n" 332 | ] 333 | } 334 | ], 335 | "source": [ 336 | "history = model.fit(X_train, Y_train,\n", 337 | " batch_size=batch_size, nb_epoch=nb_epoch,\n", 338 | " verbose=1, validation_data=(X_test, Y_test))" 339 | ] 340 | }, 341 | { 342 | "cell_type": "markdown", 343 | "metadata": {}, 344 | "source": [ 345 | "### 模型评估" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": 12, 351 | "metadata": { 352 | "collapsed": false 353 | }, 354 | "outputs": [ 355 | { 356 | "name": "stdout", 357 | "output_type": "stream", 358 | "text": [ 359 | "Test score: 0.11684127673\n", 360 | "Test accuracy: 0.9849\n" 361 | ] 362 | } 363 | ], 364 | "source": [ 365 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 366 | "print('Test score:', score[0])\n", 367 | "print('Test accuracy:', score[1])" 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": null, 373 | "metadata": { 374 | "collapsed": true 375 | }, 376 | "outputs": [], 377 | "source": [] 378 | } 379 | ], 380 | "metadata": { 381 | "kernelspec": { 382 | "display_name": "Python 2", 383 | "language": "python", 384 | "name": "python2" 385 | }, 386 | "language_info": { 387 | "codemirror_mode": { 388 | "name": "ipython", 389 | "version": 2 390 | }, 391 | "file_extension": ".py", 392 | "mimetype": "text/x-python", 393 | "name": "python", 394 | "nbconvert_exporter": "python", 395 | "pygments_lexer": "ipython2", 396 | "version": "2.7.12" 397 | }, 398 | "ssap_exp_config": { 399 | "error_alert": "Error Occurs!", 400 | "initial": [], 401 | "max_iteration": 1000, 402 | "recv_id": "", 403 | "running": [], 404 | "summary": [], 405 | "version": "1.1.1" 406 | } 407 | }, 408 | "nbformat": 4, 409 | "nbformat_minor": 0 410 | } 411 | -------------------------------------------------------------------------------- /02.save_model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含两个隐藏层的神经网络,最后会保存模型到h5文件中。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": true 27 | }, 28 | "outputs": [], 29 | "source": [ 30 | "from __future__ import print_function\n", 31 | "import numpy as np\n", 32 | "np.random.seed(1337) # for reproducibility" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stderr", 44 | "output_type": "stream", 45 | "text": [ 46 | "Using TensorFlow backend.\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "from keras.datasets import mnist\n", 52 | "from keras.models import Sequential\n", 53 | "from keras.layers.core import Dense, Dropout, Activation\n", 54 | "from keras.optimizers import SGD, Adam, RMSprop\n", 55 | "from keras.utils import np_utils" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "## 2.变量初始化" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "batch_size = 128 \n", 74 | "nb_classes = 10\n", 75 | "nb_epoch = 20 " 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "## 3.准备数据" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 4, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "60000 train samples\n", 97 | "10000 test samples\n" 98 | ] 99 | } 100 | ], 101 | "source": [ 102 | "# the data, shuffled and split between train and test sets\n", 103 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 104 | "\n", 105 | "X_train = X_train.reshape(60000, 784)\n", 106 | "X_test = X_test.reshape(10000, 784)\n", 107 | "X_train = X_train.astype('float32')\n", 108 | "X_test = X_test.astype('float32')\n", 109 | "X_train /= 255\n", 110 | "X_test /= 255\n", 111 | "print(X_train.shape[0], 'train samples')\n", 112 | "print(X_test.shape[0], 'test samples')" 113 | ] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": {}, 118 | "source": [ 119 | "### 转换类标号" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": 5, 125 | "metadata": { 126 | "collapsed": true 127 | }, 128 | "outputs": [], 129 | "source": [ 130 | "# convert class vectors to binary class matrices\n", 131 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 132 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 133 | ] 134 | }, 135 | { 136 | "cell_type": "markdown", 137 | "metadata": {}, 138 | "source": [ 139 | "## 4.建立模型\n", 140 | "### 使用Sequential()" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": 6, 146 | "metadata": { 147 | "collapsed": true 148 | }, 149 | "outputs": [], 150 | "source": [ 151 | "model = Sequential()\n", 152 | "model.add(Dense(512, input_shape=(784,)))\n", 153 | "model.add(Activation('relu'))\n", 154 | "model.add(Dropout(0.2))\n", 155 | "model.add(Dense(512))\n", 156 | "model.add(Activation('relu'))\n", 157 | "model.add(Dropout(0.2))\n", 158 | "model.add(Dense(10))\n", 159 | "model.add(Activation('softmax'))" 160 | ] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "metadata": {}, 165 | "source": [ 166 | "### 打印模型" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 7, 172 | "metadata": { 173 | "collapsed": false 174 | }, 175 | "outputs": [ 176 | { 177 | "name": "stdout", 178 | "output_type": "stream", 179 | "text": [ 180 | "____________________________________________________________________________________________________\n", 181 | "Layer (type) Output Shape Param # Connected to \n", 182 | "====================================================================================================\n", 183 | "dense_1 (Dense) (None, 512) 401920 dense_input_1[0][0] \n", 184 | "____________________________________________________________________________________________________\n", 185 | "activation_1 (Activation) (None, 512) 0 dense_1[0][0] \n", 186 | "____________________________________________________________________________________________________\n", 187 | "dropout_1 (Dropout) (None, 512) 0 activation_1[0][0] \n", 188 | "____________________________________________________________________________________________________\n", 189 | "dense_2 (Dense) (None, 512) 262656 dropout_1[0][0] \n", 190 | "____________________________________________________________________________________________________\n", 191 | "activation_2 (Activation) (None, 512) 0 dense_2[0][0] \n", 192 | "____________________________________________________________________________________________________\n", 193 | "dropout_2 (Dropout) (None, 512) 0 activation_2[0][0] \n", 194 | "____________________________________________________________________________________________________\n", 195 | "dense_3 (Dense) (None, 10) 5130 dropout_2[0][0] \n", 196 | "____________________________________________________________________________________________________\n", 197 | "activation_3 (Activation) (None, 10) 0 dense_3[0][0] \n", 198 | "====================================================================================================\n", 199 | "Total params: 669706\n", 200 | "____________________________________________________________________________________________________\n" 201 | ] 202 | } 203 | ], 204 | "source": [ 205 | "model.summary()" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "## 5.训练与评估\n", 213 | "### 编译模型" 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 8, 219 | "metadata": { 220 | "collapsed": true 221 | }, 222 | "outputs": [], 223 | "source": [ 224 | "model.compile(loss='categorical_crossentropy',\n", 225 | " optimizer=RMSprop(),\n", 226 | " metrics=['accuracy'])" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "### 迭代训练" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 9, 239 | "metadata": { 240 | "collapsed": false 241 | }, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "Train on 60000 samples, validate on 10000 samples\n", 248 | "Epoch 1/20\n", 249 | "60000/60000 [==============================] - 4s - loss: 0.2451 - acc: 0.9239 - val_loss: 0.1210 - val_acc: 0.9626\n", 250 | "Epoch 2/20\n", 251 | "60000/60000 [==============================] - 3s - loss: 0.1032 - acc: 0.9683 - val_loss: 0.0780 - val_acc: 0.9763\n", 252 | "Epoch 3/20\n", 253 | "60000/60000 [==============================] - 3s - loss: 0.0755 - acc: 0.9769 - val_loss: 0.0796 - val_acc: 0.9757\n", 254 | "Epoch 4/20\n", 255 | "60000/60000 [==============================] - 3s - loss: 0.0612 - acc: 0.9816 - val_loss: 0.0768 - val_acc: 0.9784\n", 256 | "Epoch 5/20\n", 257 | "60000/60000 [==============================] - 3s - loss: 0.0510 - acc: 0.9848 - val_loss: 0.0845 - val_acc: 0.9795\n", 258 | "Epoch 6/20\n", 259 | "60000/60000 [==============================] - 3s - loss: 0.0445 - acc: 0.9865 - val_loss: 0.0759 - val_acc: 0.9806\n", 260 | "Epoch 7/20\n", 261 | "60000/60000 [==============================] - 3s - loss: 0.0402 - acc: 0.9884 - val_loss: 0.0800 - val_acc: 0.9816\n", 262 | "Epoch 8/20\n", 263 | "60000/60000 [==============================] - 3s - loss: 0.0351 - acc: 0.9900 - val_loss: 0.0916 - val_acc: 0.9821\n", 264 | "Epoch 9/20\n", 265 | "60000/60000 [==============================] - 3s - loss: 0.0314 - acc: 0.9905 - val_loss: 0.0930 - val_acc: 0.9807\n", 266 | "Epoch 10/20\n", 267 | "60000/60000 [==============================] - 3s - loss: 0.0285 - acc: 0.9920 - val_loss: 0.0916 - val_acc: 0.9835\n", 268 | "Epoch 11/20\n", 269 | "60000/60000 [==============================] - 3s - loss: 0.0279 - acc: 0.9918 - val_loss: 0.0853 - val_acc: 0.9820\n", 270 | "Epoch 12/20\n", 271 | "60000/60000 [==============================] - 3s - loss: 0.0238 - acc: 0.9930 - val_loss: 0.0997 - val_acc: 0.9811\n", 272 | "Epoch 13/20\n", 273 | "60000/60000 [==============================] - 3s - loss: 0.0242 - acc: 0.9938 - val_loss: 0.1083 - val_acc: 0.9796\n", 274 | "Epoch 14/20\n", 275 | "60000/60000 [==============================] - 3s - loss: 0.0229 - acc: 0.9934 - val_loss: 0.1037 - val_acc: 0.9832\n", 276 | "Epoch 15/20\n", 277 | "60000/60000 [==============================] - 3s - loss: 0.0202 - acc: 0.9944 - val_loss: 0.1019 - val_acc: 0.9831\n", 278 | "Epoch 16/20\n", 279 | "60000/60000 [==============================] - 3s - loss: 0.0216 - acc: 0.9939 - val_loss: 0.1071 - val_acc: 0.9810\n", 280 | "Epoch 17/20\n", 281 | "60000/60000 [==============================] - 3s - loss: 0.0205 - acc: 0.9947 - val_loss: 0.1085 - val_acc: 0.9835\n", 282 | "Epoch 18/20\n", 283 | "60000/60000 [==============================] - 3s - loss: 0.0182 - acc: 0.9950 - val_loss: 0.1245 - val_acc: 0.9807\n", 284 | "Epoch 19/20\n", 285 | "60000/60000 [==============================] - 3s - loss: 0.0172 - acc: 0.9952 - val_loss: 0.1264 - val_acc: 0.9837\n", 286 | "Epoch 20/20\n", 287 | "60000/60000 [==============================] - 3s - loss: 0.0187 - acc: 0.9954 - val_loss: 0.1132 - val_acc: 0.9831\n" 288 | ] 289 | } 290 | ], 291 | "source": [ 292 | "history = model.fit(X_train, Y_train,\n", 293 | " batch_size=batch_size, nb_epoch=nb_epoch,\n", 294 | " verbose=1, validation_data=(X_test, Y_test))" 295 | ] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "metadata": {}, 300 | "source": [ 301 | "### 模型评估" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": 10, 307 | "metadata": { 308 | "collapsed": false 309 | }, 310 | "outputs": [ 311 | { 312 | "name": "stdout", 313 | "output_type": "stream", 314 | "text": [ 315 | "Test score: 0.113199677604\n", 316 | "Test accuracy: 0.9831\n" 317 | ] 318 | } 319 | ], 320 | "source": [ 321 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 322 | "print('Test score:', score[0])\n", 323 | "print('Test accuracy:', score[1])" 324 | ] 325 | }, 326 | { 327 | "cell_type": "markdown", 328 | "metadata": { 329 | "collapsed": true 330 | }, 331 | "source": [ 332 | "## 5.模型保存" 333 | ] 334 | }, 335 | { 336 | "cell_type": "code", 337 | "execution_count": 11, 338 | "metadata": { 339 | "collapsed": false 340 | }, 341 | "outputs": [], 342 | "source": [ 343 | "model.save('mnist-mpl.h5')" 344 | ] 345 | }, 346 | { 347 | "cell_type": "markdown", 348 | "metadata": {}, 349 | "source": [ 350 | "这个时候你的文件夹下就有一个名字为“mnist-mpl.h5”的模型文件了。" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": null, 356 | "metadata": { 357 | "collapsed": true 358 | }, 359 | "outputs": [], 360 | "source": [] 361 | } 362 | ], 363 | "metadata": { 364 | "kernelspec": { 365 | "display_name": "Python 2", 366 | "language": "python", 367 | "name": "python2" 368 | }, 369 | "language_info": { 370 | "codemirror_mode": { 371 | "name": "ipython", 372 | "version": 2 373 | }, 374 | "file_extension": ".py", 375 | "mimetype": "text/x-python", 376 | "name": "python", 377 | "nbconvert_exporter": "python", 378 | "pygments_lexer": "ipython2", 379 | "version": "2.7.12" 380 | }, 381 | "ssap_exp_config": { 382 | "error_alert": "Error Occurs!", 383 | "initial": [], 384 | "max_iteration": 1000, 385 | "recv_id": "", 386 | "running": [], 387 | "summary": [], 388 | "version": "1.1.1" 389 | } 390 | }, 391 | "nbformat": 4, 392 | "nbformat_minor": 0 393 | } 394 | -------------------------------------------------------------------------------- /03.load_model.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含两个隐藏层的神经网络。演示如何加载一个保存好的模型。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": true 27 | }, 28 | "outputs": [], 29 | "source": [ 30 | "from __future__ import print_function\n", 31 | "import numpy as np\n", 32 | "np.random.seed(1337) # for reproducibility" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stderr", 44 | "output_type": "stream", 45 | "text": [ 46 | "Using TensorFlow backend.\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "from keras.datasets import mnist\n", 52 | "from keras.models import Sequential\n", 53 | "from keras.layers.core import Dense, Dropout, Activation\n", 54 | "from keras.optimizers import SGD, Adam, RMSprop\n", 55 | "from keras.utils import np_utils" 56 | ] 57 | }, 58 | { 59 | "cell_type": "markdown", 60 | "metadata": {}, 61 | "source": [ 62 | "### 需要加载load_model" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": { 69 | "collapsed": true 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "from keras.models import load_model" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": {}, 79 | "source": [ 80 | "## 2.变量初始化" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 4, 86 | "metadata": { 87 | "collapsed": true 88 | }, 89 | "outputs": [], 90 | "source": [ 91 | "batch_size = 128 \n", 92 | "nb_classes = 10\n", 93 | "nb_epoch = 20 " 94 | ] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "metadata": {}, 99 | "source": [ 100 | "## 3.准备数据" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 5, 106 | "metadata": { 107 | "collapsed": false 108 | }, 109 | "outputs": [ 110 | { 111 | "name": "stdout", 112 | "output_type": "stream", 113 | "text": [ 114 | "60000 train samples\n", 115 | "10000 test samples\n" 116 | ] 117 | } 118 | ], 119 | "source": [ 120 | "# the data, shuffled and split between train and test sets\n", 121 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 122 | "\n", 123 | "X_train = X_train.reshape(60000, 784)\n", 124 | "X_test = X_test.reshape(10000, 784)\n", 125 | "X_train = X_train.astype('float32')\n", 126 | "X_test = X_test.astype('float32')\n", 127 | "X_train /= 255\n", 128 | "X_test /= 255\n", 129 | "print(X_train.shape[0], 'train samples')\n", 130 | "print(X_test.shape[0], 'test samples')" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "### 转换类标号" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 6, 143 | "metadata": { 144 | "collapsed": true 145 | }, 146 | "outputs": [], 147 | "source": [ 148 | "# convert class vectors to binary class matrices\n", 149 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 150 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "metadata": {}, 156 | "source": [ 157 | "## 4.建立模型\n", 158 | "### 在现有的文件中加载模型" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 7, 164 | "metadata": { 165 | "collapsed": false 166 | }, 167 | "outputs": [], 168 | "source": [ 169 | "model = load_model('mnist-mpl.h5')" 170 | ] 171 | }, 172 | { 173 | "cell_type": "markdown", 174 | "metadata": {}, 175 | "source": [ 176 | "### 打印模型" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 8, 182 | "metadata": { 183 | "collapsed": false 184 | }, 185 | "outputs": [ 186 | { 187 | "name": "stdout", 188 | "output_type": "stream", 189 | "text": [ 190 | "____________________________________________________________________________________________________\n", 191 | "Layer (type) Output Shape Param # Connected to \n", 192 | "====================================================================================================\n", 193 | "dense_1 (Dense) (None, 512) 401920 dense_input_1[0][0] \n", 194 | "____________________________________________________________________________________________________\n", 195 | "activation_1 (Activation) (None, 512) 0 dense_1[0][0] \n", 196 | "____________________________________________________________________________________________________\n", 197 | "dropout_1 (Dropout) (None, 512) 0 activation_1[0][0] \n", 198 | "____________________________________________________________________________________________________\n", 199 | "dense_2 (Dense) (None, 512) 262656 dropout_1[0][0] \n", 200 | "____________________________________________________________________________________________________\n", 201 | "activation_2 (Activation) (None, 512) 0 dense_2[0][0] \n", 202 | "____________________________________________________________________________________________________\n", 203 | "dropout_2 (Dropout) (None, 512) 0 activation_2[0][0] \n", 204 | "____________________________________________________________________________________________________\n", 205 | "dense_3 (Dense) (None, 10) 5130 dropout_2[0][0] \n", 206 | "____________________________________________________________________________________________________\n", 207 | "activation_3 (Activation) (None, 10) 0 dense_3[0][0] \n", 208 | "====================================================================================================\n", 209 | "Total params: 669706\n", 210 | "____________________________________________________________________________________________________\n" 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "model.summary()" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "## 5.训练与评估\n", 223 | "### 编译模型" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": 9, 229 | "metadata": { 230 | "collapsed": true 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "model.compile(loss='categorical_crossentropy',\n", 235 | " optimizer=RMSprop(),\n", 236 | " metrics=['accuracy'])" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": {}, 242 | "source": [ 243 | "### 模型评估" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 10, 249 | "metadata": { 250 | "collapsed": false 251 | }, 252 | "outputs": [ 253 | { 254 | "name": "stdout", 255 | "output_type": "stream", 256 | "text": [ 257 | "Test score: 0.113199677604\n", 258 | "Test accuracy: 0.9831\n" 259 | ] 260 | } 261 | ], 262 | "source": [ 263 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 264 | "print('Test score:', score[0])\n", 265 | "print('Test accuracy:', score[1])" 266 | ] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": null, 271 | "metadata": { 272 | "collapsed": true 273 | }, 274 | "outputs": [], 275 | "source": [] 276 | } 277 | ], 278 | "metadata": { 279 | "kernelspec": { 280 | "display_name": "Python 2", 281 | "language": "python", 282 | "name": "python2" 283 | }, 284 | "language_info": { 285 | "codemirror_mode": { 286 | "name": "ipython", 287 | "version": 2 288 | }, 289 | "file_extension": ".py", 290 | "mimetype": "text/x-python", 291 | "name": "python", 292 | "nbconvert_exporter": "python", 293 | "pygments_lexer": "ipython2", 294 | "version": "2.7.12" 295 | }, 296 | "ssap_exp_config": { 297 | "error_alert": "Error Occurs!", 298 | "initial": [], 299 | "max_iteration": 1000, 300 | "recv_id": "", 301 | "running": [], 302 | "summary": [], 303 | "version": "1.1.1" 304 | } 305 | }, 306 | "nbformat": 4, 307 | "nbformat_minor": 0 308 | } 309 | -------------------------------------------------------------------------------- /04.plot_acc_loss.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含两个隐藏层的神经网络,程序会保存每轮训练的acc和loss,并且绘制它们。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": true 27 | }, 28 | "outputs": [], 29 | "source": [ 30 | "from __future__ import print_function\n", 31 | "import numpy as np\n", 32 | "np.random.seed(1337) # for reproducibility" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stderr", 44 | "output_type": "stream", 45 | "text": [ 46 | "Using TensorFlow backend.\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "import keras\n", 52 | "from keras.datasets import mnist\n", 53 | "from keras.models import Sequential\n", 54 | "from keras.layers.core import Dense, Dropout, Activation\n", 55 | "from keras.optimizers import SGD, Adam, RMSprop\n", 56 | "from keras.utils import np_utils\n", 57 | "import matplotlib.pyplot as plt\n", 58 | "%matplotlib inline" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "### 写一个LossHistory类,保存loss和acc" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": { 72 | "collapsed": false 73 | }, 74 | "outputs": [], 75 | "source": [ 76 | "class LossHistory(keras.callbacks.Callback):\n", 77 | " def on_train_begin(self, logs={}):\n", 78 | " self.losses = {'batch':[], 'epoch':[]}\n", 79 | " self.accuracy = {'batch':[], 'epoch':[]}\n", 80 | " self.val_loss = {'batch':[], 'epoch':[]}\n", 81 | " self.val_acc = {'batch':[], 'epoch':[]}\n", 82 | "\n", 83 | " def on_batch_end(self, batch, logs={}):\n", 84 | " self.losses['batch'].append(logs.get('loss'))\n", 85 | " self.accuracy['batch'].append(logs.get('acc'))\n", 86 | " self.val_loss['batch'].append(logs.get('val_loss'))\n", 87 | " self.val_acc['batch'].append(logs.get('val_acc'))\n", 88 | " \n", 89 | " def on_epoch_end(self, batch, logs={}):\n", 90 | " self.losses['epoch'].append(logs.get('loss'))\n", 91 | " self.accuracy['epoch'].append(logs.get('acc'))\n", 92 | " self.val_loss['epoch'].append(logs.get('val_loss'))\n", 93 | " self.val_acc['epoch'].append(logs.get('val_acc'))\n", 94 | " \n", 95 | " def loss_plot(self, loss_type):\n", 96 | " iters = range(len(self.losses[loss_type]))\n", 97 | " plt.figure()\n", 98 | " # acc\n", 99 | " plt.plot(iters, self.accuracy[loss_type], 'r', label='train acc')\n", 100 | " # loss\n", 101 | " plt.plot(iters, self.losses[loss_type], 'g', label='train loss')\n", 102 | " if loss_type == 'epoch':\n", 103 | " # val_acc\n", 104 | " plt.plot(iters, self.val_acc[loss_type], 'b', label='val acc')\n", 105 | " # val_loss\n", 106 | " plt.plot(iters, self.val_loss[loss_type], 'k', label='val loss')\n", 107 | " plt.grid(True)\n", 108 | " plt.xlabel(loss_type)\n", 109 | " plt.ylabel('acc-loss')\n", 110 | " plt.legend(loc=\"upper right\")\n", 111 | " plt.show()" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "## 2.变量初始化" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 4, 124 | "metadata": { 125 | "collapsed": true 126 | }, 127 | "outputs": [], 128 | "source": [ 129 | "batch_size = 128 \n", 130 | "nb_classes = 10\n", 131 | "nb_epoch = 20" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "## 3.准备数据" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 5, 144 | "metadata": { 145 | "collapsed": false 146 | }, 147 | "outputs": [ 148 | { 149 | "name": "stdout", 150 | "output_type": "stream", 151 | "text": [ 152 | "60000 train samples\n", 153 | "10000 test samples\n" 154 | ] 155 | } 156 | ], 157 | "source": [ 158 | "# the data, shuffled and split between train and test sets\n", 159 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 160 | "\n", 161 | "X_train = X_train.reshape(60000, 784)\n", 162 | "X_test = X_test.reshape(10000, 784)\n", 163 | "X_train = X_train.astype('float32')\n", 164 | "X_test = X_test.astype('float32')\n", 165 | "X_train /= 255\n", 166 | "X_test /= 255\n", 167 | "print(X_train.shape[0], 'train samples')\n", 168 | "print(X_test.shape[0], 'test samples')" 169 | ] 170 | }, 171 | { 172 | "cell_type": "markdown", 173 | "metadata": {}, 174 | "source": [ 175 | "### 转换类标号" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 6, 181 | "metadata": { 182 | "collapsed": true 183 | }, 184 | "outputs": [], 185 | "source": [ 186 | "# convert class vectors to binary class matrices\n", 187 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 188 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "## 4.建立模型\n", 196 | "### 使用Sequential()" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 7, 202 | "metadata": { 203 | "collapsed": true 204 | }, 205 | "outputs": [], 206 | "source": [ 207 | "model = Sequential()\n", 208 | "model.add(Dense(512, input_shape=(784,)))\n", 209 | "model.add(Activation('relu'))\n", 210 | "model.add(Dropout(0.2))\n", 211 | "model.add(Dense(512))\n", 212 | "model.add(Activation('relu'))\n", 213 | "model.add(Dropout(0.2))\n", 214 | "model.add(Dense(10))\n", 215 | "model.add(Activation('softmax'))" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "### 打印模型" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 8, 228 | "metadata": { 229 | "collapsed": false 230 | }, 231 | "outputs": [ 232 | { 233 | "name": "stdout", 234 | "output_type": "stream", 235 | "text": [ 236 | "____________________________________________________________________________________________________\n", 237 | "Layer (type) Output Shape Param # Connected to \n", 238 | "====================================================================================================\n", 239 | "dense_1 (Dense) (None, 512) 401920 dense_input_1[0][0] \n", 240 | "____________________________________________________________________________________________________\n", 241 | "activation_1 (Activation) (None, 512) 0 dense_1[0][0] \n", 242 | "____________________________________________________________________________________________________\n", 243 | "dropout_1 (Dropout) (None, 512) 0 activation_1[0][0] \n", 244 | "____________________________________________________________________________________________________\n", 245 | "dense_2 (Dense) (None, 512) 262656 dropout_1[0][0] \n", 246 | "____________________________________________________________________________________________________\n", 247 | "activation_2 (Activation) (None, 512) 0 dense_2[0][0] \n", 248 | "____________________________________________________________________________________________________\n", 249 | "dropout_2 (Dropout) (None, 512) 0 activation_2[0][0] \n", 250 | "____________________________________________________________________________________________________\n", 251 | "dense_3 (Dense) (None, 10) 5130 dropout_2[0][0] \n", 252 | "____________________________________________________________________________________________________\n", 253 | "activation_3 (Activation) (None, 10) 0 dense_3[0][0] \n", 254 | "====================================================================================================\n", 255 | "Total params: 669706\n", 256 | "____________________________________________________________________________________________________\n" 257 | ] 258 | } 259 | ], 260 | "source": [ 261 | "model.summary()" 262 | ] 263 | }, 264 | { 265 | "cell_type": "markdown", 266 | "metadata": {}, 267 | "source": [ 268 | "## 5.训练与评估\n", 269 | "### 编译模型" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 9, 275 | "metadata": { 276 | "collapsed": true 277 | }, 278 | "outputs": [], 279 | "source": [ 280 | "model.compile(loss='categorical_crossentropy',\n", 281 | " optimizer=RMSprop(),\n", 282 | " metrics=['accuracy'])" 283 | ] 284 | }, 285 | { 286 | "cell_type": "markdown", 287 | "metadata": {}, 288 | "source": [ 289 | "### 创建一个实例history" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 10, 295 | "metadata": { 296 | "collapsed": true 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "history = LossHistory()" 301 | ] 302 | }, 303 | { 304 | "cell_type": "markdown", 305 | "metadata": {}, 306 | "source": [ 307 | "### 迭代训练(注意这个地方要加入callbacks)" 308 | ] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "execution_count": 11, 313 | "metadata": { 314 | "collapsed": false 315 | }, 316 | "outputs": [ 317 | { 318 | "name": "stdout", 319 | "output_type": "stream", 320 | "text": [ 321 | "Train on 60000 samples, validate on 10000 samples\n", 322 | "Epoch 1/20\n", 323 | "60000/60000 [==============================] - 5s - loss: 0.2448 - acc: 0.9239 - val_loss: 0.1220 - val_acc: 0.9623\n", 324 | "Epoch 2/20\n", 325 | "60000/60000 [==============================] - 5s - loss: 0.1025 - acc: 0.9689 - val_loss: 0.0775 - val_acc: 0.9760\n", 326 | "Epoch 3/20\n", 327 | "60000/60000 [==============================] - 5s - loss: 0.0752 - acc: 0.9773 - val_loss: 0.0792 - val_acc: 0.9775\n", 328 | "Epoch 4/20\n", 329 | "60000/60000 [==============================] - 5s - loss: 0.0608 - acc: 0.9819 - val_loss: 0.0758 - val_acc: 0.9790\n", 330 | "Epoch 5/20\n", 331 | "60000/60000 [==============================] - 5s - loss: 0.0500 - acc: 0.9852 - val_loss: 0.0903 - val_acc: 0.9766\n", 332 | "Epoch 6/20\n", 333 | "60000/60000 [==============================] - 5s - loss: 0.0449 - acc: 0.9863 - val_loss: 0.0780 - val_acc: 0.9798\n", 334 | "Epoch 7/20\n", 335 | "60000/60000 [==============================] - 5s - loss: 0.0398 - acc: 0.9875 - val_loss: 0.0798 - val_acc: 0.9823\n", 336 | "Epoch 8/20\n", 337 | "60000/60000 [==============================] - 5s - loss: 0.0349 - acc: 0.9899 - val_loss: 0.0794 - val_acc: 0.9834\n", 338 | "Epoch 9/20\n", 339 | "60000/60000 [==============================] - 5s - loss: 0.0301 - acc: 0.9912 - val_loss: 0.0932 - val_acc: 0.9805\n", 340 | "Epoch 10/20\n", 341 | "60000/60000 [==============================] - 5s - loss: 0.0281 - acc: 0.9919 - val_loss: 0.0819 - val_acc: 0.9842\n", 342 | "Epoch 11/20\n", 343 | "60000/60000 [==============================] - 5s - loss: 0.0276 - acc: 0.9921 - val_loss: 0.1007 - val_acc: 0.9814\n", 344 | "Epoch 12/20\n", 345 | "60000/60000 [==============================] - 5s - loss: 0.0250 - acc: 0.9931 - val_loss: 0.0978 - val_acc: 0.9824\n", 346 | "Epoch 13/20\n", 347 | "60000/60000 [==============================] - 5s - loss: 0.0228 - acc: 0.9935 - val_loss: 0.1063 - val_acc: 0.9827\n", 348 | "Epoch 14/20\n", 349 | "60000/60000 [==============================] - 5s - loss: 0.0234 - acc: 0.9939 - val_loss: 0.1014 - val_acc: 0.9815\n", 350 | "Epoch 15/20\n", 351 | "60000/60000 [==============================] - 4s - loss: 0.0188 - acc: 0.9946 - val_loss: 0.1052 - val_acc: 0.9839\n", 352 | "Epoch 16/20\n", 353 | "60000/60000 [==============================] - 4s - loss: 0.0180 - acc: 0.9946 - val_loss: 0.1027 - val_acc: 0.9833\n", 354 | "Epoch 17/20\n", 355 | "60000/60000 [==============================] - 5s - loss: 0.0213 - acc: 0.9946 - val_loss: 0.1103 - val_acc: 0.9840\n", 356 | "Epoch 18/20\n", 357 | "60000/60000 [==============================] - 5s - loss: 0.0204 - acc: 0.9949 - val_loss: 0.1168 - val_acc: 0.9818\n", 358 | "Epoch 19/20\n", 359 | "60000/60000 [==============================] - 5s - loss: 0.0185 - acc: 0.9954 - val_loss: 0.1318 - val_acc: 0.9809\n", 360 | "Epoch 20/20\n", 361 | "60000/60000 [==============================] - 5s - loss: 0.0194 - acc: 0.9954 - val_loss: 0.1173 - val_acc: 0.9831\n" 362 | ] 363 | }, 364 | { 365 | "data": { 366 | "text/plain": [ 367 | "" 368 | ] 369 | }, 370 | "execution_count": 11, 371 | "metadata": {}, 372 | "output_type": "execute_result" 373 | } 374 | ], 375 | "source": [ 376 | "model.fit(X_train, Y_train,\n", 377 | " batch_size=batch_size, nb_epoch=nb_epoch,\n", 378 | " verbose=1, \n", 379 | " validation_data=(X_test, Y_test),\n", 380 | " callbacks=[history])" 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "### 模型评估" 388 | ] 389 | }, 390 | { 391 | "cell_type": "code", 392 | "execution_count": 12, 393 | "metadata": { 394 | "collapsed": false 395 | }, 396 | "outputs": [ 397 | { 398 | "name": "stdout", 399 | "output_type": "stream", 400 | "text": [ 401 | "Test score: 0.117298825225\n", 402 | "Test accuracy: 0.9831\n" 403 | ] 404 | } 405 | ], 406 | "source": [ 407 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 408 | "print('Test score:', score[0])\n", 409 | "print('Test accuracy:', score[1])" 410 | ] 411 | }, 412 | { 413 | "cell_type": "markdown", 414 | "metadata": {}, 415 | "source": [ 416 | "### 绘制acc-loss曲线" 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "execution_count": 13, 422 | "metadata": { 423 | "collapsed": false 424 | }, 425 | "outputs": [ 426 | { 427 | "data": { 428 | "image/png": "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\nrriCoqIiBg0axAknnMDpgYNc2qm1JJKTk8P8+fOZOXMm+fn5vPjii1xwwQXB50855RQWLlzIzTff\nTG5uLlOnTmXHjh0APPfcc6SmpnLcccdRUFDA448/HlVMnZXcJ7gZY+Iq0U9w60nsBDfTadYn7ixr\nT9OdWGIwxhgTxrqSjDEdZl1JicO6kowxxsSMJYYeyvrEnWXtaboTSwzGGGPC2BiDMabDbIwhcdgY\ngzHGmJixxNBDWZ+4s6w9u6/O3Npz2rRpPP300w5HFHvJdT8GY4yJghO39vz973/vYETJwfYYeii7\nto+zrD2Tk93aMzJLDMaYbikRbu0ZSlW59957KS4uZsCAAcyZMyd4ae36+npmz55Nv379yMvL41vf\n+hb79+8HfLcHHT58OL1792b48OG88MILDrZSZJYYeijrE3eWtWfiefbZZykqKuKNN96goqKCf/u3\nfws+F7i151tvvQX4bu25detWvv76ayZNmsRll13W6npDb+355JNPcv3113P48OGjxrNw4UKeffZZ\n3n//fbZt20ZlZSU33ngjAM888wwVFRWUlZVx8OBBnnjiCTIzM6mpqeGmm27irbfeoqKigo8//pgJ\nEyZ0smWOzsYYjDExJf/e+XsbAOgvO3ZYbPNDOEWEf//3fyczMzNYN2fOnOD03XffzWOPPUZlZSW9\nevVqsb60tDTuuusuXC4XM2bMICcnh02bNjF58uQ243j++ee55ZZbGDp0KAAPPPAA48aNY+HChbjd\nbr755hs2b97MuHHjmDhxIgA1NTWkpKSwZs0aBg8eTEFBAQUFBR1qh2hYYuihrE/cWdaerevoBj2W\nmt/a8+c//zkvv/wyBw4cQESCt/aMlBiiubVnqN27dweTAsDQoUNpaGhg3759zJ49m127dnHJJZdw\n+PBhLr/8cu677z6ysrJ46aWXePjhh7n66qs588wzeeSRRxg9enQnW6Bt1pVkjOm24nlrz+YGDhxI\naWlpcL60tBS3201BQQGpqancddddrFu3jo8//pjXX3+dZ599FoDvfOc7LFmyhL179zJ69GiuvfZa\nR+OKxBJDD2V94s6y9kxM8by1Z3OzZs3i0UcfZfv27VRVVXHnnXdyySWX4HK5KCkpYe3atXi9XnJy\ncnC73bhcLr7++mtee+01ampqcLvd5OTkkJKS4nhszVliMMZ0W/G8tWfz566++mpmz57NWWedxfDh\n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\n", 429 | "text/plain": [ 430 | "" 431 | ] 432 | }, 433 | "metadata": {}, 434 | "output_type": "display_data" 435 | } 436 | ], 437 | "source": [ 438 | "history.loss_plot('epoch')" 439 | ] 440 | } 441 | ], 442 | "metadata": { 443 | "kernelspec": { 444 | "display_name": "Python 2", 445 | "language": "python", 446 | "name": "python2" 447 | }, 448 | "language_info": { 449 | "codemirror_mode": { 450 | "name": "ipython", 451 | "version": 2 452 | }, 453 | "file_extension": ".py", 454 | "mimetype": "text/x-python", 455 | "name": "python", 456 | "nbconvert_exporter": "python", 457 | "pygments_lexer": "ipython2", 458 | "version": "2.7.12" 459 | }, 460 | "ssap_exp_config": { 461 | "error_alert": "Error Occurs!", 462 | "initial": [], 463 | "max_iteration": 1000, 464 | "recv_id": "", 465 | "running": [], 466 | "summary": [], 467 | "version": "1.1.1" 468 | } 469 | }, 470 | "nbformat": 4, 471 | "nbformat_minor": 0 472 | } 473 | -------------------------------------------------------------------------------- /05.mnist_cnn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含两个卷积层、一个池化层和一个全连接层组成的神经网络。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": true 27 | }, 28 | "outputs": [], 29 | "source": [ 30 | "from __future__ import print_function\n", 31 | "import numpy as np\n", 32 | "np.random.seed(1337) # for reproducibility" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": { 39 | "collapsed": false 40 | }, 41 | "outputs": [ 42 | { 43 | "name": "stderr", 44 | "output_type": "stream", 45 | "text": [ 46 | "Using TensorFlow backend.\n" 47 | ] 48 | } 49 | ], 50 | "source": [ 51 | "from keras.datasets import mnist\n", 52 | "from keras.models import Sequential\n", 53 | "from keras.layers import Dense, Dropout, Activation, Flatten\n", 54 | "from keras.layers import Convolution2D, MaxPooling2D\n", 55 | "from keras.utils import np_utils\n", 56 | "from keras import backend as K" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "#### 如需绘制模型请加载plot" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": { 70 | "collapsed": true 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "from keras.utils.visualize_util import plot" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": {}, 80 | "source": [ 81 | "## 2.变量初始化" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 4, 87 | "metadata": { 88 | "collapsed": true 89 | }, 90 | "outputs": [], 91 | "source": [ 92 | "batch_size = 128 \n", 93 | "nb_classes = 10\n", 94 | "nb_epoch = 12\n", 95 | "\n", 96 | "# 输入数据的维度\n", 97 | "img_rows, img_cols = 28, 28\n", 98 | "# 使用的卷积滤波器的数量\n", 99 | "nb_filters = 32\n", 100 | "# 用于 max pooling 的池化面积\n", 101 | "pool_size = (2, 2)\n", 102 | "# 卷积核的尺寸\n", 103 | "kernel_size = (3, 3)" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "## 3.准备数据\n", 111 | "需要将数据还原成28*28大小的数组\n", 112 | "\n", 113 | "注意:Theano和TensorFlow的维度表示含义是不一样的。\n", 114 | "\n", 115 | "'th'模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。而TensorFlow,即'tf'模式的表达形式是(100,16,32,3),即把通道维放在了最后。这两个表达方法本质上没有什么区别。" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 5, 121 | "metadata": { 122 | "collapsed": false 123 | }, 124 | "outputs": [ 125 | { 126 | "name": "stdout", 127 | "output_type": "stream", 128 | "text": [ 129 | "X_train shape: (60000, 28, 28, 1)\n", 130 | "60000 train samples\n", 131 | "10000 test samples\n" 132 | ] 133 | } 134 | ], 135 | "source": [ 136 | "# the data, shuffled and split between train and test sets\n", 137 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 138 | "\n", 139 | "if K.image_dim_ordering() == 'th':\n", 140 | " X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)\n", 141 | " X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)\n", 142 | " input_shape = (1, img_rows, img_cols)\n", 143 | "else:\n", 144 | " X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n", 145 | " X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n", 146 | " input_shape = (img_rows, img_cols, 1)\n", 147 | "\n", 148 | "X_train = X_train.astype('float32')\n", 149 | "X_test = X_test.astype('float32')\n", 150 | "X_train /= 255\n", 151 | "X_test /= 255\n", 152 | "print('X_train shape:', X_train.shape)\n", 153 | "print(X_train.shape[0], 'train samples')\n", 154 | "print(X_test.shape[0], 'test samples')" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "### 转换类标号" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 6, 167 | "metadata": { 168 | "collapsed": true 169 | }, 170 | "outputs": [], 171 | "source": [ 172 | "# convert class vectors to binary class matrices\n", 173 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 174 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 175 | ] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "metadata": {}, 180 | "source": [ 181 | "## 4.建立模型\n", 182 | "### 使用Sequential()" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 7, 188 | "metadata": { 189 | "collapsed": false 190 | }, 191 | "outputs": [], 192 | "source": [ 193 | "model = Sequential()\n", 194 | "\n", 195 | "model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],\n", 196 | " border_mode='valid',\n", 197 | " input_shape=input_shape))\n", 198 | "model.add(Activation('relu'))\n", 199 | "model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))\n", 200 | "model.add(Activation('relu'))\n", 201 | "model.add(MaxPooling2D(pool_size=pool_size))\n", 202 | "model.add(Dropout(0.25))\n", 203 | "\n", 204 | "model.add(Flatten())\n", 205 | "model.add(Dense(128))\n", 206 | "model.add(Activation('relu'))\n", 207 | "model.add(Dropout(0.5))\n", 208 | "model.add(Dense(nb_classes))\n", 209 | "model.add(Activation('softmax'))" 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "### 打印模型" 217 | ] 218 | }, 219 | { 220 | "cell_type": "code", 221 | "execution_count": 8, 222 | "metadata": { 223 | "collapsed": false 224 | }, 225 | "outputs": [ 226 | { 227 | "name": "stdout", 228 | "output_type": "stream", 229 | "text": [ 230 | "____________________________________________________________________________________________________\n", 231 | "Layer (type) Output Shape Param # Connected to \n", 232 | "====================================================================================================\n", 233 | "convolution2d_1 (Convolution2D) (None, 26, 26, 32) 320 convolution2d_input_1[0][0] \n", 234 | "____________________________________________________________________________________________________\n", 235 | "activation_1 (Activation) (None, 26, 26, 32) 0 convolution2d_1[0][0] \n", 236 | "____________________________________________________________________________________________________\n", 237 | "convolution2d_2 (Convolution2D) (None, 24, 24, 32) 9248 activation_1[0][0] \n", 238 | "____________________________________________________________________________________________________\n", 239 | "activation_2 (Activation) (None, 24, 24, 32) 0 convolution2d_2[0][0] \n", 240 | "____________________________________________________________________________________________________\n", 241 | "maxpooling2d_1 (MaxPooling2D) (None, 12, 12, 32) 0 activation_2[0][0] \n", 242 | "____________________________________________________________________________________________________\n", 243 | "dropout_1 (Dropout) (None, 12, 12, 32) 0 maxpooling2d_1[0][0] \n", 244 | "____________________________________________________________________________________________________\n", 245 | "flatten_1 (Flatten) (None, 4608) 0 dropout_1[0][0] \n", 246 | "____________________________________________________________________________________________________\n", 247 | "dense_1 (Dense) (None, 128) 589952 flatten_1[0][0] \n", 248 | "____________________________________________________________________________________________________\n", 249 | "activation_3 (Activation) (None, 128) 0 dense_1[0][0] \n", 250 | "____________________________________________________________________________________________________\n", 251 | "dropout_2 (Dropout) (None, 128) 0 activation_3[0][0] \n", 252 | "____________________________________________________________________________________________________\n", 253 | "dense_2 (Dense) (None, 10) 1290 dropout_2[0][0] \n", 254 | "____________________________________________________________________________________________________\n", 255 | "activation_4 (Activation) (None, 10) 0 dense_2[0][0] \n", 256 | "====================================================================================================\n", 257 | "Total params: 600810\n", 258 | "____________________________________________________________________________________________________\n" 259 | ] 260 | } 261 | ], 262 | "source": [ 263 | "model.summary()" 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": {}, 269 | "source": [ 270 | "### 绘制模型结构图,并保存成图片" 271 | ] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "execution_count": 9, 276 | "metadata": { 277 | "collapsed": true 278 | }, 279 | "outputs": [], 280 | "source": [ 281 | "plot(model, to_file='model-cnn.png')" 282 | ] 283 | }, 284 | { 285 | "cell_type": "markdown", 286 | "metadata": {}, 287 | "source": [ 288 | "#### 显示绘制的图片\n", 289 | "![image](http://p1.bpimg.com/4851/4c386bd0784d9b4d.png)" 290 | ] 291 | }, 292 | { 293 | "cell_type": "markdown", 294 | "metadata": {}, 295 | "source": [ 296 | "## 5.训练与评估\n", 297 | "### 编译模型" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 10, 303 | "metadata": { 304 | "collapsed": false 305 | }, 306 | "outputs": [], 307 | "source": [ 308 | "model.compile(loss='categorical_crossentropy',\n", 309 | " optimizer='adadelta',\n", 310 | " metrics=['accuracy'])" 311 | ] 312 | }, 313 | { 314 | "cell_type": "markdown", 315 | "metadata": {}, 316 | "source": [ 317 | "### 迭代训练" 318 | ] 319 | }, 320 | { 321 | "cell_type": "code", 322 | "execution_count": 11, 323 | "metadata": { 324 | "collapsed": false 325 | }, 326 | "outputs": [ 327 | { 328 | "name": "stdout", 329 | "output_type": "stream", 330 | "text": [ 331 | "Train on 60000 samples, validate on 10000 samples\n", 332 | "Epoch 1/12\n", 333 | "60000/60000 [==============================] - 13s - loss: 0.3825 - acc: 0.8821 - val_loss: 0.0861 - val_acc: 0.9734\n", 334 | "Epoch 2/12\n", 335 | "60000/60000 [==============================] - 12s - loss: 0.1333 - acc: 0.9609 - val_loss: 0.0611 - val_acc: 0.9801\n", 336 | "Epoch 3/12\n", 337 | "60000/60000 [==============================] - 12s - loss: 0.1041 - acc: 0.9694 - val_loss: 0.0545 - val_acc: 0.9824\n", 338 | "Epoch 4/12\n", 339 | "60000/60000 [==============================] - 12s - loss: 0.0861 - acc: 0.9736 - val_loss: 0.0441 - val_acc: 0.9852\n", 340 | "Epoch 5/12\n", 341 | "60000/60000 [==============================] - 12s - loss: 0.0780 - acc: 0.9767 - val_loss: 0.0410 - val_acc: 0.9862\n", 342 | "Epoch 6/12\n", 343 | "60000/60000 [==============================] - 12s - loss: 0.0701 - acc: 0.9795 - val_loss: 0.0384 - val_acc: 0.9869\n", 344 | "Epoch 7/12\n", 345 | "60000/60000 [==============================] - 12s - loss: 0.0624 - acc: 0.9815 - val_loss: 0.0378 - val_acc: 0.9873\n", 346 | "Epoch 8/12\n", 347 | "60000/60000 [==============================] - 10s - loss: 0.0608 - acc: 0.9821 - val_loss: 0.0348 - val_acc: 0.9893\n", 348 | "Epoch 9/12\n", 349 | "60000/60000 [==============================] - 11s - loss: 0.0556 - acc: 0.9838 - val_loss: 0.0337 - val_acc: 0.9885\n", 350 | "Epoch 10/12\n", 351 | "60000/60000 [==============================] - 12s - loss: 0.0535 - acc: 0.9841 - val_loss: 0.0316 - val_acc: 0.9899\n", 352 | "Epoch 11/12\n", 353 | "60000/60000 [==============================] - 12s - loss: 0.0512 - acc: 0.9849 - val_loss: 0.0306 - val_acc: 0.9896\n", 354 | "Epoch 12/12\n", 355 | "60000/60000 [==============================] - 12s - loss: 0.0458 - acc: 0.9867 - val_loss: 0.0321 - val_acc: 0.9896\n" 356 | ] 357 | }, 358 | { 359 | "data": { 360 | "text/plain": [ 361 | "" 362 | ] 363 | }, 364 | "execution_count": 11, 365 | "metadata": {}, 366 | "output_type": "execute_result" 367 | } 368 | ], 369 | "source": [ 370 | "model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,\n", 371 | " verbose=1, validation_data=(X_test, Y_test))" 372 | ] 373 | }, 374 | { 375 | "cell_type": "markdown", 376 | "metadata": {}, 377 | "source": [ 378 | "### 模型评估" 379 | ] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "execution_count": 12, 384 | "metadata": { 385 | "collapsed": false 386 | }, 387 | "outputs": [ 388 | { 389 | "name": "stdout", 390 | "output_type": "stream", 391 | "text": [ 392 | "Test score: 0.0321088282784\n", 393 | "Test accuracy: 0.9896\n" 394 | ] 395 | } 396 | ], 397 | "source": [ 398 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 399 | "print('Test score:', score[0])\n", 400 | "print('Test accuracy:', score[1])" 401 | ] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "execution_count": null, 406 | "metadata": { 407 | "collapsed": true 408 | }, 409 | "outputs": [], 410 | "source": [] 411 | } 412 | ], 413 | "metadata": { 414 | "kernelspec": { 415 | "display_name": "Python 2", 416 | "language": "python", 417 | "name": "python2" 418 | }, 419 | "language_info": { 420 | "codemirror_mode": { 421 | "name": "ipython", 422 | "version": 2 423 | }, 424 | "file_extension": ".py", 425 | "mimetype": "text/x-python", 426 | "name": "python", 427 | "nbconvert_exporter": "python", 428 | "pygments_lexer": "ipython2", 429 | "version": "2.7.12" 430 | }, 431 | "ssap_exp_config": { 432 | "error_alert": "Error Occurs!", 433 | "initial": [], 434 | "max_iteration": 1000, 435 | "recv_id": "", 436 | "running": [], 437 | "summary": [], 438 | "version": "1.1.1" 439 | } 440 | }, 441 | "nbformat": 4, 442 | "nbformat_minor": 0 443 | } 444 | -------------------------------------------------------------------------------- /06.cifar10_cnn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:说明:这是一个使用卷积网络在CIFAR10数据集上做分类的程序,其中使用了数据增强。\n", 11 | "\n", 12 | "数据集:CIFAR10" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": false 27 | }, 28 | "outputs": [ 29 | { 30 | "name": "stderr", 31 | "output_type": "stream", 32 | "text": [ 33 | "Using TensorFlow backend.\n" 34 | ] 35 | } 36 | ], 37 | "source": [ 38 | "from __future__ import print_function\n", 39 | "from keras.datasets import cifar10\n", 40 | "from keras.preprocessing.image import ImageDataGenerator\n", 41 | "from keras.models import Sequential\n", 42 | "from keras.layers import Dense, Dropout, Activation, Flatten\n", 43 | "from keras.layers import Convolution2D, MaxPooling2D\n", 44 | "from keras.optimizers import SGD\n", 45 | "from keras.utils import np_utils" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "## 2.变量初始化" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 2, 58 | "metadata": { 59 | "collapsed": true 60 | }, 61 | "outputs": [], 62 | "source": [ 63 | "batch_size = 32\n", 64 | "nb_classes = 10\n", 65 | "nb_epoch = 20\n", 66 | "data_augmentation = True\n", 67 | "\n", 68 | "# input image dimensions\n", 69 | "img_rows, img_cols = 32, 32\n", 70 | "# the CIFAR10 images are RGB\n", 71 | "img_channels = 3" 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "## 3.准备数据" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": 3, 84 | "metadata": { 85 | "collapsed": false 86 | }, 87 | "outputs": [ 88 | { 89 | "name": "stdout", 90 | "output_type": "stream", 91 | "text": [ 92 | "X_train shape: (50000, 32, 32, 3)\n", 93 | "50000 train samples\n", 94 | "10000 test samples\n" 95 | ] 96 | } 97 | ], 98 | "source": [ 99 | "# the data, shuffled and split between train and test sets\n", 100 | "(X_train, y_train), (X_test, y_test) = cifar10.load_data()\n", 101 | "print('X_train shape:', X_train.shape)\n", 102 | "print(X_train.shape[0], 'train samples')\n", 103 | "print(X_test.shape[0], 'test samples')" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "### 转换类标号" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 4, 116 | "metadata": { 117 | "collapsed": true 118 | }, 119 | "outputs": [], 120 | "source": [ 121 | "# convert class vectors to binary class matrices\n", 122 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 123 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": {}, 129 | "source": [ 130 | "## 4.建立模型\n", 131 | "### 使用Sequential()" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 5, 137 | "metadata": { 138 | "collapsed": true 139 | }, 140 | "outputs": [], 141 | "source": [ 142 | "model = Sequential()\n", 143 | "\n", 144 | "model.add(Convolution2D(32, 3, 3, border_mode='same',\n", 145 | " input_shape=X_train.shape[1:]))\n", 146 | "model.add(Activation('relu'))\n", 147 | "model.add(Convolution2D(32, 3, 3))\n", 148 | "model.add(Activation('relu'))\n", 149 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 150 | "model.add(Dropout(0.25))\n", 151 | "\n", 152 | "model.add(Convolution2D(64, 3, 3, border_mode='same'))\n", 153 | "model.add(Activation('relu'))\n", 154 | "model.add(Convolution2D(64, 3, 3))\n", 155 | "model.add(Activation('relu'))\n", 156 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 157 | "model.add(Dropout(0.25))\n", 158 | "\n", 159 | "model.add(Flatten())\n", 160 | "model.add(Dense(512))\n", 161 | "model.add(Activation('relu'))\n", 162 | "model.add(Dropout(0.5))\n", 163 | "model.add(Dense(nb_classes))\n", 164 | "model.add(Activation('softmax'))" 165 | ] 166 | }, 167 | { 168 | "cell_type": "markdown", 169 | "metadata": {}, 170 | "source": [ 171 | "### 打印模型" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 6, 177 | "metadata": { 178 | "collapsed": false 179 | }, 180 | "outputs": [ 181 | { 182 | "name": "stdout", 183 | "output_type": "stream", 184 | "text": [ 185 | "____________________________________________________________________________________________________\n", 186 | "Layer (type) Output Shape Param # Connected to \n", 187 | "====================================================================================================\n", 188 | "convolution2d_1 (Convolution2D) (None, 32, 32, 32) 896 convolution2d_input_1[0][0] \n", 189 | "____________________________________________________________________________________________________\n", 190 | "activation_1 (Activation) (None, 32, 32, 32) 0 convolution2d_1[0][0] \n", 191 | "____________________________________________________________________________________________________\n", 192 | "convolution2d_2 (Convolution2D) (None, 30, 30, 32) 9248 activation_1[0][0] \n", 193 | "____________________________________________________________________________________________________\n", 194 | "activation_2 (Activation) (None, 30, 30, 32) 0 convolution2d_2[0][0] \n", 195 | "____________________________________________________________________________________________________\n", 196 | "maxpooling2d_1 (MaxPooling2D) (None, 15, 15, 32) 0 activation_2[0][0] \n", 197 | "____________________________________________________________________________________________________\n", 198 | "dropout_1 (Dropout) (None, 15, 15, 32) 0 maxpooling2d_1[0][0] \n", 199 | "____________________________________________________________________________________________________\n", 200 | "convolution2d_3 (Convolution2D) (None, 15, 15, 64) 18496 dropout_1[0][0] \n", 201 | "____________________________________________________________________________________________________\n", 202 | "activation_3 (Activation) (None, 15, 15, 64) 0 convolution2d_3[0][0] \n", 203 | "____________________________________________________________________________________________________\n", 204 | "convolution2d_4 (Convolution2D) (None, 13, 13, 64) 36928 activation_3[0][0] \n", 205 | "____________________________________________________________________________________________________\n", 206 | "activation_4 (Activation) (None, 13, 13, 64) 0 convolution2d_4[0][0] \n", 207 | "____________________________________________________________________________________________________\n", 208 | "maxpooling2d_2 (MaxPooling2D) (None, 6, 6, 64) 0 activation_4[0][0] \n", 209 | "____________________________________________________________________________________________________\n", 210 | "dropout_2 (Dropout) (None, 6, 6, 64) 0 maxpooling2d_2[0][0] \n", 211 | "____________________________________________________________________________________________________\n", 212 | "flatten_1 (Flatten) (None, 2304) 0 dropout_2[0][0] \n", 213 | "____________________________________________________________________________________________________\n", 214 | "dense_1 (Dense) (None, 512) 1180160 flatten_1[0][0] \n", 215 | "____________________________________________________________________________________________________\n", 216 | "activation_5 (Activation) (None, 512) 0 dense_1[0][0] \n", 217 | "____________________________________________________________________________________________________\n", 218 | "dropout_3 (Dropout) (None, 512) 0 activation_5[0][0] \n", 219 | "____________________________________________________________________________________________________\n", 220 | "dense_2 (Dense) (None, 10) 5130 dropout_3[0][0] \n", 221 | "____________________________________________________________________________________________________\n", 222 | "activation_6 (Activation) (None, 10) 0 dense_2[0][0] \n", 223 | "====================================================================================================\n", 224 | "Total params: 1250858\n", 225 | "____________________________________________________________________________________________________\n" 226 | ] 227 | } 228 | ], 229 | "source": [ 230 | "model.summary()" 231 | ] 232 | }, 233 | { 234 | "cell_type": "markdown", 235 | "metadata": {}, 236 | "source": [ 237 | "## 5.训练与评估\n", 238 | "### 编译模型" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 7, 244 | "metadata": { 245 | "collapsed": true 246 | }, 247 | "outputs": [], 248 | "source": [ 249 | "# let's train the model using SGD + momentum (how original).\n", 250 | "sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)\n", 251 | "model.compile(loss='categorical_crossentropy',\n", 252 | " optimizer=sgd,\n", 253 | " metrics=['accuracy'])" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "### 数据压缩为0~1之间" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 8, 266 | "metadata": { 267 | "collapsed": true 268 | }, 269 | "outputs": [], 270 | "source": [ 271 | "X_train = X_train.astype('float32')\n", 272 | "X_test = X_test.astype('float32')\n", 273 | "X_train /= 255\n", 274 | "X_test /= 255\n" 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "### 数据增强\n", 282 | "数据增强使用的ImageDataGenerator这个函数。" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 9, 288 | "metadata": { 289 | "collapsed": false 290 | }, 291 | "outputs": [ 292 | { 293 | "name": "stdout", 294 | "output_type": "stream", 295 | "text": [ 296 | "Using real-time data augmentation.\n", 297 | "Epoch 1/20\n", 298 | "50000/50000 [==============================] - 37s - loss: 2.3037 - acc: 0.1010 - val_loss: 2.3034 - val_acc: 0.1000\n", 299 | "Epoch 2/20\n", 300 | "50000/50000 [==============================] - 37s - loss: 2.3035 - acc: 0.0991 - val_loss: 2.3033 - val_acc: 0.1000\n", 301 | "Epoch 3/20\n", 302 | "50000/50000 [==============================] - 38s - loss: 2.3034 - acc: 0.0977 - val_loss: 2.3030 - val_acc: 0.1000\n", 303 | "Epoch 4/20\n", 304 | "50000/50000 [==============================] - 36s - loss: 2.3035 - acc: 0.0975 - val_loss: 2.3036 - val_acc: 0.1000\n", 305 | "Epoch 5/20\n", 306 | "50000/50000 [==============================] - 37s - loss: 2.3035 - acc: 0.0986 - val_loss: 2.3028 - val_acc: 0.1000\n", 307 | "Epoch 6/20\n", 308 | "50000/50000 [==============================] - 36s - loss: 2.3034 - acc: 0.0991 - val_loss: 2.3031 - val_acc: 0.1000\n", 309 | "Epoch 7/20\n", 310 | "50000/50000 [==============================] - 37s - loss: 2.3033 - acc: 0.1004 - val_loss: 2.3030 - val_acc: 0.1000\n", 311 | "Epoch 8/20\n", 312 | "50000/50000 [==============================] - 38s - loss: 2.3035 - acc: 0.0970 - val_loss: 2.3029 - val_acc: 0.1000\n", 313 | "Epoch 9/20\n", 314 | "50000/50000 [==============================] - 36s - loss: 2.3034 - acc: 0.0980 - val_loss: 2.3034 - val_acc: 0.1000\n", 315 | "Epoch 10/20\n", 316 | "50000/50000 [==============================] - 37s - loss: 2.3033 - acc: 0.0989 - val_loss: 2.3032 - val_acc: 0.1000\n", 317 | "Epoch 11/20\n", 318 | "50000/50000 [==============================] - 37s - loss: 2.3034 - acc: 0.0983 - val_loss: 2.3028 - val_acc: 0.1000\n", 319 | "Epoch 12/20\n", 320 | "50000/50000 [==============================] - 36s - loss: 2.3033 - acc: 0.0997 - val_loss: 2.3029 - val_acc: 0.1000\n", 321 | "Epoch 13/20\n", 322 | "50000/50000 [==============================] - 37s - loss: 2.3033 - acc: 0.1009 - val_loss: 2.3032 - val_acc: 0.1000\n", 323 | "Epoch 14/20\n", 324 | "50000/50000 [==============================] - 37s - loss: 2.3035 - acc: 0.0995 - val_loss: 2.3029 - val_acc: 0.1000\n", 325 | "Epoch 15/20\n", 326 | "50000/50000 [==============================] - 36s - loss: 2.3034 - acc: 0.0955 - val_loss: 2.3029 - val_acc: 0.1000\n", 327 | "Epoch 16/20\n", 328 | "50000/50000 [==============================] - 38s - loss: 2.3034 - acc: 0.0995 - val_loss: 2.3028 - val_acc: 0.1000\n", 329 | "Epoch 17/20\n", 330 | "50000/50000 [==============================] - 36s - loss: 2.3035 - acc: 0.0955 - val_loss: 2.3030 - val_acc: 0.1000\n", 331 | "Epoch 18/20\n", 332 | "50000/50000 [==============================] - 38s - loss: 2.3033 - acc: 0.0977 - val_loss: 2.3039 - val_acc: 0.1000\n", 333 | "Epoch 19/20\n", 334 | "50000/50000 [==============================] - 38s - loss: 2.3035 - acc: 0.0989 - val_loss: 2.3031 - val_acc: 0.1000\n", 335 | "Epoch 20/20\n", 336 | "50000/50000 [==============================] - 36s - loss: 2.3033 - acc: 0.0979 - val_loss: 2.3033 - val_acc: 0.1000\n" 337 | ] 338 | } 339 | ], 340 | "source": [ 341 | "if not data_augmentation:\n", 342 | " print('Not using data augmentation.')\n", 343 | " model.fit(X_train, Y_train,\n", 344 | " batch_size=batch_size,\n", 345 | " nb_epoch=nb_epoch,\n", 346 | " validation_data=(X_test, Y_test),\n", 347 | " shuffle=True)\n", 348 | "else:\n", 349 | " print('Using real-time data augmentation.')\n", 350 | "\n", 351 | " # 这将做预处理和实时数据增加\n", 352 | " datagen = ImageDataGenerator(\n", 353 | " featurewise_center=False, # 在数据集上将输入平均值设置为0\n", 354 | " samplewise_center=False, # 将每个样本均值设置为0\n", 355 | " featurewise_std_normalization=False, # 将输入除以数据集的std\n", 356 | " samplewise_std_normalization=False, # 将每个输入除以其std\n", 357 | " zca_whitening=False, # 应用ZCA白化\n", 358 | " rotation_range=0, # 在一个范围下随机旋转图像(degrees, 0 to 180)\n", 359 | " width_shift_range=0.1, # 水平随机移位图像(总宽度的分数)\n", 360 | " height_shift_range=0.1, # 随机地垂直移动图像(总高度的分数)\n", 361 | " horizontal_flip=True, # 随机翻转图像\n", 362 | " vertical_flip=False) # 随机翻转图像\n", 363 | "\n", 364 | " # 计算特征方向归一化所需的数量\n", 365 | " # (std, mean, and principal components if ZCA whitening is applied)\n", 366 | " datagen.fit(X_train)\n", 367 | "\n", 368 | " # fit the model on the batches generated by datagen.flow()\n", 369 | " model.fit_generator(datagen.flow(X_train, Y_train,\n", 370 | " batch_size=batch_size),\n", 371 | " samples_per_epoch=X_train.shape[0],\n", 372 | " nb_epoch=nb_epoch,\n", 373 | " validation_data=(X_test, Y_test))" 374 | ] 375 | } 376 | ], 377 | "metadata": { 378 | "kernelspec": { 379 | "display_name": "Python 2", 380 | "language": "python", 381 | "name": "python2" 382 | }, 383 | "language_info": { 384 | "codemirror_mode": { 385 | "name": "ipython", 386 | "version": 2 387 | }, 388 | "file_extension": ".py", 389 | "mimetype": "text/x-python", 390 | "name": "python", 391 | "nbconvert_exporter": "python", 392 | "pygments_lexer": "ipython2", 393 | "version": "2.7.12" 394 | }, 395 | "ssap_exp_config": { 396 | "error_alert": "Error Occurs!", 397 | "initial": [], 398 | "max_iteration": 1000, 399 | "recv_id": "", 400 | "running": [], 401 | "summary": [], 402 | "version": "1.1.1" 403 | } 404 | }, 405 | "nbformat": 4, 406 | "nbformat_minor": 0 407 | } 408 | -------------------------------------------------------------------------------- /07.mnist_lstm.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月16日\n", 9 | "\n", 10 | "说明:该程序是一个包含LSTM的神经网络。\n", 11 | "\n", 12 | "数据集:MNIST" 13 | ] 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "metadata": {}, 18 | "source": [ 19 | "## 1.加载keras模块" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": false 27 | }, 28 | "outputs": [ 29 | { 30 | "name": "stderr", 31 | "output_type": "stream", 32 | "text": [ 33 | "Using TensorFlow backend.\n" 34 | ] 35 | } 36 | ], 37 | "source": [ 38 | "from keras.models import Sequential\n", 39 | "from keras.layers import LSTM, Dense\n", 40 | "from keras.datasets import mnist\n", 41 | "from keras.utils import np_utils\n", 42 | "from keras import initializations\n", 43 | "\n", 44 | "def init_weights(shape, name=None):\n", 45 | " return initializations.normal(shape, scale=0.01, name=name)" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "#### 如需绘制模型请加载plot" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 2, 58 | "metadata": { 59 | "collapsed": true 60 | }, 61 | "outputs": [], 62 | "source": [ 63 | "from keras.utils.visualize_util import plot" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "## 2.变量初始化" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 3, 76 | "metadata": { 77 | "collapsed": true 78 | }, 79 | "outputs": [], 80 | "source": [ 81 | "# Hyper parameters\n", 82 | "batch_size = 128\n", 83 | "nb_epoch = 10\n", 84 | "\n", 85 | "# Parameters for MNIST dataset\n", 86 | "img_rows, img_cols = 28, 28\n", 87 | "nb_classes = 10\n", 88 | "\n", 89 | "# Parameters for LSTM network\n", 90 | "nb_lstm_outputs = 30\n", 91 | "nb_time_steps = img_rows\n", 92 | "dim_input_vector = img_cols" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "metadata": {}, 98 | "source": [ 99 | "## 3.准备数据" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 4, 105 | "metadata": { 106 | "collapsed": false 107 | }, 108 | "outputs": [ 109 | { 110 | "name": "stdout", 111 | "output_type": "stream", 112 | "text": [ 113 | "('X_train original shape:', (60000, 28, 28))\n", 114 | "('X_train shape:', (60000, 28, 28))\n", 115 | "(60000, 'train samples')\n", 116 | "(10000, 'test samples')\n" 117 | ] 118 | } 119 | ], 120 | "source": [ 121 | "# Load MNIST dataset\n", 122 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 123 | "print('X_train original shape:', X_train.shape)\n", 124 | "input_shape = (nb_time_steps, dim_input_vector)\n", 125 | "\n", 126 | "X_train = X_train.astype('float32') / 255.\n", 127 | "X_test = X_test.astype('float32') / 255.\n", 128 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 129 | "Y_test = np_utils.to_categorical(y_test, nb_classes)\n", 130 | "\n", 131 | "print('X_train shape:', X_train.shape)\n", 132 | "print(X_train.shape[0], 'train samples')\n", 133 | "print(X_test.shape[0], 'test samples')" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "## 4.建立模型\n", 141 | "### 使用Sequential()" 142 | ] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "execution_count": 5, 147 | "metadata": { 148 | "collapsed": true 149 | }, 150 | "outputs": [], 151 | "source": [ 152 | "# Build LSTM network\n", 153 | "model = Sequential()\n", 154 | "model.add(LSTM(nb_lstm_outputs, input_shape=input_shape))\n", 155 | "model.add(Dense(nb_classes, activation='softmax', init=init_weights))" 156 | ] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": {}, 161 | "source": [ 162 | "### 打印模型" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 6, 168 | "metadata": { 169 | "collapsed": false 170 | }, 171 | "outputs": [ 172 | { 173 | "name": "stdout", 174 | "output_type": "stream", 175 | "text": [ 176 | "____________________________________________________________________________________________________\n", 177 | "Layer (type) Output Shape Param # Connected to \n", 178 | "====================================================================================================\n", 179 | "lstm_1 (LSTM) (None, 30) 7080 lstm_input_1[0][0] \n", 180 | "____________________________________________________________________________________________________\n", 181 | "dense_1 (Dense) (None, 10) 310 lstm_1[0][0] \n", 182 | "====================================================================================================\n", 183 | "Total params: 7390\n", 184 | "____________________________________________________________________________________________________\n" 185 | ] 186 | } 187 | ], 188 | "source": [ 189 | "model.summary()" 190 | ] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": {}, 195 | "source": [ 196 | "### 绘制模型结构图,并保存成图片" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 7, 202 | "metadata": { 203 | "collapsed": true 204 | }, 205 | "outputs": [], 206 | "source": [ 207 | "plot(model, to_file='lstm_model.png')" 208 | ] 209 | }, 210 | { 211 | "cell_type": "markdown", 212 | "metadata": {}, 213 | "source": [ 214 | "#### 显示绘制的图片\n", 215 | "![image](http://p1.bqimg.com/4851/08854414148a36b0.png)" 216 | ] 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "metadata": {}, 221 | "source": [ 222 | "## 5.训练与评估\n", 223 | "### 编译模型" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": 8, 229 | "metadata": { 230 | "collapsed": true 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])" 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "### 迭代训练" 242 | ] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": 9, 247 | "metadata": { 248 | "collapsed": false 249 | }, 250 | "outputs": [ 251 | { 252 | "name": "stdout", 253 | "output_type": "stream", 254 | "text": [ 255 | "Epoch 1/10\n", 256 | "60000/60000 [==============================] - 28s - loss: 1.3082 - acc: 0.6124 \n", 257 | "Epoch 2/10\n", 258 | "60000/60000 [==============================] - 28s - loss: 0.5380 - acc: 0.8467 \n", 259 | "Epoch 3/10\n", 260 | "60000/60000 [==============================] - 28s - loss: 0.3363 - acc: 0.9060 \n", 261 | "Epoch 4/10\n", 262 | "60000/60000 [==============================] - 28s - loss: 0.2553 - acc: 0.9292 \n", 263 | "Epoch 5/10\n", 264 | "60000/60000 [==============================] - 28s - loss: 0.2113 - acc: 0.9408 \n", 265 | "Epoch 6/10\n", 266 | "60000/60000 [==============================] - 28s - loss: 0.1811 - acc: 0.9488 \n", 267 | "Epoch 7/10\n", 268 | "60000/60000 [==============================] - 28s - loss: 0.1578 - acc: 0.9548 \n", 269 | "Epoch 8/10\n", 270 | "60000/60000 [==============================] - 28s - loss: 0.1407 - acc: 0.9597 \n", 271 | "Epoch 9/10\n", 272 | "60000/60000 [==============================] - 28s - loss: 0.1284 - acc: 0.9633 \n", 273 | "Epoch 10/10\n", 274 | "60000/60000 [==============================] - 28s - loss: 0.1188 - acc: 0.9655 \n" 275 | ] 276 | } 277 | ], 278 | "source": [ 279 | "history = model.fit(X_train, Y_train, nb_epoch=nb_epoch, batch_size=batch_size, shuffle=True, verbose=1)" 280 | ] 281 | }, 282 | { 283 | "cell_type": "markdown", 284 | "metadata": {}, 285 | "source": [ 286 | "### 模型评估" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 10, 292 | "metadata": { 293 | "collapsed": false 294 | }, 295 | "outputs": [ 296 | { 297 | "name": "stdout", 298 | "output_type": "stream", 299 | "text": [ 300 | "10000/10000 [==============================] - 5s \n", 301 | "('Test score:', 0.11906883909329773)\n", 302 | "('Test accuracy:', 0.96530000000000005)\n" 303 | ] 304 | } 305 | ], 306 | "source": [ 307 | "score = model.evaluate(X_test, Y_test, verbose=1)\n", 308 | "print('Test score:', score[0])\n", 309 | "print('Test accuracy:', score[1])" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": { 316 | "collapsed": true 317 | }, 318 | "outputs": [], 319 | "source": [] 320 | } 321 | ], 322 | "metadata": { 323 | "kernelspec": { 324 | "display_name": "Python 2", 325 | "language": "python", 326 | "name": "python2" 327 | }, 328 | "language_info": { 329 | "codemirror_mode": { 330 | "name": "ipython", 331 | "version": 2 332 | }, 333 | "file_extension": ".py", 334 | "mimetype": "text/x-python", 335 | "name": "python", 336 | "nbconvert_exporter": "python", 337 | "pygments_lexer": "ipython2", 338 | "version": "2.7.12" 339 | }, 340 | "ssap_exp_config": { 341 | "error_alert": "Error Occurs!", 342 | "initial": [], 343 | "max_iteration": 1000, 344 | "recv_id": "", 345 | "running": [], 346 | "summary": [], 347 | "version": "1.1.1" 348 | } 349 | }, 350 | "nbformat": 4, 351 | "nbformat_minor": 0 352 | } 353 | -------------------------------------------------------------------------------- /11.mnist_transfer_cnn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "时间:2016年11月17日\n", 9 | "\n", 10 | "名称:迁移学习例程\n", 11 | "\n", 12 | "说明:该程序演示将一个预训练好的模型在新数据集上重新fine-tuning的过程。我们冻结卷积层,只调整全连接层。\n", 13 | "1. 在MNIST数据集上使用前五个数字[0...4]训练一个卷积网络。\n", 14 | "2. 在后五个数字[5...9]用卷积网络做分类,冻结卷积层并且微调全连接层\n", 15 | "\n", 16 | "数据集:MNIST" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "## 1.加载keras模块" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 1, 29 | "metadata": { 30 | "collapsed": false 31 | }, 32 | "outputs": [ 33 | { 34 | "name": "stderr", 35 | "output_type": "stream", 36 | "text": [ 37 | "Using TensorFlow backend.\n" 38 | ] 39 | } 40 | ], 41 | "source": [ 42 | "from __future__ import print_function\n", 43 | "import numpy as np\n", 44 | "import datetime\n", 45 | "\n", 46 | "np.random.seed(1337) # for reproducibility\n", 47 | "\n", 48 | "from keras.datasets import mnist\n", 49 | "from keras.models import Sequential\n", 50 | "from keras.layers import Dense, Dropout, Activation, Flatten\n", 51 | "from keras.layers import Convolution2D, MaxPooling2D\n", 52 | "from keras.utils import np_utils\n", 53 | "from keras import backend as K" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "## 2.变量初始化" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 2, 66 | "metadata": { 67 | "collapsed": true 68 | }, 69 | "outputs": [], 70 | "source": [ 71 | "now = datetime.datetime.now\n", 72 | "\n", 73 | "batch_size = 128\n", 74 | "nb_classes = 5\n", 75 | "nb_epoch = 5\n", 76 | "\n", 77 | "# 输入图像的维度\n", 78 | "img_rows, img_cols = 28, 28\n", 79 | "# 使用卷积滤波器的数量\n", 80 | "nb_filters = 32\n", 81 | "# 用于max pooling的pooling面积的大小\n", 82 | "pool_size = 2\n", 83 | "# 卷积核的尺度\n", 84 | "kernel_size = 3\n", 85 | "\n", 86 | "if K.image_dim_ordering() == 'th':\n", 87 | " input_shape = (1, img_rows, img_cols)\n", 88 | "else:\n", 89 | " input_shape = (img_rows, img_cols, 1)\n" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "## 3.准备数据\n", 97 | "将MNIST划分为两个数据集,分别用于预训练模型和迁移学习模型。" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 3, 103 | "metadata": { 104 | "collapsed": false 105 | }, 106 | "outputs": [], 107 | "source": [ 108 | "# 数据,在训练和测试数据集上混洗和拆分\n", 109 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 110 | "\n", 111 | "# create two datasets one with digits below 5 and one with 5 and above\n", 112 | "X_train_lt5 = X_train[y_train < 5]\n", 113 | "y_train_lt5 = y_train[y_train < 5]\n", 114 | "X_test_lt5 = X_test[y_test < 5]\n", 115 | "y_test_lt5 = y_test[y_test < 5]\n", 116 | "\n", 117 | "X_train_gte5 = X_train[y_train >= 5]\n", 118 | "y_train_gte5 = y_train[y_train >= 5] - 5 # make classes start at 0 for\n", 119 | "X_test_gte5 = X_test[y_test >= 5] # np_utils.to_categorical\n", 120 | "y_test_gte5 = y_test[y_test >= 5] - 5" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "### 模型的训练函数" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 4, 133 | "metadata": { 134 | "collapsed": true 135 | }, 136 | "outputs": [], 137 | "source": [ 138 | "def train_model(model, train, test, nb_classes):\n", 139 | " X_train = train[0].reshape((train[0].shape[0],) + input_shape)\n", 140 | " X_test = test[0].reshape((test[0].shape[0],) + input_shape)\n", 141 | " X_train = X_train.astype('float32')\n", 142 | " X_test = X_test.astype('float32')\n", 143 | " X_train /= 255\n", 144 | " X_test /= 255\n", 145 | " print('X_train shape:', X_train.shape)\n", 146 | " print(X_train.shape[0], 'train samples')\n", 147 | " print(X_test.shape[0], 'test samples')\n", 148 | "\n", 149 | " # convert class vectors to binary class matrices\n", 150 | " Y_train = np_utils.to_categorical(train[1], nb_classes)\n", 151 | " Y_test = np_utils.to_categorical(test[1], nb_classes)\n", 152 | "\n", 153 | " model.compile(loss='categorical_crossentropy',\n", 154 | " optimizer='adadelta',\n", 155 | " metrics=['accuracy'])\n", 156 | "\n", 157 | " t = now()\n", 158 | " model.fit(X_train, Y_train,\n", 159 | " batch_size=batch_size, nb_epoch=nb_epoch,\n", 160 | " verbose=1,\n", 161 | " validation_data=(X_test, Y_test))\n", 162 | " print('Training time: %s' % (now() - t))\n", 163 | " score = model.evaluate(X_test, Y_test, verbose=0)\n", 164 | " print('Test score:', score[0])\n", 165 | " print('Test accuracy:', score[1])" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "metadata": {}, 171 | "source": [ 172 | "## 4.建立模型\n", 173 | "### 构建卷积层(特征层)和全连接层(分类层)" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 5, 179 | "metadata": { 180 | "collapsed": true 181 | }, 182 | "outputs": [], 183 | "source": [ 184 | "# define two groups of layers: feature (convolutions) and classification (dense)\n", 185 | "feature_layers = [\n", 186 | " Convolution2D(nb_filters, kernel_size, kernel_size,\n", 187 | " border_mode='valid',\n", 188 | " input_shape=input_shape),\n", 189 | " Activation('relu'),\n", 190 | " Convolution2D(nb_filters, kernel_size, kernel_size),\n", 191 | " Activation('relu'),\n", 192 | " MaxPooling2D(pool_size=(pool_size, pool_size)),\n", 193 | " Dropout(0.25),\n", 194 | " Flatten(),\n", 195 | "]\n", 196 | "classification_layers = [\n", 197 | " Dense(128),\n", 198 | " Activation('relu'),\n", 199 | " Dropout(0.5),\n", 200 | " Dense(nb_classes),\n", 201 | " Activation('softmax')\n", 202 | "]\n", 203 | "\n", 204 | "# create complete model\n", 205 | "model = Sequential(feature_layers + classification_layers)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "## 5.训练预训练模型用于5个数字[0...4]的分类任务" 213 | ] 214 | }, 215 | { 216 | "cell_type": "code", 217 | "execution_count": 6, 218 | "metadata": { 219 | "collapsed": false 220 | }, 221 | "outputs": [ 222 | { 223 | "name": "stdout", 224 | "output_type": "stream", 225 | "text": [ 226 | "X_train shape: (30596, 28, 28, 1)\n", 227 | "30596 train samples\n", 228 | "5139 test samples\n", 229 | "Train on 30596 samples, validate on 5139 samples\n", 230 | "Epoch 1/5\n", 231 | "30596/30596 [==============================] - 5s - loss: 0.2148 - acc: 0.9349 - val_loss: 0.0398 - val_acc: 0.9868\n", 232 | "Epoch 2/5\n", 233 | "30596/30596 [==============================] - 4s - loss: 0.0631 - acc: 0.9810 - val_loss: 0.0234 - val_acc: 0.9924\n", 234 | "Epoch 3/5\n", 235 | "30596/30596 [==============================] - 4s - loss: 0.0457 - acc: 0.9869 - val_loss: 0.0192 - val_acc: 0.9926\n", 236 | "Epoch 4/5\n", 237 | "30596/30596 [==============================] - 4s - loss: 0.0367 - acc: 0.9885 - val_loss: 0.0150 - val_acc: 0.9946\n", 238 | "Epoch 5/5\n", 239 | "30596/30596 [==============================] - 4s - loss: 0.0304 - acc: 0.9911 - val_loss: 0.0157 - val_acc: 0.9947\n", 240 | "Training time: 0:00:24.128250\n", 241 | "Test score: 0.0156876081334\n", 242 | "Test accuracy: 0.994746059545\n" 243 | ] 244 | } 245 | ], 246 | "source": [ 247 | "# train model for 5-digit classification [0..4]\n", 248 | "train_model(model,\n", 249 | " (X_train_lt5, y_train_lt5),\n", 250 | " (X_test_lt5, y_test_lt5), nb_classes)" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": {}, 256 | "source": [ 257 | "## 6.冻结特征层" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 7, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "# freeze feature layers and rebuild model\n", 269 | "for l in feature_layers:\n", 270 | " l.trainable = False" 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "metadata": {}, 276 | "source": [ 277 | "## 7.fine-tuning分类层" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 8, 283 | "metadata": { 284 | "collapsed": false 285 | }, 286 | "outputs": [ 287 | { 288 | "name": "stdout", 289 | "output_type": "stream", 290 | "text": [ 291 | "X_train shape: (29404, 28, 28, 1)\n", 292 | "29404 train samples\n", 293 | "4861 test samples\n", 294 | "Train on 29404 samples, validate on 4861 samples\n", 295 | "Epoch 1/5\n", 296 | "29404/29404 [==============================] - 3s - loss: 0.3601 - acc: 0.8942 - val_loss: 0.0906 - val_acc: 0.9704\n", 297 | "Epoch 2/5\n", 298 | "29404/29404 [==============================] - 2s - loss: 0.1231 - acc: 0.9625 - val_loss: 0.0584 - val_acc: 0.9809\n", 299 | "Epoch 3/5\n", 300 | "29404/29404 [==============================] - 3s - loss: 0.0917 - acc: 0.9732 - val_loss: 0.0480 - val_acc: 0.9837\n", 301 | "Epoch 4/5\n", 302 | "29404/29404 [==============================] - 3s - loss: 0.0753 - acc: 0.9777 - val_loss: 0.0387 - val_acc: 0.9856\n", 303 | "Epoch 5/5\n", 304 | "29404/29404 [==============================] - 3s - loss: 0.0654 - acc: 0.9805 - val_loss: 0.0347 - val_acc: 0.9875\n", 305 | "Training time: 0:00:15.838667\n", 306 | "Test score: 0.0347462616509\n", 307 | "Test accuracy: 0.98745114163\n" 308 | ] 309 | } 310 | ], 311 | "source": [ 312 | "# transfer: train dense layers for new classification task [5..9]\n", 313 | "train_model(model,\n", 314 | " (X_train_gte5, y_train_gte5),\n", 315 | " (X_test_gte5, y_test_gte5), nb_classes)" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": null, 321 | "metadata": { 322 | "collapsed": true 323 | }, 324 | "outputs": [], 325 | "source": [] 326 | } 327 | ], 328 | "metadata": { 329 | "kernelspec": { 330 | "display_name": "Python 2", 331 | "language": "python", 332 | "name": "python2" 333 | }, 334 | "language_info": { 335 | "codemirror_mode": { 336 | "name": "ipython", 337 | "version": 2 338 | }, 339 | "file_extension": ".py", 340 | "mimetype": "text/x-python", 341 | "name": "python", 342 | "nbconvert_exporter": "python", 343 | "pygments_lexer": "ipython2", 344 | "version": "2.7.12" 345 | }, 346 | "ssap_exp_config": { 347 | "error_alert": "Error Occurs!", 348 | "initial": [], 349 | "max_iteration": 1000, 350 | "recv_id": "", 351 | "running": [], 352 | "summary": [], 353 | "version": "1.1.1" 354 | } 355 | }, 356 | "nbformat": 4, 357 | "nbformat_minor": 0 358 | } 359 | -------------------------------------------------------------------------------- /12.mnist_sklearn_wrapper.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "名称:使用sklearn wrapper做参数搜索\n", 9 | "\n", 10 | "时间:2016年11月17日\n", 11 | "\n", 12 | "说明:建造一个简单的卷积模型,通过使用sklearn的GridSearchCV去发现最好的模型。\n", 13 | "\n", 14 | "数据集:MNIST" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## 1.加载keras模块" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": { 28 | "collapsed": false 29 | }, 30 | "outputs": [ 31 | { 32 | "name": "stderr", 33 | "output_type": "stream", 34 | "text": [ 35 | "Using TensorFlow backend.\n", 36 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/cross_validation.py:44: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 37 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n", 38 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/grid_search.py:43: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. This module will be removed in 0.20.\n", 39 | " DeprecationWarning)\n" 40 | ] 41 | } 42 | ], 43 | "source": [ 44 | "from __future__ import print_function\n", 45 | "import numpy as np\n", 46 | "np.random.seed(1337) # for reproducibility\n", 47 | "\n", 48 | "from keras.datasets import mnist\n", 49 | "from keras.models import Sequential\n", 50 | "from keras.layers import Dense, Dropout, Activation, Flatten\n", 51 | "from keras.layers import Convolution2D, MaxPooling2D\n", 52 | "from keras.utils import np_utils\n", 53 | "from keras.wrappers.scikit_learn import KerasClassifier\n", 54 | "from sklearn.grid_search import GridSearchCV" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "## 2.变量初始化" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 2, 67 | "metadata": { 68 | "collapsed": true 69 | }, 70 | "outputs": [], 71 | "source": [ 72 | "nb_classes = 10\n", 73 | "\n", 74 | "# input image dimensions\n", 75 | "img_rows, img_cols = 28, 28" 76 | ] 77 | }, 78 | { 79 | "cell_type": "markdown", 80 | "metadata": {}, 81 | "source": [ 82 | "## 3.准备数据" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 3, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# load training data and do basic data normalization\n", 94 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 95 | "X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n", 96 | "X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n", 97 | "X_train = X_train.astype('float32')\n", 98 | "X_test = X_test.astype('float32')\n", 99 | "X_train /= 255\n", 100 | "X_test /= 255" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "### 转换类标号" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 4, 113 | "metadata": { 114 | "collapsed": true 115 | }, 116 | "outputs": [], 117 | "source": [ 118 | "# convert class vectors to binary class matrices\n", 119 | "y_train = np_utils.to_categorical(y_train, nb_classes)\n", 120 | "y_test = np_utils.to_categorical(y_test, nb_classes)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "## 4.建立模型\n", 128 | "### 使用Sequential()\n", 129 | "构造一个有两个卷积层和若干个全连接层组成的模型,这里全连接的层数是由参数所决定的。\n", 130 | "\n", 131 | "dense_layer_sizes:层尺寸的列表。这个列表中对于每个层都有一组数字。\n", 132 | "\n", 133 | "nb_filters:每个卷积层中滤波器的个数\n", 134 | "\n", 135 | "nb_conv:卷积核的尺寸\n", 136 | "\n", 137 | "nb_pool:用于max pooling的池化面积" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 5, 143 | "metadata": { 144 | "collapsed": true 145 | }, 146 | "outputs": [], 147 | "source": [ 148 | "def make_model(dense_layer_sizes, nb_filters, nb_conv, nb_pool):\n", 149 | " '''Creates model comprised of 2 convolutional layers followed by dense layers\n", 150 | " dense_layer_sizes: List of layer sizes. This list has one number for each layer\n", 151 | " nb_filters: Number of convolutional filters in each convolutional layer\n", 152 | " nb_conv: Convolutional kernel size\n", 153 | " nb_pool: Size of pooling area for max pooling\n", 154 | " '''\n", 155 | "\n", 156 | " model = Sequential()\n", 157 | "\n", 158 | " model.add(Convolution2D(nb_filters, nb_conv, nb_conv,\n", 159 | " border_mode='valid',\n", 160 | " input_shape=(img_rows, img_cols, 1)))\n", 161 | " model.add(Activation('relu'))\n", 162 | " model.add(Convolution2D(nb_filters, nb_conv, nb_conv))\n", 163 | " model.add(Activation('relu'))\n", 164 | " model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n", 165 | " model.add(Dropout(0.25))\n", 166 | "\n", 167 | " model.add(Flatten())\n", 168 | " for layer_size in dense_layer_sizes:\n", 169 | " model.add(Dense(layer_size))\n", 170 | " model.add(Activation('relu'))\n", 171 | " model.add(Dropout(0.5))\n", 172 | " model.add(Dense(nb_classes))\n", 173 | " model.add(Activation('softmax'))\n", 174 | "\n", 175 | " model.compile(loss='categorical_crossentropy',\n", 176 | " optimizer='adadelta',\n", 177 | " metrics=['accuracy'])\n", 178 | "\n", 179 | " return model" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "## 5.sklearn接口\n", 187 | "\n", 188 | "KerasClassifier()实现了sklearn的分类器接口\n", 189 | "\n", 190 | "`keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params)`\n", 191 | "\n", 192 | "build_fn:可调用的函数或类对象\n", 193 | "\n", 194 | "sk_params:模型参数和训练参数" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 6, 200 | "metadata": { 201 | "collapsed": true 202 | }, 203 | "outputs": [], 204 | "source": [ 205 | "dense_size_candidates = [[32], [64], [32, 32], [64, 64]]\n", 206 | "my_classifier = KerasClassifier(make_model, batch_size=32)" 207 | ] 208 | }, 209 | { 210 | "cell_type": "markdown", 211 | "metadata": {}, 212 | "source": [ 213 | "### sklearn中的GridSearchCV函数\n", 214 | "说明:对估计器的指定参数值进行穷举搜索。\n" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 7, 220 | "metadata": { 221 | "collapsed": true 222 | }, 223 | "outputs": [], 224 | "source": [ 225 | "validator = GridSearchCV(my_classifier,\n", 226 | " param_grid={'dense_layer_sizes': dense_size_candidates,\n", 227 | " # nb_epoch可用于调整,即使不是模型构建函数的参数\n", 228 | " 'nb_epoch': [3, 6],\n", 229 | " 'nb_filters': [8],\n", 230 | " 'nb_conv': [3],\n", 231 | " 'nb_pool': [2]},\n", 232 | " scoring='log_loss',\n", 233 | " n_jobs=1)" 234 | ] 235 | }, 236 | { 237 | "cell_type": "markdown", 238 | "metadata": {}, 239 | "source": [ 240 | "### 开始拟合" 241 | ] 242 | }, 243 | { 244 | "cell_type": "code", 245 | "execution_count": 8, 246 | "metadata": { 247 | "collapsed": false 248 | }, 249 | "outputs": [ 250 | { 251 | "name": "stdout", 252 | "output_type": "stream", 253 | "text": [ 254 | "Epoch 1/3\n", 255 | "40000/40000 [==============================] - 12s - loss: 0.8605 - acc: 0.7147 \n", 256 | "Epoch 2/3\n", 257 | "40000/40000 [==============================] - 11s - loss: 0.5645 - acc: 0.8208 \n", 258 | "Epoch 3/3\n", 259 | "40000/40000 [==============================] - 12s - loss: 0.4642 - acc: 0.8525 \n", 260 | " 1536/20000 [=>............................] - ETA: 2s" 261 | ] 262 | }, 263 | { 264 | "name": "stderr", 265 | "output_type": "stream", 266 | "text": [ 267 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 268 | " sample_weight=sample_weight)\n" 269 | ] 270 | }, 271 | { 272 | "name": "stdout", 273 | "output_type": "stream", 274 | "text": [ 275 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 276 | "40000/40000 [==============================] - 12s - loss: 0.8284 - acc: 0.7265 \n", 277 | "Epoch 2/3\n", 278 | "40000/40000 [==============================] - 12s - loss: 0.5357 - acc: 0.8283 \n", 279 | "Epoch 3/3\n", 280 | "40000/40000 [==============================] - 12s - loss: 0.4524 - acc: 0.8563 \n", 281 | " 1280/20000 [>.............................] - ETA: 2s" 282 | ] 283 | }, 284 | { 285 | "name": "stderr", 286 | "output_type": "stream", 287 | "text": [ 288 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 289 | " sample_weight=sample_weight)\n" 290 | ] 291 | }, 292 | { 293 | "name": "stdout", 294 | "output_type": "stream", 295 | "text": [ 296 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 297 | "40000/40000 [==============================] - 12s - loss: 0.8130 - acc: 0.7311 \n", 298 | "Epoch 2/3\n", 299 | "40000/40000 [==============================] - 12s - loss: 0.5159 - acc: 0.8359 \n", 300 | "Epoch 3/3\n", 301 | "40000/40000 [==============================] - 12s - loss: 0.4416 - acc: 0.8602 \n", 302 | " 1152/20000 [>.............................] - ETA: 3s" 303 | ] 304 | }, 305 | { 306 | "name": "stderr", 307 | "output_type": "stream", 308 | "text": [ 309 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 310 | " sample_weight=sample_weight)\n" 311 | ] 312 | }, 313 | { 314 | "name": "stdout", 315 | "output_type": "stream", 316 | "text": [ 317 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 318 | "40000/40000 [==============================] - 12s - loss: 0.8093 - acc: 0.7304 \n", 319 | "Epoch 2/6\n", 320 | "40000/40000 [==============================] - 12s - loss: 0.4811 - acc: 0.8459 \n", 321 | "Epoch 3/6\n", 322 | "40000/40000 [==============================] - 12s - loss: 0.4099 - acc: 0.8723 \n", 323 | "Epoch 4/6\n", 324 | "40000/40000 [==============================] - 11s - loss: 0.3624 - acc: 0.8859 \n", 325 | "Epoch 5/6\n", 326 | "40000/40000 [==============================] - 11s - loss: 0.3331 - acc: 0.8956 \n", 327 | "Epoch 6/6\n", 328 | "40000/40000 [==============================] - 12s - loss: 0.3093 - acc: 0.9030 \n", 329 | " 928/20000 [>.............................] - ETA: 3s" 330 | ] 331 | }, 332 | { 333 | "name": "stderr", 334 | "output_type": "stream", 335 | "text": [ 336 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 337 | " sample_weight=sample_weight)\n" 338 | ] 339 | }, 340 | { 341 | "name": "stdout", 342 | "output_type": "stream", 343 | "text": [ 344 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 345 | "40000/40000 [==============================] - 12s - loss: 0.7886 - acc: 0.7393 \n", 346 | "Epoch 2/6\n", 347 | "40000/40000 [==============================] - 12s - loss: 0.4860 - acc: 0.8451 \n", 348 | "Epoch 3/6\n", 349 | "40000/40000 [==============================] - 12s - loss: 0.4136 - acc: 0.8712 \n", 350 | "Epoch 4/6\n", 351 | "40000/40000 [==============================] - 12s - loss: 0.3739 - acc: 0.8827 \n", 352 | "Epoch 5/6\n", 353 | "40000/40000 [==============================] - 11s - loss: 0.3499 - acc: 0.8924 \n", 354 | "Epoch 6/6\n", 355 | "40000/40000 [==============================] - 12s - loss: 0.3297 - acc: 0.8989 \n", 356 | " 800/20000 [>.............................] - ETA: 4s" 357 | ] 358 | }, 359 | { 360 | "name": "stderr", 361 | "output_type": "stream", 362 | "text": [ 363 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 364 | " sample_weight=sample_weight)\n" 365 | ] 366 | }, 367 | { 368 | "name": "stdout", 369 | "output_type": "stream", 370 | "text": [ 371 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 372 | "40000/40000 [==============================] - 12s - loss: 0.9260 - acc: 0.6871 \n", 373 | "Epoch 2/6\n", 374 | "40000/40000 [==============================] - 11s - loss: 0.6032 - acc: 0.8043 \n", 375 | "Epoch 3/6\n", 376 | "40000/40000 [==============================] - 11s - loss: 0.5158 - acc: 0.8342 \n", 377 | "Epoch 4/6\n", 378 | "40000/40000 [==============================] - 12s - loss: 0.4425 - acc: 0.8599 \n", 379 | "Epoch 5/6\n", 380 | "40000/40000 [==============================] - 11s - loss: 0.4088 - acc: 0.8709 \n", 381 | "Epoch 6/6\n", 382 | "40000/40000 [==============================] - 11s - loss: 0.3644 - acc: 0.8848 \n", 383 | " 544/20000 [..............................] - ETA: 6s" 384 | ] 385 | }, 386 | { 387 | "name": "stderr", 388 | "output_type": "stream", 389 | "text": [ 390 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 391 | " sample_weight=sample_weight)\n" 392 | ] 393 | }, 394 | { 395 | "name": "stdout", 396 | "output_type": "stream", 397 | "text": [ 398 | "20000/20000 [==============================] - 2s \n", 399 | "Epoch 1/3\n", 400 | "40000/40000 [==============================] - 11s - loss: 0.6009 - acc: 0.8104 \n", 401 | "Epoch 2/3\n", 402 | "40000/40000 [==============================] - 11s - loss: 0.3410 - acc: 0.8968 \n", 403 | "Epoch 3/3\n", 404 | "40000/40000 [==============================] - 12s - loss: 0.2770 - acc: 0.9162 \n", 405 | " 256/20000 [..............................] - ETA: 14s" 406 | ] 407 | }, 408 | { 409 | "name": "stderr", 410 | "output_type": "stream", 411 | "text": [ 412 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 413 | " sample_weight=sample_weight)\n" 414 | ] 415 | }, 416 | { 417 | "name": "stdout", 418 | "output_type": "stream", 419 | "text": [ 420 | "19904/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 421 | "40000/40000 [==============================] - 12s - loss: 0.6185 - acc: 0.8061 \n", 422 | "Epoch 2/3\n", 423 | "40000/40000 [==============================] - 12s - loss: 0.3376 - acc: 0.8999 \n", 424 | "Epoch 3/3\n", 425 | "40000/40000 [==============================] - 12s - loss: 0.2741 - acc: 0.9193 \n", 426 | " 32/20000 [..............................] - ETA: 119s" 427 | ] 428 | }, 429 | { 430 | "name": "stderr", 431 | "output_type": "stream", 432 | "text": [ 433 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 434 | " sample_weight=sample_weight)\n" 435 | ] 436 | }, 437 | { 438 | "name": "stdout", 439 | "output_type": "stream", 440 | "text": [ 441 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 442 | "40000/40000 [==============================] - 12s - loss: 0.6259 - acc: 0.7990 \n", 443 | "Epoch 2/3\n", 444 | "40000/40000 [==============================] - 12s - loss: 0.3257 - acc: 0.9015 \n", 445 | "Epoch 3/3\n", 446 | "40000/40000 [==============================] - 12s - loss: 0.2599 - acc: 0.9230 \n" 447 | ] 448 | }, 449 | { 450 | "name": "stderr", 451 | "output_type": "stream", 452 | "text": [ 453 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 454 | " sample_weight=sample_weight)\n" 455 | ] 456 | }, 457 | { 458 | "name": "stdout", 459 | "output_type": "stream", 460 | "text": [ 461 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 462 | "40000/40000 [==============================] - 12s - loss: 0.6295 - acc: 0.7993 \n", 463 | "Epoch 2/6\n", 464 | "40000/40000 [==============================] - 12s - loss: 0.3693 - acc: 0.8871 \n", 465 | "Epoch 3/6\n", 466 | "40000/40000 [==============================] - 12s - loss: 0.2988 - acc: 0.9092 \n", 467 | "Epoch 4/6\n", 468 | "40000/40000 [==============================] - 11s - loss: 0.2542 - acc: 0.9238 \n", 469 | "Epoch 5/6\n", 470 | "40000/40000 [==============================] - 12s - loss: 0.2246 - acc: 0.9343 \n", 471 | "Epoch 6/6\n", 472 | "40000/40000 [==============================] - 11s - loss: 0.2026 - acc: 0.9413 \n" 473 | ] 474 | }, 475 | { 476 | "name": "stderr", 477 | "output_type": "stream", 478 | "text": [ 479 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 480 | " sample_weight=sample_weight)\n" 481 | ] 482 | }, 483 | { 484 | "name": "stdout", 485 | "output_type": "stream", 486 | "text": [ 487 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 488 | "40000/40000 [==============================] - 12s - loss: 0.5739 - acc: 0.8182 \n", 489 | "Epoch 2/6\n", 490 | "40000/40000 [==============================] - 12s - loss: 0.3139 - acc: 0.9077 \n", 491 | "Epoch 3/6\n", 492 | "40000/40000 [==============================] - 12s - loss: 0.2565 - acc: 0.9245 \n", 493 | "Epoch 4/6\n", 494 | "40000/40000 [==============================] - 12s - loss: 0.2306 - acc: 0.9316 \n", 495 | "Epoch 5/6\n", 496 | "40000/40000 [==============================] - 11s - loss: 0.2072 - acc: 0.9398 \n", 497 | "Epoch 6/6\n", 498 | "40000/40000 [==============================] - 12s - loss: 0.1947 - acc: 0.9416 \n" 499 | ] 500 | }, 501 | { 502 | "name": "stderr", 503 | "output_type": "stream", 504 | "text": [ 505 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 506 | " sample_weight=sample_weight)\n" 507 | ] 508 | }, 509 | { 510 | "name": "stdout", 511 | "output_type": "stream", 512 | "text": [ 513 | "20000/20000 [==============================] - 2s \n", 514 | "Epoch 1/6\n", 515 | "40000/40000 [==============================] - 12s - loss: 0.6035 - acc: 0.8089 \n", 516 | "Epoch 2/6\n", 517 | "40000/40000 [==============================] - 12s - loss: 0.3363 - acc: 0.8993 \n", 518 | "Epoch 3/6\n", 519 | "40000/40000 [==============================] - 12s - loss: 0.2729 - acc: 0.9181 \n", 520 | "Epoch 4/6\n", 521 | "40000/40000 [==============================] - 12s - loss: 0.2380 - acc: 0.9298 \n", 522 | "Epoch 5/6\n", 523 | "40000/40000 [==============================] - 12s - loss: 0.2114 - acc: 0.9376 \n", 524 | "Epoch 6/6\n", 525 | "40000/40000 [==============================] - 12s - loss: 0.1930 - acc: 0.9442 \n" 526 | ] 527 | }, 528 | { 529 | "name": "stderr", 530 | "output_type": "stream", 531 | "text": [ 532 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 533 | " sample_weight=sample_weight)\n" 534 | ] 535 | }, 536 | { 537 | "name": "stdout", 538 | "output_type": "stream", 539 | "text": [ 540 | "19904/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 541 | "40000/40000 [==============================] - 13s - loss: 0.7216 - acc: 0.7599 \n", 542 | "Epoch 2/3\n", 543 | "40000/40000 [==============================] - 13s - loss: 0.4140 - acc: 0.8687 \n", 544 | "Epoch 3/3\n", 545 | "40000/40000 [==============================] - 13s - loss: 0.3545 - acc: 0.8897 \n" 546 | ] 547 | }, 548 | { 549 | "name": "stderr", 550 | "output_type": "stream", 551 | "text": [ 552 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 553 | " sample_weight=sample_weight)\n" 554 | ] 555 | }, 556 | { 557 | "name": "stdout", 558 | "output_type": "stream", 559 | "text": [ 560 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 561 | "40000/40000 [==============================] - 13s - loss: 0.8014 - acc: 0.7343 \n", 562 | "Epoch 2/3\n", 563 | "40000/40000 [==============================] - 13s - loss: 0.4586 - acc: 0.8549 \n", 564 | "Epoch 3/3\n", 565 | "40000/40000 [==============================] - 13s - loss: 0.3886 - acc: 0.8797 \n" 566 | ] 567 | }, 568 | { 569 | "name": "stderr", 570 | "output_type": "stream", 571 | "text": [ 572 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 573 | " sample_weight=sample_weight)\n" 574 | ] 575 | }, 576 | { 577 | "name": "stdout", 578 | "output_type": "stream", 579 | "text": [ 580 | "20000/20000 [==============================] - 2s \n", 581 | "Epoch 1/3\n", 582 | "40000/40000 [==============================] - 14s - loss: 0.8124 - acc: 0.7284 \n", 583 | "Epoch 2/3\n", 584 | "40000/40000 [==============================] - 13s - loss: 0.4838 - acc: 0.8477 \n", 585 | "Epoch 3/3\n", 586 | "40000/40000 [==============================] - 13s - loss: 0.4148 - acc: 0.8705 \n" 587 | ] 588 | }, 589 | { 590 | "name": "stderr", 591 | "output_type": "stream", 592 | "text": [ 593 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 594 | " sample_weight=sample_weight)\n" 595 | ] 596 | }, 597 | { 598 | "name": "stdout", 599 | "output_type": "stream", 600 | "text": [ 601 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 602 | "40000/40000 [==============================] - 13s - loss: 0.7192 - acc: 0.7608 \n", 603 | "Epoch 2/6\n", 604 | "40000/40000 [==============================] - 13s - loss: 0.4043 - acc: 0.8712 \n", 605 | "Epoch 3/6\n", 606 | "40000/40000 [==============================] - 13s - loss: 0.3514 - acc: 0.8902 \n", 607 | "Epoch 4/6\n", 608 | "40000/40000 [==============================] - 13s - loss: 0.3170 - acc: 0.9009 \n", 609 | "Epoch 5/6\n", 610 | "40000/40000 [==============================] - 13s - loss: 0.2986 - acc: 0.9079 \n", 611 | "Epoch 6/6\n", 612 | "40000/40000 [==============================] - 13s - loss: 0.2777 - acc: 0.9138 \n" 613 | ] 614 | }, 615 | { 616 | "name": "stderr", 617 | "output_type": "stream", 618 | "text": [ 619 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 620 | " sample_weight=sample_weight)\n" 621 | ] 622 | }, 623 | { 624 | "name": "stdout", 625 | "output_type": "stream", 626 | "text": [ 627 | "20000/20000 [==============================] - 2s \n", 628 | "Epoch 1/6\n", 629 | "40000/40000 [==============================] - 13s - loss: 0.7651 - acc: 0.7428 \n", 630 | "Epoch 2/6\n", 631 | "40000/40000 [==============================] - 13s - loss: 0.4377 - acc: 0.8626 \n", 632 | "Epoch 3/6\n", 633 | "40000/40000 [==============================] - 12s - loss: 0.3688 - acc: 0.8846 \n", 634 | "Epoch 4/6\n", 635 | "40000/40000 [==============================] - 13s - loss: 0.3298 - acc: 0.8983 \n", 636 | "Epoch 5/6\n", 637 | "40000/40000 [==============================] - 13s - loss: 0.3050 - acc: 0.9052 \n", 638 | "Epoch 6/6\n", 639 | "40000/40000 [==============================] - 13s - loss: 0.2945 - acc: 0.9091 \n" 640 | ] 641 | }, 642 | { 643 | "name": "stderr", 644 | "output_type": "stream", 645 | "text": [ 646 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 647 | " sample_weight=sample_weight)\n" 648 | ] 649 | }, 650 | { 651 | "name": "stdout", 652 | "output_type": "stream", 653 | "text": [ 654 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 655 | "40000/40000 [==============================] - 13s - loss: 0.8654 - acc: 0.7107 \n", 656 | "Epoch 2/6\n", 657 | "40000/40000 [==============================] - 13s - loss: 0.5192 - acc: 0.8338 \n", 658 | "Epoch 3/6\n", 659 | "40000/40000 [==============================] - 13s - loss: 0.4300 - acc: 0.8638 \n", 660 | "Epoch 4/6\n", 661 | "40000/40000 [==============================] - 13s - loss: 0.3788 - acc: 0.8795 \n", 662 | "Epoch 5/6\n", 663 | "40000/40000 [==============================] - 13s - loss: 0.3477 - acc: 0.8908 \n", 664 | "Epoch 6/6\n", 665 | "40000/40000 [==============================] - 13s - loss: 0.3197 - acc: 0.8999 \n" 666 | ] 667 | }, 668 | { 669 | "name": "stderr", 670 | "output_type": "stream", 671 | "text": [ 672 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 673 | " sample_weight=sample_weight)\n" 674 | ] 675 | }, 676 | { 677 | "name": "stdout", 678 | "output_type": "stream", 679 | "text": [ 680 | "19968/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 681 | "40000/40000 [==============================] - 13s - loss: 0.5614 - acc: 0.8237 \n", 682 | "Epoch 2/3\n", 683 | "40000/40000 [==============================] - 13s - loss: 0.2812 - acc: 0.9163 \n", 684 | "Epoch 3/3\n", 685 | "40000/40000 [==============================] - 13s - loss: 0.2251 - acc: 0.9347 \n" 686 | ] 687 | }, 688 | { 689 | "name": "stderr", 690 | "output_type": "stream", 691 | "text": [ 692 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 693 | " sample_weight=sample_weight)\n" 694 | ] 695 | }, 696 | { 697 | "name": "stdout", 698 | "output_type": "stream", 699 | "text": [ 700 | "19904/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 701 | "40000/40000 [==============================] - 13s - loss: 0.5107 - acc: 0.8401 \n", 702 | "Epoch 2/3\n", 703 | "40000/40000 [==============================] - 13s - loss: 0.2421 - acc: 0.9307 \n", 704 | "Epoch 3/3\n", 705 | "40000/40000 [==============================] - 13s - loss: 0.1988 - acc: 0.9424 \n" 706 | ] 707 | }, 708 | { 709 | "name": "stderr", 710 | "output_type": "stream", 711 | "text": [ 712 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 713 | " sample_weight=sample_weight)\n" 714 | ] 715 | }, 716 | { 717 | "name": "stdout", 718 | "output_type": "stream", 719 | "text": [ 720 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/3\n", 721 | "40000/40000 [==============================] - 13s - loss: 0.5245 - acc: 0.8351 \n", 722 | "Epoch 2/3\n", 723 | "40000/40000 [==============================] - 13s - loss: 0.2639 - acc: 0.9222 \n", 724 | "Epoch 3/3\n", 725 | "40000/40000 [==============================] - 13s - loss: 0.2173 - acc: 0.9356 \n" 726 | ] 727 | }, 728 | { 729 | "name": "stderr", 730 | "output_type": "stream", 731 | "text": [ 732 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 733 | " sample_weight=sample_weight)\n" 734 | ] 735 | }, 736 | { 737 | "name": "stdout", 738 | "output_type": "stream", 739 | "text": [ 740 | "19904/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 741 | "40000/40000 [==============================] - 13s - loss: 0.5514 - acc: 0.8266 \n", 742 | "Epoch 2/6\n", 743 | "40000/40000 [==============================] - 13s - loss: 0.2738 - acc: 0.9178 \n", 744 | "Epoch 3/6\n", 745 | "40000/40000 [==============================] - 12s - loss: 0.2165 - acc: 0.9365 \n", 746 | "Epoch 4/6\n", 747 | "40000/40000 [==============================] - 13s - loss: 0.1909 - acc: 0.9453 \n", 748 | "Epoch 5/6\n", 749 | "40000/40000 [==============================] - 13s - loss: 0.1734 - acc: 0.9492 \n", 750 | "Epoch 6/6\n", 751 | "40000/40000 [==============================] - 13s - loss: 0.1621 - acc: 0.9533 \n" 752 | ] 753 | }, 754 | { 755 | "name": "stderr", 756 | "output_type": "stream", 757 | "text": [ 758 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 759 | " sample_weight=sample_weight)\n" 760 | ] 761 | }, 762 | { 763 | "name": "stdout", 764 | "output_type": "stream", 765 | "text": [ 766 | "20000/20000 [==============================] - 2s \n", 767 | "Epoch 1/6\n", 768 | "40000/40000 [==============================] - 11s - loss: 0.5373 - acc: 0.8282 \n", 769 | "Epoch 2/6\n", 770 | "40000/40000 [==============================] - 11s - loss: 0.2628 - acc: 0.9222 \n", 771 | "Epoch 3/6\n", 772 | "40000/40000 [==============================] - 11s - loss: 0.2104 - acc: 0.9392 \n", 773 | "Epoch 4/6\n", 774 | "40000/40000 [==============================] - 11s - loss: 0.1844 - acc: 0.9455 \n", 775 | "Epoch 5/6\n", 776 | "40000/40000 [==============================] - 10s - loss: 0.1657 - acc: 0.9530 \n", 777 | "Epoch 6/6\n", 778 | "40000/40000 [==============================] - 11s - loss: 0.1482 - acc: 0.9576 \n" 779 | ] 780 | }, 781 | { 782 | "name": "stderr", 783 | "output_type": "stream", 784 | "text": [ 785 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 786 | " sample_weight=sample_weight)\n" 787 | ] 788 | }, 789 | { 790 | "name": "stdout", 791 | "output_type": "stream", 792 | "text": [ 793 | "19936/20000 [============================>.] - ETA: 0sEpoch 1/6\n", 794 | "40000/40000 [==============================] - 11s - loss: 0.5453 - acc: 0.8316 \n", 795 | "Epoch 2/6\n", 796 | "40000/40000 [==============================] - 11s - loss: 0.2769 - acc: 0.9198 \n", 797 | "Epoch 3/6\n", 798 | "40000/40000 [==============================] - 11s - loss: 0.2206 - acc: 0.9356 \n", 799 | "Epoch 4/6\n", 800 | "40000/40000 [==============================] - 11s - loss: 0.1952 - acc: 0.9447 \n", 801 | "Epoch 5/6\n", 802 | "40000/40000 [==============================] - 11s - loss: 0.1756 - acc: 0.9485 \n", 803 | "Epoch 6/6\n", 804 | "40000/40000 [==============================] - 11s - loss: 0.1650 - acc: 0.9511 \n" 805 | ] 806 | }, 807 | { 808 | "name": "stderr", 809 | "output_type": "stream", 810 | "text": [ 811 | "/root/Util/miniconda/lib/python2.7/site-packages/sklearn/metrics/scorer.py:127: DeprecationWarning: Scoring method log_loss was renamed to neg_log_loss in version 0.18 and will be removed in 0.20.\n", 812 | " sample_weight=sample_weight)\n" 813 | ] 814 | }, 815 | { 816 | "name": "stdout", 817 | "output_type": "stream", 818 | "text": [ 819 | "20000/20000 [==============================] - 2s \n", 820 | "Epoch 1/6\n", 821 | "60000/60000 [==============================] - 17s - loss: 0.4784 - acc: 0.8494 \n", 822 | "Epoch 2/6\n", 823 | "60000/60000 [==============================] - 16s - loss: 0.2399 - acc: 0.9295 \n", 824 | "Epoch 3/6\n", 825 | "60000/60000 [==============================] - 16s - loss: 0.1875 - acc: 0.9451 \n", 826 | "Epoch 4/6\n", 827 | "60000/60000 [==============================] - 16s - loss: 0.1602 - acc: 0.9521 \n", 828 | "Epoch 5/6\n", 829 | "60000/60000 [==============================] - 16s - loss: 0.1445 - acc: 0.9584 \n", 830 | "Epoch 6/6\n", 831 | "60000/60000 [==============================] - 16s - loss: 0.1357 - acc: 0.9610 \n" 832 | ] 833 | }, 834 | { 835 | "data": { 836 | "text/plain": [ 837 | "GridSearchCV(cv=None, error_score='raise',\n", 838 | " estimator=,\n", 839 | " fit_params={}, iid=True, n_jobs=1,\n", 840 | " param_grid={'dense_layer_sizes': [[32], [64], [32, 32], [64, 64]], 'nb_epoch': [3, 6], 'nb_pool': [2], 'nb_conv': [3], 'nb_filters': [8]},\n", 841 | " pre_dispatch='2*n_jobs', refit=True, scoring='log_loss', verbose=0)" 842 | ] 843 | }, 844 | "execution_count": 8, 845 | "metadata": {}, 846 | "output_type": "execute_result" 847 | } 848 | ], 849 | "source": [ 850 | "validator.fit(X_train, y_train)" 851 | ] 852 | }, 853 | { 854 | "cell_type": "markdown", 855 | "metadata": {}, 856 | "source": [ 857 | "### 打印最好模型的参数" 858 | ] 859 | }, 860 | { 861 | "cell_type": "code", 862 | "execution_count": 9, 863 | "metadata": { 864 | "collapsed": false 865 | }, 866 | "outputs": [ 867 | { 868 | "name": "stdout", 869 | "output_type": "stream", 870 | "text": [ 871 | "The parameters of the best model are: \n", 872 | "{'dense_layer_sizes': [64, 64], 'nb_conv': 3, 'nb_pool': 2, 'nb_epoch': 6, 'nb_filters': 8}\n" 873 | ] 874 | } 875 | ], 876 | "source": [ 877 | "print('The parameters of the best model are: ')\n", 878 | "print(validator.best_params_)" 879 | ] 880 | }, 881 | { 882 | "cell_type": "markdown", 883 | "metadata": {}, 884 | "source": [ 885 | "### 返回模型\n", 886 | "\n", 887 | "validator.best_estimator_ 返回sklearn-wrapped版本的最好模型\n", 888 | "\n", 889 | "validator.best_estimator_.model 返回(unwrapped)keras模型" 890 | ] 891 | }, 892 | { 893 | "cell_type": "code", 894 | "execution_count": 12, 895 | "metadata": { 896 | "collapsed": false 897 | }, 898 | "outputs": [ 899 | { 900 | "name": "stdout", 901 | "output_type": "stream", 902 | "text": [ 903 | "10000/10000 [==============================] - 1s \n", 904 | "\n", 905 | "\n", 906 | "loss : 0.0535527251991\n", 907 | "acc : 0.9825\n" 908 | ] 909 | } 910 | ], 911 | "source": [ 912 | "best_model = validator.best_estimator_.model\n", 913 | "metric_names = best_model.metrics_names\n", 914 | "metric_values = best_model.evaluate(X_test, y_test)\n", 915 | "print('\\n')\n", 916 | "for metric, value in zip(metric_names, metric_values):\n", 917 | " print(metric, ': ', value)" 918 | ] 919 | } 920 | ], 921 | "metadata": { 922 | "kernelspec": { 923 | "display_name": "Python 2", 924 | "language": "python", 925 | "name": "python2" 926 | }, 927 | "language_info": { 928 | "codemirror_mode": { 929 | "name": "ipython", 930 | "version": 2 931 | }, 932 | "file_extension": ".py", 933 | "mimetype": "text/x-python", 934 | "name": "python", 935 | "nbconvert_exporter": "python", 936 | "pygments_lexer": "ipython2", 937 | "version": "2.7.12" 938 | }, 939 | "ssap_exp_config": { 940 | "error_alert": "Error Occurs!", 941 | "initial": [], 942 | "max_iteration": 1000, 943 | "recv_id": "", 944 | "running": [], 945 | "summary": [], 946 | "version": "1.1.1" 947 | } 948 | }, 949 | "nbformat": 4, 950 | "nbformat_minor": 0 951 | } 952 | -------------------------------------------------------------------------------- /13.Keras_with_tensorflow.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 程序说明\n", 8 | "名称:将Keras作为tensorflow的精简接口\n", 9 | "\n", 10 | "时间:2016年11月17日\n", 11 | "\n", 12 | "说明:该程序使用Keras方便的定义模型和接口,然后使用Tensorflow做训练。最终达到他们协同工作的一个状态。\n", 13 | "\n", 14 | "数据集:MNIST\n", 15 | "\n", 16 | "[原文地址](http://keras-cn.readthedocs.io/en/latest/blog/keras_and_tensorflow/)\n", 17 | "\n", 18 | "![image](http://keras-cn.readthedocs.io/en/latest/images/keras-tensorflow-logo.jpg)" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "## 1.加载keras模块" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 1, 31 | "metadata": { 32 | "collapsed": true 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "from __future__ import print_function\n", 37 | "import numpy as np\n", 38 | "np.random.seed(1337) # for reproducibility" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 2, 44 | "metadata": { 45 | "collapsed": false 46 | }, 47 | "outputs": [ 48 | { 49 | "name": "stderr", 50 | "output_type": "stream", 51 | "text": [ 52 | "Using TensorFlow backend.\n" 53 | ] 54 | } 55 | ], 56 | "source": [ 57 | "from keras.datasets import mnist\n", 58 | "from keras.models import Sequential\n", 59 | "from keras.layers.core import Dense, Dropout, Activation\n", 60 | "from keras.optimizers import SGD, Adam, RMSprop\n", 61 | "from keras.utils import np_utils\n", 62 | "from keras.objectives import categorical_crossentropy" 63 | ] 64 | }, 65 | { 66 | "cell_type": "markdown", 67 | "metadata": {}, 68 | "source": [ 69 | "### 加载Keras的后端和tensorflow" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "execution_count": null, 75 | "metadata": { 76 | "collapsed": true 77 | }, 78 | "outputs": [], 79 | "source": [ 80 | "import tensorflow as tf\n", 81 | "from keras import backend as K" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "## 2.变量初始化" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 4, 94 | "metadata": { 95 | "collapsed": true 96 | }, 97 | "outputs": [], 98 | "source": [ 99 | "batch_size = 128 \n", 100 | "nb_classes = 10\n", 101 | "nb_epoch = 20 " 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "## 3.准备数据" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 5, 114 | "metadata": { 115 | "collapsed": false 116 | }, 117 | "outputs": [ 118 | { 119 | "name": "stdout", 120 | "output_type": "stream", 121 | "text": [ 122 | "60000 train samples\n", 123 | "10000 test samples\n" 124 | ] 125 | } 126 | ], 127 | "source": [ 128 | "# the data, shuffled and split between train and test sets\n", 129 | "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n", 130 | "\n", 131 | "X_train = X_train.reshape(60000, 784)\n", 132 | "X_test = X_test.reshape(10000, 784)\n", 133 | "X_train = X_train.astype('float32')\n", 134 | "X_test = X_test.astype('float32')\n", 135 | "X_train /= 255\n", 136 | "X_test /= 255\n", 137 | "print(X_train.shape[0], 'train samples')\n", 138 | "print(X_test.shape[0], 'test samples')" 139 | ] 140 | }, 141 | { 142 | "cell_type": "markdown", 143 | "metadata": {}, 144 | "source": [ 145 | "### 转换类标号" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 6, 151 | "metadata": { 152 | "collapsed": true 153 | }, 154 | "outputs": [], 155 | "source": [ 156 | "# convert class vectors to binary class matrices\n", 157 | "Y_train = np_utils.to_categorical(y_train, nb_classes)\n", 158 | "Y_test = np_utils.to_categorical(y_test, nb_classes)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "## 4.建立模型\n", 166 | "### 使用Sequential()" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": 7, 172 | "metadata": { 173 | "collapsed": true 174 | }, 175 | "outputs": [], 176 | "source": [ 177 | "model = Sequential()\n", 178 | "model.add(Dense(512, input_shape=(784,)))\n", 179 | "model.add(Activation('relu'))\n", 180 | "model.add(Dropout(0.2))\n", 181 | "model.add(Dense(512))\n", 182 | "model.add(Activation('relu'))\n", 183 | "model.add(Dropout(0.2))\n", 184 | "model.add(Dense(10))\n", 185 | "model.add(Activation('softmax'))" 186 | ] 187 | }, 188 | { 189 | "cell_type": "markdown", 190 | "metadata": {}, 191 | "source": [ 192 | "### 打印模型" 193 | ] 194 | }, 195 | { 196 | "cell_type": "code", 197 | "execution_count": 8, 198 | "metadata": { 199 | "collapsed": false, 200 | "scrolled": true 201 | }, 202 | "outputs": [ 203 | { 204 | "name": "stdout", 205 | "output_type": "stream", 206 | "text": [ 207 | "____________________________________________________________________________________________________\n", 208 | "Layer (type) Output Shape Param # Connected to \n", 209 | "====================================================================================================\n", 210 | "dense_1 (Dense) (None, 512) 401920 dense_input_1[0][0] \n", 211 | "____________________________________________________________________________________________________\n", 212 | "activation_1 (Activation) (None, 512) 0 dense_1[0][0] \n", 213 | "____________________________________________________________________________________________________\n", 214 | "dropout_1 (Dropout) (None, 512) 0 activation_1[0][0] \n", 215 | "____________________________________________________________________________________________________\n", 216 | "dense_2 (Dense) (None, 512) 262656 dropout_1[0][0] \n", 217 | "____________________________________________________________________________________________________\n", 218 | "activation_2 (Activation) (None, 512) 0 dense_2[0][0] \n", 219 | "____________________________________________________________________________________________________\n", 220 | "dropout_2 (Dropout) (None, 512) 0 activation_2[0][0] \n", 221 | "____________________________________________________________________________________________________\n", 222 | "dense_3 (Dense) (None, 10) 5130 dropout_2[0][0] \n", 223 | "____________________________________________________________________________________________________\n", 224 | "activation_3 (Activation) (None, 10) 0 dense_3[0][0] \n", 225 | "====================================================================================================\n", 226 | "Total params: 669706\n", 227 | "____________________________________________________________________________________________________\n" 228 | ] 229 | } 230 | ], 231 | "source": [ 232 | "model.summary()" 233 | ] 234 | }, 235 | { 236 | "cell_type": "markdown", 237 | "metadata": {}, 238 | "source": [ 239 | "## 5.训练与评估" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "metadata": { 246 | "collapsed": true 247 | }, 248 | "outputs": [], 249 | "source": [] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": null, 254 | "metadata": { 255 | "collapsed": true 256 | }, 257 | "outputs": [], 258 | "source": [] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": 10, 272 | "metadata": { 273 | "collapsed": true 274 | }, 275 | "outputs": [], 276 | "source": [ 277 | "model.compile(loss='categorical_crossentropy',\n", 278 | " optimizer=RMSprop(),\n", 279 | " metrics=['accuracy'])" 280 | ] 281 | }, 282 | { 283 | "cell_type": "markdown", 284 | "metadata": {}, 285 | "source": [ 286 | "### 迭代训练" 287 | ] 288 | }, 289 | { 290 | "cell_type": "code", 291 | "execution_count": 11, 292 | "metadata": { 293 | "collapsed": false 294 | }, 295 | "outputs": [ 296 | { 297 | "name": "stdout", 298 | "output_type": "stream", 299 | "text": [ 300 | "Train on 60000 samples, validate on 10000 samples\n", 301 | "Epoch 1/20\n", 302 | "60000/60000 [==============================] - 4s - loss: 0.2448 - acc: 0.9239 - val_loss: 0.1220 - val_acc: 0.9623\n", 303 | "Epoch 2/20\n", 304 | "60000/60000 [==============================] - 4s - loss: 0.1026 - acc: 0.9689 - val_loss: 0.0788 - val_acc: 0.9749\n", 305 | "Epoch 3/20\n", 306 | "60000/60000 [==============================] - 5s - loss: 0.0752 - acc: 0.9770 - val_loss: 0.0734 - val_acc: 0.9779\n", 307 | "Epoch 4/20\n", 308 | "60000/60000 [==============================] - 5s - loss: 0.0609 - acc: 0.9817 - val_loss: 0.0777 - val_acc: 0.9780\n", 309 | "Epoch 5/20\n", 310 | "60000/60000 [==============================] - 5s - loss: 0.0515 - acc: 0.9847 - val_loss: 0.0888 - val_acc: 0.9782\n", 311 | "Epoch 6/20\n", 312 | "60000/60000 [==============================] - 5s - loss: 0.0451 - acc: 0.9864 - val_loss: 0.0799 - val_acc: 0.9803\n", 313 | "Epoch 7/20\n", 314 | "60000/60000 [==============================] - 5s - loss: 0.0398 - acc: 0.9878 - val_loss: 0.0814 - val_acc: 0.9809\n", 315 | "Epoch 8/20\n", 316 | "60000/60000 [==============================] - 5s - loss: 0.0362 - acc: 0.9896 - val_loss: 0.0765 - val_acc: 0.9830\n", 317 | "Epoch 9/20\n", 318 | "60000/60000 [==============================] - 5s - loss: 0.0325 - acc: 0.9905 - val_loss: 0.0917 - val_acc: 0.9802\n", 319 | "Epoch 10/20\n", 320 | "60000/60000 [==============================] - 5s - loss: 0.0279 - acc: 0.9921 - val_loss: 0.0808 - val_acc: 0.9844\n", 321 | "Epoch 11/20\n", 322 | "60000/60000 [==============================] - 5s - loss: 0.0272 - acc: 0.9925 - val_loss: 0.0991 - val_acc: 0.9811\n", 323 | "Epoch 12/20\n", 324 | "60000/60000 [==============================] - 5s - loss: 0.0248 - acc: 0.9930 - val_loss: 0.0864 - val_acc: 0.9839\n", 325 | "Epoch 13/20\n", 326 | "60000/60000 [==============================] - 5s - loss: 0.0240 - acc: 0.9935 - val_loss: 0.1061 - val_acc: 0.9809\n", 327 | "Epoch 14/20\n", 328 | "60000/60000 [==============================] - 5s - loss: 0.0240 - acc: 0.9931 - val_loss: 0.1010 - val_acc: 0.9843\n", 329 | "Epoch 15/20\n", 330 | "60000/60000 [==============================] - 5s - loss: 0.0200 - acc: 0.9946 - val_loss: 0.1102 - val_acc: 0.9803\n", 331 | "Epoch 16/20\n", 332 | "60000/60000 [==============================] - 5s - loss: 0.0207 - acc: 0.9942 - val_loss: 0.1020 - val_acc: 0.9833\n", 333 | "Epoch 17/20\n", 334 | "60000/60000 [==============================] - 5s - loss: 0.0196 - acc: 0.9946 - val_loss: 0.1205 - val_acc: 0.9812\n", 335 | "Epoch 18/20\n", 336 | "60000/60000 [==============================] - 4s - loss: 0.0208 - acc: 0.9950 - val_loss: 0.1081 - val_acc: 0.9829\n", 337 | "Epoch 19/20\n", 338 | "60000/60000 [==============================] - 3s - loss: 0.0199 - acc: 0.9951 - val_loss: 0.1113 - val_acc: 0.9835\n", 339 | "Epoch 20/20\n", 340 | "60000/60000 [==============================] - 4s - loss: 0.0186 - acc: 0.9953 - val_loss: 0.1168 - val_acc: 0.9849\n" 341 | ] 342 | } 343 | ], 344 | "source": [ 345 | "history = model.fit(X_train, Y_train,\n", 346 | " batch_size=batch_size, nb_epoch=nb_epoch,\n", 347 | " verbose=1, validation_data=(X_test, Y_test))" 348 | ] 349 | }, 350 | { 351 | "cell_type": "markdown", 352 | "metadata": {}, 353 | "source": [ 354 | "### 模型评估" 355 | ] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "execution_count": 12, 360 | "metadata": { 361 | "collapsed": false 362 | }, 363 | "outputs": [ 364 | { 365 | "name": "stdout", 366 | "output_type": "stream", 367 | "text": [ 368 | "Test score: 0.11684127673\n", 369 | "Test accuracy: 0.9849\n" 370 | ] 371 | } 372 | ], 373 | "source": [ 374 | "score = model.evaluate(X_test, Y_test, verbose=0)\n", 375 | "print('Test score:', score[0])\n", 376 | "print('Test accuracy:', score[1])" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": { 383 | "collapsed": true 384 | }, 385 | "outputs": [], 386 | "source": [] 387 | } 388 | ], 389 | "metadata": { 390 | "kernelspec": { 391 | "display_name": "Python 2", 392 | "language": "python", 393 | "name": "python2" 394 | }, 395 | "language_info": { 396 | "codemirror_mode": { 397 | "name": "ipython", 398 | "version": 2 399 | }, 400 | "file_extension": ".py", 401 | "mimetype": "text/x-python", 402 | "name": "python", 403 | "nbconvert_exporter": "python", 404 | "pygments_lexer": "ipython2", 405 | "version": "2.7.12" 406 | }, 407 | "ssap_exp_config": { 408 | "error_alert": "Error Occurs!", 409 | "initial": [], 410 | "max_iteration": 1000, 411 | "recv_id": "", 412 | "running": [], 413 | "summary": [], 414 | "version": "1.1.1" 415 | } 416 | }, 417 | "nbformat": 4, 418 | "nbformat_minor": 0 419 | } 420 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Keras-Tutorials 2 | > 版本:0.0.1 3 | 4 | > 作者:张天亮 5 | 6 | > 邮箱:zhangtianliang13@mails.ucas.ac.cn 7 | 8 | Github 加载 .ipynb 的速度较慢,建议在 [Nbviewer](http://nbviewer.ipython.org/github/xingkongliang/Keras-Tutorials) 中查看该项目。 9 | 10 | ## 简介 11 | 大部分内容来自keras项目中的[examples](https://github.com/fchollet/keras/tree/master/examples) 12 | 13 | ## 目录 14 | 15 | - [01.多层感知机实现](01.mnist_mpl.ipynb) 16 | - [02.模型的保存](02.save_model.ipynb) 17 | - [03.模型的加载](03.load_model.ipynb) 18 | - [04.绘制精度和损失曲线](04.plot_acc_loss.ipynb) 19 | - [05.卷积神经网络实现](05.mnist_cnn.ipynb) 20 | - [06.CIFAR10_cnn](06.cifar10_cnn.ipynb) 21 | - [07.mnist_lstm](07.mnist_lstm.ipynb) 22 | - [08.VGG16调用](08.vgg-16.ipynb) 23 | - [09.卷积滤波器可视化](09.conv_filter_visualization.ipynb) 24 | - [10.variational_autoencoder](10.variational_autoencoder.ipynb) 25 | - [11.锁定层fine-tuning网络](11.mnist_transfer_cnn.ipynb) 26 | - [12.使用sklearn wrapper进行的参数搜索](12.mnist_sklearn_wrapper.ipynb) 27 | - [13.Keras和Tensorflow联合使用](13.Keras_with_tensorflow.ipynb) 28 | - [14.Finetune InceptionV3样例](14.finetune_InceptionV3.ipynb) 29 | - [15.自编码器](15.autoencoder.ipynb) 30 | - [16.卷积自编码器](16.Convolutional_autoencoder.ipynb) 31 | 32 | 33 | 34 | --------------------------------------------------------------------------------