├── LinearRegression-Lasso-Ridge-Regression-Tutorial.ipynb ├── README.md ├── ROC-Curve-vs-Precision-Recall-Curve.ipynb ├── hyperparameter-across-models.ipynb └── keras-tutorial ├── 00-MNIST-dataset-example.ipynb ├── 01-IMDB-classification.ipynb ├── 02-MLP-Reuters-dataset-multiclass-classification.ipynb ├── 03-Boston-Housing-Price.ipynb ├── 04-Convnets-MNIST.ipynb ├── 05-ConvNets.ipynb ├── 06-Visualizing-ConvNets.ipynb ├── 07-Embedding-Layer.ipynb ├── 08-Embeddings-SimpleRNN.ipynb ├── 09-LSTM-simple.ipynb ├── 10-1DConvnets.ipynb └── 11-Training-Bi-LSTM.ipynb /README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ROC-Curve-vs-Precision-Recall-Curve.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 169, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "from scipy.stats import itemfreq\n", 12 | "\n", 13 | "from matplotlib import pyplot\n", 14 | "\n", 15 | "from sklearn.datasets import make_classification\n", 16 | "from sklearn.linear_model import LogisticRegression\n", 17 | "from sklearn.model_selection import train_test_split\n", 18 | "\n", 19 | "from sklearn.metrics import auc\n", 20 | "from sklearn.metrics import roc_curve\n", 21 | "from sklearn.metrics import roc_auc_score\n", 22 | "from sklearn.metrics import accuracy_score\n", 23 | "from sklearn.metrics import classification_report\n", 24 | "from sklearn.metrics import precision_recall_curve" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## The idea behind this notebook is to see how `Accuracy` and `ROC-Curves` fail to to proper interpret/evaluate a model making trained and making predictions over very imbalaced data:\n", 32 | "\n", 33 | "* Precision/Recall over Accuracy \n", 34 | "* Precision-Recall curve over ROC curve" 35 | ] 36 | }, 37 | { 38 | "cell_type": "markdown", 39 | "metadata": {}, 40 | "source": [ 41 | "# Let's first generate a 2 class imbalanced dataset" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 170, 47 | "metadata": { 48 | "collapsed": true 49 | }, 50 | "outputs": [], 51 | "source": [ 52 | "X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.95,0.05], random_state=42)\n", 53 | "trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=2)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 171, 59 | "metadata": {}, 60 | "outputs": [ 61 | { 62 | "data": { 63 | "text/plain": [ 64 | "array([[ 0, 9460],\n", 65 | " [ 1, 540]])" 66 | ] 67 | }, 68 | "execution_count": 171, 69 | "metadata": {}, 70 | "output_type": "execute_result" 71 | } 72 | ], 73 | "source": [ 74 | "itemfreq(y)" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 172, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "data": { 84 | "text/plain": [ 85 | "array([[ 0, 7576],\n", 86 | " [ 1, 424]])" 87 | ] 88 | }, 89 | "execution_count": 172, 90 | "metadata": {}, 91 | "output_type": "execute_result" 92 | } 93 | ], 94 | "source": [ 95 | "itemfreq(trainy)" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 173, 101 | "metadata": {}, 102 | "outputs": [ 103 | { 104 | "data": { 105 | "text/plain": [ 106 | "array([[ 0, 1884],\n", 107 | " [ 1, 116]])" 108 | ] 109 | }, 110 | "execution_count": 173, 111 | "metadata": {}, 112 | "output_type": "execute_result" 113 | } 114 | ], 115 | "source": [ 116 | "itemfreq(testy)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "markdown", 121 | "metadata": {}, 122 | "source": [ 123 | "# Train a model for classification" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 174, 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "data": { 133 | "text/plain": [ 134 | "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", 135 | " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", 136 | " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", 137 | " verbose=0, warm_start=False)" 138 | ] 139 | }, 140 | "execution_count": 174, 141 | "metadata": {}, 142 | "output_type": "execute_result" 143 | } 144 | ], 145 | "source": [ 146 | "model = LogisticRegression()\n", 147 | "model.fit(trainX, trainy)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 175, 153 | "metadata": { 154 | "collapsed": true 155 | }, 156 | "outputs": [], 157 | "source": [ 158 | "predictions = model.predict(testX)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "# Comparing the Accuracy vs. Precision-Recall with imbalenced data" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 176, 171 | "metadata": {}, 172 | "outputs": [ 173 | { 174 | "name": "stdout", 175 | "output_type": "stream", 176 | "text": [ 177 | "Accuracy: 0.957\n" 178 | ] 179 | } 180 | ], 181 | "source": [ 182 | "accuracy = accuracy_score(testy, predictions)\n", 183 | "print('Accuracy: %.3f' % accuracy)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 177, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "name": "stdout", 193 | "output_type": "stream", 194 | "text": [ 195 | " precision recall f1-score support\n", 196 | "\n", 197 | " 0 0.96 0.99 0.98 1884\n", 198 | " 1 0.73 0.41 0.53 116\n", 199 | "\n", 200 | "avg / total 0.95 0.96 0.95 2000\n", 201 | "\n" 202 | ] 203 | } 204 | ], 205 | "source": [ 206 | "print(classification_report(testy, predictions))" 207 | ] 208 | }, 209 | { 210 | "cell_type": "markdown", 211 | "metadata": {}, 212 | "source": [ 213 | "# ROC Curve vs. Precision-Recall Curve with imbalenced data" 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 178, 219 | "metadata": { 220 | "collapsed": true 221 | }, 222 | "outputs": [], 223 | "source": [ 224 | "probs = model.predict_proba(testX)\n", 225 | "probs = probs[:, 1] # we want positive outcome only, way roc_auc_score function works" 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": 179, 231 | "metadata": { 232 | "scrolled": true 233 | }, 234 | "outputs": [ 235 | { 236 | "data": { 237 | "image/png": "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\nOPz+uf5gMwAAAABJRU5ErkJggg==\n", 238 | "text/plain": [ 239 | "" 240 | ] 241 | }, 242 | "metadata": {}, 243 | "output_type": "display_data" 244 | }, 245 | { 246 | "name": "stdout", 247 | "output_type": "stream", 248 | "text": [ 249 | "AUC: 0.920\n" 250 | ] 251 | } 252 | ], 253 | "source": [ 254 | "fpr, tpr, thresholds = roc_curve(testy, probs)\n", 255 | "pyplot.plot([0, 1], [0, 1], linestyle='--')\n", 256 | "pyplot.plot(fpr, tpr, marker='.')\n", 257 | "pyplot.show()\n", 258 | "auc_score = roc_auc_score(testy, probs)\n", 259 | "print('AUC: %.3f' % auc_score)" 260 | ] 261 | }, 262 | { 263 | "cell_type": "markdown", 264 | "metadata": {}, 265 | "source": [ 266 | "# Precision-Recall curve" 267 | ] 268 | }, 269 | { 270 | "cell_type": "code", 271 | "execution_count": 180, 272 | "metadata": { 273 | "collapsed": true 274 | }, 275 | "outputs": [], 276 | "source": [ 277 | "precision, recall, thresholds = precision_recall_curve(testy, probs)\n", 278 | "auc_score = auc(recall, precision)" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 181, 284 | "metadata": {}, 285 | "outputs": [ 286 | { 287 | "data": { 288 | "image/png": "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\n", 289 | "text/plain": [ 290 | "" 291 | ] 292 | }, 293 | "metadata": {}, 294 | "output_type": "display_data" 295 | }, 296 | { 297 | "name": "stdout", 298 | "output_type": "stream", 299 | "text": [ 300 | "AUC: 0.577\n" 301 | ] 302 | } 303 | ], 304 | "source": [ 305 | "pyplot.plot([0, 1], [0.5, 0.5], linestyle='--')\n", 306 | "pyplot.plot(recall, precision, marker='.')\n", 307 | "pyplot.show()\n", 308 | "print('AUC: %.3f' % auc_score)" 309 | ] 310 | } 311 | ], 312 | "metadata": { 313 | "kernelspec": { 314 | "display_name": "Python 3", 315 | "language": "python", 316 | "name": "python3" 317 | }, 318 | "language_info": { 319 | "codemirror_mode": { 320 | "name": "ipython", 321 | "version": 3 322 | }, 323 | "file_extension": ".py", 324 | "mimetype": "text/x-python", 325 | "name": "python", 326 | "nbconvert_exporter": "python", 327 | "pygments_lexer": "ipython3", 328 | "version": "3.6.2" 329 | } 330 | }, 331 | "nbformat": 4, 332 | "nbformat_minor": 2 333 | } 334 | -------------------------------------------------------------------------------- /hyperparameter-across-models.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2018-08-09T04:32:39.267495Z", 9 | "start_time": "2018-08-09T04:32:38.631354Z" 10 | }, 11 | "collapsed": true 12 | }, 13 | "outputs": [], 14 | "source": [ 15 | "# adapted from: http://www.codiply.com/blog/hyperparameter-grid-search-across-multiple-models-in-scikit-learn/\n", 16 | "\n", 17 | "import numpy as np\n", 18 | "import pandas as pd\n", 19 | "\n", 20 | "from sklearn.model_selection import GridSearchCV\n", 21 | "\n", 22 | "class EstimatorSelectionHelper:\n", 23 | " \n", 24 | " def __init__(self, models, params):\n", 25 | " self.models = models\n", 26 | " self.params = params\n", 27 | " self.keys = models.keys()\n", 28 | " self.grid_searches = {}\n", 29 | " \n", 30 | " def fit(self, X, y, **grid_kwargs):\n", 31 | " for key in self.keys:\n", 32 | " print('Running GridSearchCV for %s.' % key)\n", 33 | " model = self.models[key]\n", 34 | " params = self.params[key]\n", 35 | " grid_search = GridSearchCV(model, params, **grid_kwargs)\n", 36 | " grid_search.fit(X, y)\n", 37 | " self.grid_searches[key] = grid_search\n", 38 | " print('Done.')\n", 39 | " \n", 40 | " def score_summary(self, sort_by='mean_test_score'):\n", 41 | " frames = []\n", 42 | " for name, grid_search in self.grid_searches.items():\n", 43 | " frame = pd.DataFrame(grid_search.cv_results_)\n", 44 | " frame = frame.filter(regex='^(?!.*param_).*$')\n", 45 | " frame['estimator'] = len(frame)*[name]\n", 46 | " frames.append(frame)\n", 47 | " df = pd.concat(frames)\n", 48 | " \n", 49 | " df = df.sort_values([sort_by], ascending=False)\n", 50 | " df = df.reset_index()\n", 51 | " df = df.drop(['rank_test_score', 'index'], 1)\n", 52 | " \n", 53 | " columns = df.columns.tolist()\n", 54 | " columns.remove('estimator')\n", 55 | " columns = ['estimator']+columns\n", 56 | " df = df[columns]\n", 57 | " return df" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 2, 63 | "metadata": { 64 | "ExecuteTime": { 65 | "end_time": "2018-08-09T04:32:39.368137Z", 66 | "start_time": "2018-08-09T04:32:39.270262Z" 67 | }, 68 | "collapsed": true 69 | }, 70 | "outputs": [], 71 | "source": [ 72 | "from sklearn import datasets\n", 73 | "\n", 74 | "breast_cancer = datasets.load_breast_cancer()\n", 75 | "X_cancer = breast_cancer.data\n", 76 | "y_cancer = breast_cancer.target\n", 77 | "\n", 78 | "from sklearn.ensemble import ExtraTreesClassifier\n", 79 | "from sklearn.ensemble import RandomForestClassifier\n", 80 | "from sklearn.ensemble import AdaBoostClassifier\n", 81 | "from sklearn.ensemble import GradientBoostingClassifier\n", 82 | "from sklearn.svm import SVC\n", 83 | "\n", 84 | "models1 = { \n", 85 | " 'ExtraTreesClassifier': ExtraTreesClassifier(),\n", 86 | " 'RandomForestClassifier': RandomForestClassifier(),\n", 87 | " 'AdaBoostClassifier': AdaBoostClassifier(),\n", 88 | " 'GradientBoostingClassifier': GradientBoostingClassifier()\n", 89 | "}\n", 90 | "\n", 91 | "params1 = { \n", 92 | " 'ExtraTreesClassifier': { 'n_estimators': [16, 32] },\n", 93 | " 'RandomForestClassifier': [\n", 94 | " { 'n_estimators': [16, 32] },\n", 95 | " {'criterion': ['gini', 'entropy'], 'n_estimators': [8, 16]}],\n", 96 | " 'AdaBoostClassifier': { 'n_estimators': [16, 32] },\n", 97 | " 'GradientBoostingClassifier': { 'n_estimators': [16, 32], 'learning_rate': [0.8, 1.0] }\n", 98 | "}" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 3, 104 | "metadata": { 105 | "ExecuteTime": { 106 | "end_time": "2018-08-09T04:32:41.208566Z", 107 | "start_time": "2018-08-09T04:32:39.370334Z" 108 | }, 109 | "scrolled": false 110 | }, 111 | "outputs": [ 112 | { 113 | "name": "stdout", 114 | "output_type": "stream", 115 | "text": [ 116 | "Running GridSearchCV for ExtraTreesClassifier.\n", 117 | "Running GridSearchCV for RandomForestClassifier.\n", 118 | "Running GridSearchCV for AdaBoostClassifier.\n", 119 | "Running GridSearchCV for GradientBoostingClassifier.\n", 120 | "Done.\n" 121 | ] 122 | }, 123 | { 124 | "name": "stderr", 125 | "output_type": "stream", 126 | "text": [ 127 | "/home/wdsrocha/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", 128 | " warnings.warn(*warn_args, **warn_kwargs)\n", 129 | "/home/wdsrocha/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", 130 | " warnings.warn(*warn_args, **warn_kwargs)\n", 131 | "/home/wdsrocha/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", 132 | " warnings.warn(*warn_args, **warn_kwargs)\n", 133 | "/home/wdsrocha/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", 134 | " warnings.warn(*warn_args, **warn_kwargs)\n", 135 | "/home/wdsrocha/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n", 136 | " warnings.warn(*warn_args, **warn_kwargs)\n" 137 | ] 138 | }, 139 | { 140 | "data": { 141 | "text/html": [ 142 | "
\n", 143 | "\n", 156 | "\n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | "
estimatormean_fit_timemean_score_timemean_test_scoremean_train_scoreparamssplit0_test_scoresplit0_train_scoresplit1_test_scoresplit1_train_scoresplit2_test_scoresplit2_train_scorestd_fit_timestd_score_timestd_test_scorestd_train_score
0AdaBoostClassifier0.0766090.0039710.9749141.000000{'n_estimators': 32}0.9623431.0000000.9916671.0000000.9707111.0000000.0053220.0002210.0123430.000000
1RandomForestClassifier0.0241240.0019280.9693200.998602{'criterion': 'gini', 'n_estimators': 16}0.9629631.0000000.9747900.9979040.9702130.9979040.0009180.0000800.0048730.000988
2ExtraTreesClassifier0.0416780.0033720.9665611.000000{'n_estimators': 32}0.9620251.0000000.9672131.0000000.9704641.0000000.0026270.0001410.0034740.000000
3ExtraTreesClassifier0.0298690.0034400.9665281.000000{'n_estimators': 16}0.9460581.0000000.9833331.0000000.9702131.0000000.0064640.0009230.0154510.000000
4AdaBoostClassifier0.0426140.0028370.9664870.998602{'n_estimators': 16}0.9632650.9979040.9833330.9979040.9527901.0000000.0023860.0002820.0126710.000988
5GradientBoostingClassifier0.0221160.0007020.9652551.000000{'learning_rate': 1.0, 'n_estimators': 16}0.9504131.0000000.9792531.0000000.9661021.0000000.0003130.0000160.0117990.000000
6RandomForestClassifier0.0528600.0032530.9649220.999298{'n_estimators': 32}0.9500000.9978950.9792531.0000000.9655171.0000000.0024980.0000060.0119600.000992
7RandomForestClassifier0.0184340.0014670.9647590.998599{'criterion': 'entropy', 'n_estimators': 8}0.9539751.0000000.9747900.9957980.9655171.0000000.0032980.0000050.0085220.001981
8GradientBoostingClassifier0.0325360.0007380.9638821.000000{'learning_rate': 1.0, 'n_estimators': 32}0.9547331.0000000.9792531.0000000.9576271.0000000.0014330.0000140.0109470.000000
9RandomForestClassifier0.0158420.0014760.9619200.998599{'criterion': 'gini', 'n_estimators': 8}0.9666670.9978950.9711931.0000000.9478260.9979040.0033160.0000200.0101100.000990
10RandomForestClassifier0.0309910.0024490.9609090.999301{'n_estimators': 16}0.9500001.0000000.9669420.9979040.9658121.0000000.0002770.0002660.0077380.000988
11RandomForestClassifier0.0333110.0021180.9598040.998602{'criterion': 'entropy', 'n_estimators': 16}0.9508200.9979040.9709541.0000000.9576270.9979040.0026790.0000500.0083690.000988
12GradientBoostingClassifier0.0269170.0011240.9581171.000000{'learning_rate': 0.8, 'n_estimators': 16}0.9508201.0000000.9792531.0000000.9442061.0000000.0008380.0002310.0152060.000000
13GradientBoostingClassifier0.0395520.0007800.9572191.000000{'learning_rate': 0.8, 'n_estimators': 32}0.9752071.0000000.9752071.0000000.9210531.0000000.0020260.0000270.0255060.000000
\n", 447 | "
" 448 | ], 449 | "text/plain": [ 450 | " estimator mean_fit_time mean_score_time \\\n", 451 | "0 AdaBoostClassifier 0.076609 0.003971 \n", 452 | "1 RandomForestClassifier 0.024124 0.001928 \n", 453 | "2 ExtraTreesClassifier 0.041678 0.003372 \n", 454 | "3 ExtraTreesClassifier 0.029869 0.003440 \n", 455 | "4 AdaBoostClassifier 0.042614 0.002837 \n", 456 | "5 GradientBoostingClassifier 0.022116 0.000702 \n", 457 | "6 RandomForestClassifier 0.052860 0.003253 \n", 458 | "7 RandomForestClassifier 0.018434 0.001467 \n", 459 | "8 GradientBoostingClassifier 0.032536 0.000738 \n", 460 | "9 RandomForestClassifier 0.015842 0.001476 \n", 461 | "10 RandomForestClassifier 0.030991 0.002449 \n", 462 | "11 RandomForestClassifier 0.033311 0.002118 \n", 463 | "12 GradientBoostingClassifier 0.026917 0.001124 \n", 464 | "13 GradientBoostingClassifier 0.039552 0.000780 \n", 465 | "\n", 466 | " mean_test_score mean_train_score \\\n", 467 | "0 0.974914 1.000000 \n", 468 | "1 0.969320 0.998602 \n", 469 | "2 0.966561 1.000000 \n", 470 | "3 0.966528 1.000000 \n", 471 | "4 0.966487 0.998602 \n", 472 | "5 0.965255 1.000000 \n", 473 | "6 0.964922 0.999298 \n", 474 | "7 0.964759 0.998599 \n", 475 | "8 0.963882 1.000000 \n", 476 | "9 0.961920 0.998599 \n", 477 | "10 0.960909 0.999301 \n", 478 | "11 0.959804 0.998602 \n", 479 | "12 0.958117 1.000000 \n", 480 | "13 0.957219 1.000000 \n", 481 | "\n", 482 | " params split0_test_score \\\n", 483 | "0 {'n_estimators': 32} 0.962343 \n", 484 | "1 {'criterion': 'gini', 'n_estimators': 16} 0.962963 \n", 485 | "2 {'n_estimators': 32} 0.962025 \n", 486 | "3 {'n_estimators': 16} 0.946058 \n", 487 | "4 {'n_estimators': 16} 0.963265 \n", 488 | "5 {'learning_rate': 1.0, 'n_estimators': 16} 0.950413 \n", 489 | "6 {'n_estimators': 32} 0.950000 \n", 490 | "7 {'criterion': 'entropy', 'n_estimators': 8} 0.953975 \n", 491 | "8 {'learning_rate': 1.0, 'n_estimators': 32} 0.954733 \n", 492 | "9 {'criterion': 'gini', 'n_estimators': 8} 0.966667 \n", 493 | "10 {'n_estimators': 16} 0.950000 \n", 494 | "11 {'criterion': 'entropy', 'n_estimators': 16} 0.950820 \n", 495 | "12 {'learning_rate': 0.8, 'n_estimators': 16} 0.950820 \n", 496 | "13 {'learning_rate': 0.8, 'n_estimators': 32} 0.975207 \n", 497 | "\n", 498 | " split0_train_score split1_test_score split1_train_score \\\n", 499 | "0 1.000000 0.991667 1.000000 \n", 500 | "1 1.000000 0.974790 0.997904 \n", 501 | "2 1.000000 0.967213 1.000000 \n", 502 | "3 1.000000 0.983333 1.000000 \n", 503 | "4 0.997904 0.983333 0.997904 \n", 504 | "5 1.000000 0.979253 1.000000 \n", 505 | "6 0.997895 0.979253 1.000000 \n", 506 | "7 1.000000 0.974790 0.995798 \n", 507 | "8 1.000000 0.979253 1.000000 \n", 508 | "9 0.997895 0.971193 1.000000 \n", 509 | "10 1.000000 0.966942 0.997904 \n", 510 | "11 0.997904 0.970954 1.000000 \n", 511 | "12 1.000000 0.979253 1.000000 \n", 512 | "13 1.000000 0.975207 1.000000 \n", 513 | "\n", 514 | " split2_test_score split2_train_score std_fit_time std_score_time \\\n", 515 | "0 0.970711 1.000000 0.005322 0.000221 \n", 516 | "1 0.970213 0.997904 0.000918 0.000080 \n", 517 | "2 0.970464 1.000000 0.002627 0.000141 \n", 518 | "3 0.970213 1.000000 0.006464 0.000923 \n", 519 | "4 0.952790 1.000000 0.002386 0.000282 \n", 520 | "5 0.966102 1.000000 0.000313 0.000016 \n", 521 | "6 0.965517 1.000000 0.002498 0.000006 \n", 522 | "7 0.965517 1.000000 0.003298 0.000005 \n", 523 | "8 0.957627 1.000000 0.001433 0.000014 \n", 524 | "9 0.947826 0.997904 0.003316 0.000020 \n", 525 | "10 0.965812 1.000000 0.000277 0.000266 \n", 526 | "11 0.957627 0.997904 0.002679 0.000050 \n", 527 | "12 0.944206 1.000000 0.000838 0.000231 \n", 528 | "13 0.921053 1.000000 0.002026 0.000027 \n", 529 | "\n", 530 | " std_test_score std_train_score \n", 531 | "0 0.012343 0.000000 \n", 532 | "1 0.004873 0.000988 \n", 533 | "2 0.003474 0.000000 \n", 534 | "3 0.015451 0.000000 \n", 535 | "4 0.012671 0.000988 \n", 536 | "5 0.011799 0.000000 \n", 537 | "6 0.011960 0.000992 \n", 538 | "7 0.008522 0.001981 \n", 539 | "8 0.010947 0.000000 \n", 540 | "9 0.010110 0.000990 \n", 541 | "10 0.007738 0.000988 \n", 542 | "11 0.008369 0.000988 \n", 543 | "12 0.015206 0.000000 \n", 544 | "13 0.025506 0.000000 " 545 | ] 546 | }, 547 | "execution_count": 3, 548 | "metadata": {}, 549 | "output_type": "execute_result" 550 | } 551 | ], 552 | "source": [ 553 | "helper1 = EstimatorSelectionHelper(models1, params1)\n", 554 | "helper1.fit(X_cancer, y_cancer, scoring='f1', n_jobs=2)\n", 555 | "helper1.score_summary()" 556 | ] 557 | } 558 | ], 559 | "metadata": { 560 | "kernelspec": { 561 | "display_name": "Python 3", 562 | "language": "python", 563 | "name": "python3" 564 | }, 565 | "language_info": { 566 | "codemirror_mode": { 567 | "name": "ipython", 568 | "version": 3 569 | }, 570 | "file_extension": ".py", 571 | "mimetype": "text/x-python", 572 | "name": "python", 573 | "nbconvert_exporter": "python", 574 | "pygments_lexer": "ipython3", 575 | "version": "3.6.3" 576 | }, 577 | "toc": { 578 | "base_numbering": 1, 579 | "nav_menu": {}, 580 | "number_sections": false, 581 | "sideBar": true, 582 | "skip_h1_title": true, 583 | "title_cell": "Table of Contents", 584 | "title_sidebar": "Contents", 585 | "toc_cell": false, 586 | "toc_position": {}, 587 | "toc_section_display": true, 588 | "toc_window_display": false 589 | }, 590 | "varInspector": { 591 | "cols": { 592 | "lenName": 16, 593 | "lenType": 16, 594 | "lenVar": 40 595 | }, 596 | "kernels_config": { 597 | "python": { 598 | "delete_cmd_postfix": "", 599 | "delete_cmd_prefix": "del ", 600 | "library": "var_list.py", 601 | "varRefreshCmd": "print(var_dic_list())" 602 | }, 603 | "r": { 604 | "delete_cmd_postfix": ") ", 605 | "delete_cmd_prefix": "rm(", 606 | "library": "var_list.r", 607 | "varRefreshCmd": "cat(var_dic_list()) " 608 | } 609 | }, 610 | "types_to_exclude": [ 611 | "module", 612 | "function", 613 | "builtin_function_or_method", 614 | "instance", 615 | "_Feature" 616 | ], 617 | "window_display": false 618 | } 619 | }, 620 | "nbformat": 4, 621 | "nbformat_minor": 2 622 | } 623 | -------------------------------------------------------------------------------- /keras-tutorial/00-MNIST-dataset-example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 20, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import matplotlib.pyplot as plt\n", 10 | "\n", 11 | "from keras import models\n", 12 | "from keras import layers\n", 13 | "from keras.utils import to_categorical\n", 14 | "from keras.datasets import mnist\n", 15 | "\n", 16 | "from sklearn.metrics.classification import classification_report" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 2, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "(60000, 28, 28)\n", 29 | "(10000, 28, 28)\n" 30 | ] 31 | } 32 | ], 33 | "source": [ 34 | "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n", 35 | "print(train_images.shape)\n", 36 | "print(test_images.shape)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 7, 42 | "metadata": {}, 43 | "outputs": [ 44 | { 45 | "data": { 46 | "image/png": "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\nAAAASUVORK5CYII=\n", 47 | "text/plain": [ 48 | "" 49 | ] 50 | }, 51 | "metadata": {}, 52 | "output_type": "display_data" 53 | } 54 | ], 55 | "source": [ 56 | "digit = train_images[90]\n", 57 | "plt.imshow(digit, cmap=plt.cm.binary)\n", 58 | "plt.show()" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 8, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | "[5 0 4 ..., 5 6 8]\n", 71 | "[7 2 1 ..., 4 5 6]\n" 72 | ] 73 | } 74 | ], 75 | "source": [ 76 | "print(train_labels)\n", 77 | "print(test_labels)" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": 9, 83 | "metadata": { 84 | "collapsed": true 85 | }, 86 | "outputs": [], 87 | "source": [ 88 | "network = models.Sequential()\n", 89 | "network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))\n", 90 | "network.add(layers.Dense(10, activation='softmax'))" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 10, 96 | "metadata": {}, 97 | "outputs": [ 98 | { 99 | "name": "stdout", 100 | "output_type": "stream", 101 | "text": [ 102 | "_________________________________________________________________\n", 103 | "Layer (type) Output Shape Param # \n", 104 | "=================================================================\n", 105 | "dense_1 (Dense) (None, 512) 401920 \n", 106 | "_________________________________________________________________\n", 107 | "dense_2 (Dense) (None, 10) 5130 \n", 108 | "=================================================================\n", 109 | "Total params: 407,050\n", 110 | "Trainable params: 407,050\n", 111 | "Non-trainable params: 0\n", 112 | "_________________________________________________________________\n" 113 | ] 114 | } 115 | ], 116 | "source": [ 117 | "network.summary()" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 11, 123 | "metadata": { 124 | "collapsed": true 125 | }, 126 | "outputs": [], 127 | "source": [ 128 | "network.compile(optimizer='rmsprop',\n", 129 | " loss='categorical_crossentropy',\n", 130 | " metrics=['accuracy'])" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 12, 136 | "metadata": { 137 | "collapsed": true 138 | }, 139 | "outputs": [], 140 | "source": [ 141 | "train_images = train_images.reshape((60000, 28 * 28))\n", 142 | "train_images = train_images.astype('float32') / 255\n", 143 | "\n", 144 | "test_images = test_images.reshape((10000, 28 * 28))\n", 145 | "test_images = test_images.astype('float32') / 255" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 13, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "text/plain": [ 156 | "array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)" 157 | ] 158 | }, 159 | "execution_count": 13, 160 | "metadata": {}, 161 | "output_type": "execute_result" 162 | } 163 | ], 164 | "source": [ 165 | "train_labels" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 14, 171 | "metadata": { 172 | "collapsed": true 173 | }, 174 | "outputs": [], 175 | "source": [ 176 | "train_labels = to_categorical(train_labels)\n", 177 | "test_labels = to_categorical(test_labels)" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 15, 183 | "metadata": {}, 184 | "outputs": [ 185 | { 186 | "data": { 187 | "text/plain": [ 188 | "array([[ 0., 0., 0., ..., 0., 0., 0.],\n", 189 | " [ 1., 0., 0., ..., 0., 0., 0.],\n", 190 | " [ 0., 0., 0., ..., 0., 0., 0.],\n", 191 | " ..., \n", 192 | " [ 0., 0., 0., ..., 0., 0., 0.],\n", 193 | " [ 0., 0., 0., ..., 0., 0., 0.],\n", 194 | " [ 0., 0., 0., ..., 0., 1., 0.]])" 195 | ] 196 | }, 197 | "execution_count": 15, 198 | "metadata": {}, 199 | "output_type": "execute_result" 200 | } 201 | ], 202 | "source": [ 203 | "train_labels" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 16, 209 | "metadata": {}, 210 | "outputs": [ 211 | { 212 | "name": "stdout", 213 | "output_type": "stream", 214 | "text": [ 215 | "Epoch 1/5\n", 216 | "60000/60000 [==============================] - 2s - loss: 0.2547 - acc: 0.9256 \n", 217 | "Epoch 2/5\n", 218 | "60000/60000 [==============================] - 2s - loss: 0.1022 - acc: 0.9694 \n", 219 | "Epoch 3/5\n", 220 | "60000/60000 [==============================] - 2s - loss: 0.0678 - acc: 0.9797 \n", 221 | "Epoch 4/5\n", 222 | "60000/60000 [==============================] - 2s - loss: 0.0483 - acc: 0.9855 \n", 223 | "Epoch 5/5\n", 224 | "60000/60000 [==============================] - 2s - loss: 0.0366 - acc: 0.9891 \n" 225 | ] 226 | } 227 | ], 228 | "source": [ 229 | "history = network.fit(train_images, train_labels, epochs=5, batch_size=128)" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": 46, 235 | "metadata": {}, 236 | "outputs": [ 237 | { 238 | "name": "stdout", 239 | "output_type": "stream", 240 | "text": [ 241 | " 8448/10000 [========================>.....] - ETA: 0s" 242 | ] 243 | } 244 | ], 245 | "source": [ 246 | "test_loss, test_acc = network.evaluate(test_images, test_labels)" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": 47, 252 | "metadata": {}, 253 | "outputs": [ 254 | { 255 | "name": "stdout", 256 | "output_type": "stream", 257 | "text": [ 258 | "test_acc: 0.9818\n" 259 | ] 260 | } 261 | ], 262 | "source": [ 263 | "print('test_acc:', test_acc)" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": 27, 269 | "metadata": {}, 270 | "outputs": [ 271 | { 272 | "ename": "AttributeError", 273 | "evalue": "'Dense' object has no attribute 'shape'", 274 | "output_type": "error", 275 | "traceback": [ 276 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 277 | "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", 278 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnetwork\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlayers\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 279 | "\u001b[0;31mAttributeError\u001b[0m: 'Dense' object has no attribute 'shape'" 280 | ] 281 | } 282 | ], 283 | "source": [ 284 | "network.layers[0].shape" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "execution_count": null, 290 | "metadata": { 291 | "collapsed": true 292 | }, 293 | "outputs": [], 294 | "source": [] 295 | } 296 | ], 297 | "metadata": { 298 | "kernelspec": { 299 | "display_name": "Python 3", 300 | "language": "python", 301 | "name": "python3" 302 | }, 303 | "language_info": { 304 | "codemirror_mode": { 305 | "name": "ipython", 306 | "version": 3 307 | }, 308 | "file_extension": ".py", 309 | "mimetype": "text/x-python", 310 | "name": "python", 311 | "nbconvert_exporter": "python", 312 | "pygments_lexer": "ipython3", 313 | "version": "3.6.2" 314 | } 315 | }, 316 | "nbformat": 4, 317 | "nbformat_minor": 2 318 | } 319 | -------------------------------------------------------------------------------- /keras-tutorial/04-Convnets-MNIST.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "from keras import layers\n", 18 | "from keras import models" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 4, 24 | "metadata": { 25 | "collapsed": true 26 | }, 27 | "outputs": [], 28 | "source": [ 29 | "model = models.Sequential()\n", 30 | "model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))\n", 31 | "model.add(layers.MaxPooling2D((2, 2)))\n", 32 | "model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n", 33 | "model.add(layers.MaxPooling2D((2, 2)))\n", 34 | "model.add(layers.Conv2D(64, (3, 3), activation='relu'))\n", 35 | "model.add(layers.Flatten())\n", 36 | "model.add(layers.Dense(64, activation='relu'))\n", 37 | "model.add(layers.Dense(10, activation='softmax'))" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 5, 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "name": "stdout", 47 | "output_type": "stream", 48 | "text": [ 49 | "_________________________________________________________________\n", 50 | "Layer (type) Output Shape Param # \n", 51 | "=================================================================\n", 52 | "conv2d_4 (Conv2D) (None, 26, 26, 32) 320 \n", 53 | "_________________________________________________________________\n", 54 | "max_pooling2d_3 (MaxPooling2 (None, 13, 13, 32) 0 \n", 55 | "_________________________________________________________________\n", 56 | "conv2d_5 (Conv2D) (None, 11, 11, 64) 18496 \n", 57 | "_________________________________________________________________\n", 58 | "max_pooling2d_4 (MaxPooling2 (None, 5, 5, 64) 0 \n", 59 | "_________________________________________________________________\n", 60 | "conv2d_6 (Conv2D) (None, 3, 3, 64) 36928 \n", 61 | "_________________________________________________________________\n", 62 | "flatten_1 (Flatten) (None, 576) 0 \n", 63 | "_________________________________________________________________\n", 64 | "dense_1 (Dense) (None, 64) 36928 \n", 65 | "_________________________________________________________________\n", 66 | "dense_2 (Dense) (None, 10) 650 \n", 67 | "=================================================================\n", 68 | "Total params: 93,322\n", 69 | "Trainable params: 93,322\n", 70 | "Non-trainable params: 0\n", 71 | "_________________________________________________________________\n" 72 | ] 73 | } 74 | ], 75 | "source": [ 76 | "model.summary()" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 7, 82 | "metadata": { 83 | "collapsed": true 84 | }, 85 | "outputs": [], 86 | "source": [ 87 | "from keras.datasets import mnist\n", 88 | "from keras.utils import to_categorical\n", 89 | "\n", 90 | "(train_images, train_labels), (test_images, test_labels) = mnist.load_data()\n", 91 | "train_images = train_images.reshape((60000, 28, 28, 1))\n", 92 | "train_images = train_images.astype('float32') / 255\n", 93 | "\n", 94 | "test_images = test_images.reshape((10000, 28, 28, 1))\n", 95 | "test_images = test_images.astype('float32') / 255\n", 96 | "\n", 97 | "train_labels = to_categorical(train_labels)\n", 98 | "test_labels = to_categorical(test_labels)\n", 99 | "\n", 100 | "model.compile(optimizer='rmsprop',\n", 101 | " loss='categorical_crossentropy',\n", 102 | " metrics=['accuracy'])" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 8, 108 | "metadata": {}, 109 | "outputs": [ 110 | { 111 | "name": "stdout", 112 | "output_type": "stream", 113 | "text": [ 114 | "Epoch 1/5\n", 115 | "60000/60000 [==============================] - 28s - loss: 0.1731 - acc: 0.9461 \n", 116 | "Epoch 2/5\n", 117 | "60000/60000 [==============================] - 32s - loss: 0.0488 - acc: 0.9847 \n", 118 | "Epoch 3/5\n", 119 | "60000/60000 [==============================] - 31s - loss: 0.0342 - acc: 0.9897 \n", 120 | "Epoch 4/5\n", 121 | "60000/60000 [==============================] - 29s - loss: 0.0269 - acc: 0.9925 \n", 122 | "Epoch 5/5\n", 123 | "60000/60000 [==============================] - 28s - loss: 0.0219 - acc: 0.9935 \n" 124 | ] 125 | }, 126 | { 127 | "data": { 128 | "text/plain": [ 129 | "" 130 | ] 131 | }, 132 | "execution_count": 8, 133 | "metadata": {}, 134 | "output_type": "execute_result" 135 | } 136 | ], 137 | "source": [ 138 | "model.fit(train_images, train_labels, epochs=5, batch_size=64)" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 10, 144 | "metadata": {}, 145 | "outputs": [ 146 | { 147 | "name": "stdout", 148 | "output_type": "stream", 149 | "text": [ 150 | " 9856/10000 [============================>.] - ETA: 0s" 151 | ] 152 | } 153 | ], 154 | "source": [ 155 | "test_loss, test_acc = model.evaluate(test_images, test_labels)" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 11, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "data": { 165 | "text/plain": [ 166 | "0.9899" 167 | ] 168 | }, 169 | "execution_count": 11, 170 | "metadata": {}, 171 | "output_type": "execute_result" 172 | } 173 | ], 174 | "source": [ 175 | "test_acc" 176 | ] 177 | } 178 | ], 179 | "metadata": { 180 | "kernelspec": { 181 | "display_name": "Python 3", 182 | "language": "python", 183 | "name": "python3" 184 | }, 185 | "language_info": { 186 | "codemirror_mode": { 187 | "name": "ipython", 188 | "version": 3 189 | }, 190 | "file_extension": ".py", 191 | "mimetype": "text/x-python", 192 | "name": "python", 193 | "nbconvert_exporter": "python", 194 | "pygments_lexer": "ipython3", 195 | "version": "3.6.2" 196 | } 197 | }, 198 | "nbformat": 4, 199 | "nbformat_minor": 2 200 | } 201 | -------------------------------------------------------------------------------- /keras-tutorial/08-Embeddings-SimpleRNN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 32, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Loading data...\n", 13 | "25000 train sequences\n", 14 | "25000 test sequences\n", 15 | "Pad sequences (samples x time)\n", 16 | "input_train shape: (25000, 500)\n", 17 | "input_test shape: (25000, 500)\n" 18 | ] 19 | } 20 | ], 21 | "source": [ 22 | "from keras.datasets import imdb\n", 23 | "from keras.preprocessing import sequence\n", 24 | "\n", 25 | "max_features = 10000 # number of words to consider as features\n", 26 | "maxlen = 500 # cut texts after this number of words (among top max_features most common words)\n", 27 | "batch_size = 32\n", 28 | "\n", 29 | "print('Loading data...')\n", 30 | "(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features)\n", 31 | "print(len(input_train), 'train sequences')\n", 32 | "print(len(input_test), 'test sequences')\n", 33 | "\n", 34 | "print('Pad sequences (samples x time)')\n", 35 | "input_train = sequence.pad_sequences(input_train, maxlen=maxlen)\n", 36 | "input_test = sequence.pad_sequences(input_test, maxlen=maxlen)\n", 37 | "print('input_train shape:', input_train.shape)\n", 38 | "print('input_test shape:', input_test.shape)" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": {}, 44 | "source": [ 45 | "### Train a model with SimpleRNN layer" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 34, 51 | "metadata": {}, 52 | "outputs": [ 53 | { 54 | "name": "stdout", 55 | "output_type": "stream", 56 | "text": [ 57 | "_________________________________________________________________\n", 58 | "Layer (type) Output Shape Param # \n", 59 | "=================================================================\n", 60 | "embedding_17 (Embedding) (None, None, 32) 320000 \n", 61 | "_________________________________________________________________\n", 62 | "simple_rnn_14 (SimpleRNN) (None, 32) 2080 \n", 63 | "_________________________________________________________________\n", 64 | "dense_7 (Dense) (None, 1) 33 \n", 65 | "=================================================================\n", 66 | "Total params: 322,113\n", 67 | "Trainable params: 322,113\n", 68 | "Non-trainable params: 0\n", 69 | "_________________________________________________________________\n", 70 | "Train on 20000 samples, validate on 5000 samples\n", 71 | "Epoch 1/10\n", 72 | "20000/20000 [==============================] - 38s - loss: 0.5746 - acc: 0.6927 - val_loss: 0.4781 - val_acc: 0.7722\n", 73 | "Epoch 2/10\n", 74 | "20000/20000 [==============================] - 37s - loss: 0.3671 - acc: 0.8502 - val_loss: 0.4209 - val_acc: 0.8162\n", 75 | "Epoch 3/10\n", 76 | "20000/20000 [==============================] - 39s - loss: 0.2772 - acc: 0.8916 - val_loss: 0.3339 - val_acc: 0.8688\n", 77 | "Epoch 4/10\n", 78 | "20000/20000 [==============================] - 37s - loss: 0.2015 - acc: 0.9248 - val_loss: 0.3482 - val_acc: 0.8638\n", 79 | "Epoch 5/10\n", 80 | "20000/20000 [==============================] - 37s - loss: 0.1485 - acc: 0.9460 - val_loss: 0.4357 - val_acc: 0.8458\n", 81 | "Epoch 6/10\n", 82 | "20000/20000 [==============================] - 36s - loss: 0.0988 - acc: 0.9653 - val_loss: 0.4985 - val_acc: 0.8346\n", 83 | "Epoch 7/10\n", 84 | "20000/20000 [==============================] - 39s - loss: 0.0700 - acc: 0.9782 - val_loss: 0.4940 - val_acc: 0.8608\n", 85 | "Epoch 8/10\n", 86 | "20000/20000 [==============================] - 37s - loss: 0.0537 - acc: 0.9841 - val_loss: 0.4806 - val_acc: 0.8576\n", 87 | "Epoch 9/10\n", 88 | "20000/20000 [==============================] - 37s - loss: 0.0289 - acc: 0.9922 - val_loss: 0.5513 - val_acc: 0.8364\n", 89 | "Epoch 10/10\n", 90 | "20000/20000 [==============================] - 37s - loss: 0.0209 - acc: 0.9944 - val_loss: 0.6547 - val_acc: 0.7958\n" 91 | ] 92 | } 93 | ], 94 | "source": [ 95 | "from keras.layers import Dense\n", 96 | "\n", 97 | "model = Sequential()\n", 98 | "model.add(Embedding(max_features, 32))\n", 99 | "model.add(SimpleRNN(32))\n", 100 | "model.add(Dense(1, activation='sigmoid'))\n", 101 | "model.summary()\n", 102 | "model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])\n", 103 | "history = model.fit(input_train, y_train,\n", 104 | " epochs=10,\n", 105 | " batch_size=128,\n", 106 | " validation_split=0.2)" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 35, 112 | "metadata": {}, 113 | "outputs": [ 114 | { 115 | "data": { 116 | "image/png": "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\n", 117 | "text/plain": [ 118 | "" 119 | ] 120 | }, 121 | "metadata": {}, 122 | "output_type": "display_data" 123 | }, 124 | { 125 | "data": { 126 | "image/png": "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\ns2dPRo0aVeXvWW2kOeUlmSTUz93dXwFeKbHs93H35xGaa2pMTbdvLl26lL/85S9kZWUBcNttt7H/\n/vtTWFj7OaSIAAAMaElEQVTIgAEDGD58OJmZmcVes2nTJo499lhuu+02rrnmGqZMmcKYMWO+s213\n5z//+Q/Tp09n3LhxvPrqq9x7770ceOCBPPvss7z33nv07t17n/Xl5+dzww03kJubS7NmzTjxxBN5\n6aWXaN26NZ999hnvv/8+AF9++SUAd9xxB6tXr6Z+/fq7l0nlaU55SRYpO0K1pts3u3TpsjvYAZ5+\n+ml69+5N7969WbJkCR988MF3XrPffvsxaNAgAI488khWrVpV6rbPPPPM76zz9ttvM2LECAAOP/xw\nunfvvs/65s6dy/HHH0+rVq2oV68e5557LrNnz+bggw9m2bJlXHnllcyYMYNmzZoB0L17d0aNGkVO\nTo4GIYmkoZQN95q+Zmbjxo1331++fDn33HMPb7zxBnl5eQwcOLDU/t7169fffb9OnToUFhaWuu0G\nDRqUuU5FtWzZkry8PPr378+kSZO45JJLAJgxYwaXXnop8+bNo0+fPuzcubNK9yvRqurOBpJ6Ujbc\no2zf/Oqrr2jatCnf+973WL9+PTNmzKjyffTt25dnnnkGgPfff7/Ubwbxjj76aGbNmsXGjRspLCxk\n6tSpHHvssRQUFODunH322YwbN44FCxawc+dO8vPzOf7447njjjv47LPP2FryBIakLA2mEkjxa6hG\n1b7Zu3dvMjMz6datGx07dqRv375Vvo9f/vKX/OxnPyMzM3P3rahJpTTt2rXjlltu4bjjjsPdOf30\n0znttNNYsGABF110Ee6OmXH77bdTWFjIueeey+bNm9m1axfXXXcdTZs2rfLfQaKxr84GOh9Qe5i7\nR7LjrKwsz83NLbZsyZIlHHrooZHUk2wKCwspLCykYcOGLF++nJNPPpnly5dTt25yfR7rb5Z8MjLC\nEXtJZrCrUhOESDIws/nunlXWesmVFLLb119/zQknnEBhYSHuzoMPPph0wS7JqUOH0BRT2nKpPVK2\nzT3dNW/enPnz5/Pee++Rl5fHySefHHVJkiJqurPBvujEbnQU7iJpJlkGU+nEbrQU7iJpKDsbVq0K\nbeyrVkVzIlWzZEZL4S4i1UKzZEZL4S4i1UKzZEZL4R5nwIAB3xmQdPfdd3PZZZft83VNmjQB4OOP\n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\nHi+j6pQAAAAASUVORK5CYII=\n", 127 | "text/plain": [ 128 | "" 129 | ] 130 | }, 131 | "metadata": {}, 132 | "output_type": "display_data" 133 | } 134 | ], 135 | "source": [ 136 | "import matplotlib.pyplot as plt\n", 137 | "\n", 138 | "acc = history.history['acc']\n", 139 | "val_acc = history.history['val_acc']\n", 140 | "loss = history.history['loss']\n", 141 | "val_loss = history.history['val_loss']\n", 142 | "\n", 143 | "epochs = range(1, len(acc) + 1)\n", 144 | "\n", 145 | "plt.plot(epochs, acc, 'bo', label='Training acc')\n", 146 | "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", 147 | "plt.title('Training and validation accuracy')\n", 148 | "plt.legend()\n", 149 | "\n", 150 | "plt.figure()\n", 151 | "\n", 152 | "plt.plot(epochs, loss, 'bo', label='Training loss')\n", 153 | "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", 154 | "plt.title('Training and validation loss')\n", 155 | "plt.legend()\n", 156 | "\n", 157 | "plt.show()" 158 | ] 159 | } 160 | ], 161 | "metadata": { 162 | "kernelspec": { 163 | "display_name": "Python 3", 164 | "language": "python", 165 | "name": "python3" 166 | }, 167 | "language_info": { 168 | "codemirror_mode": { 169 | "name": "ipython", 170 | "version": 3 171 | }, 172 | "file_extension": ".py", 173 | "mimetype": "text/x-python", 174 | "name": "python", 175 | "nbconvert_exporter": "python", 176 | "pygments_lexer": "ipython3", 177 | "version": "3.6.2" 178 | } 179 | }, 180 | "nbformat": 4, 181 | "nbformat_minor": 2 182 | } 183 | -------------------------------------------------------------------------------- /keras-tutorial/09-LSTM-simple.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "from keras.datasets import imdb\n", 18 | "from keras.preprocessing import sequence\n", 19 | "from keras.models import Sequential\n", 20 | "from keras.layers import Flatten, Dense, Embedding" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 5, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "name": "stdout", 30 | "output_type": "stream", 31 | "text": [ 32 | "Loading data...\n", 33 | "25000 train sequences\n", 34 | "25000 test sequences\n" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "max_features = 10000\n", 40 | "maxlen = 20\n", 41 | "batch_size = 32\n", 42 | "\n", 43 | "print('Loading data...')\n", 44 | "(input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features)\n", 45 | "print(len(input_train), 'train sequences')\n", 46 | "print(len(input_test), 'test sequences')" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 4, 52 | "metadata": { 53 | "collapsed": true 54 | }, 55 | "outputs": [], 56 | "source": [ 57 | "print('Pad sequences (samples x time)')\n", 58 | "input_train = sequence.pad_sequences(input_train, maxlen=maxlen)\n", 59 | "input_test = sequence.pad_sequences(input_test, maxlen=maxlen)\n", 60 | "print('input_train shape:', input_train.shape)\n", 61 | "print('input_test shape:', input_test.shape)" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": {}, 67 | "source": [ 68 | "### Train a model with an LSTM layer" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 4, 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "name": "stdout", 78 | "output_type": "stream", 79 | "text": [ 80 | "_________________________________________________________________\n", 81 | "Layer (type) Output Shape Param # \n", 82 | "=================================================================\n", 83 | "embedding_1 (Embedding) (None, None, 32) 320000 \n", 84 | "_________________________________________________________________\n", 85 | "lstm_1 (LSTM) (None, 32) 8320 \n", 86 | "_________________________________________________________________\n", 87 | "dense_1 (Dense) (None, 1) 33 \n", 88 | "=================================================================\n", 89 | "Total params: 328,353\n", 90 | "Trainable params: 328,353\n", 91 | "Non-trainable params: 0\n", 92 | "_________________________________________________________________\n" 93 | ] 94 | } 95 | ], 96 | "source": [ 97 | "from keras.layers import LSTM\n", 98 | "\n", 99 | "model = Sequential()\n", 100 | "model.add(Embedding(max_features, 32))\n", 101 | "model.add(LSTM(32))\n", 102 | "model.add(Dense(1, activation='sigmoid'))\n", 103 | "\n", 104 | "model.compile(optimizer='rmsprop',\n", 105 | " loss='binary_crossentropy',\n", 106 | " metrics=['acc'])\n", 107 | "model.summary()" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 5, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "Train on 20000 samples, validate on 5000 samples\n", 120 | "Epoch 1/10\n", 121 | "20000/20000 [==============================] - 7s - loss: 0.5819 - acc: 0.6953 - val_loss: 0.5217 - val_acc: 0.7366\n", 122 | "Epoch 2/10\n", 123 | "20000/20000 [==============================] - 7s - loss: 0.4401 - acc: 0.7957 - val_loss: 0.4984 - val_acc: 0.7478\n", 124 | "Epoch 3/10\n", 125 | "20000/20000 [==============================] - 7s - loss: 0.3956 - acc: 0.8212 - val_loss: 0.4973 - val_acc: 0.7564\n", 126 | "Epoch 4/10\n", 127 | "20000/20000 [==============================] - 8s - loss: 0.3690 - acc: 0.8365 - val_loss: 0.5303 - val_acc: 0.7508\n", 128 | "Epoch 5/10\n", 129 | "20000/20000 [==============================] - 8s - loss: 0.3507 - acc: 0.8459 - val_loss: 0.5248 - val_acc: 0.7494\n", 130 | "Epoch 6/10\n", 131 | "20000/20000 [==============================] - 9s - loss: 0.3359 - acc: 0.8529 - val_loss: 0.5449 - val_acc: 0.7364\n", 132 | "Epoch 7/10\n", 133 | "20000/20000 [==============================] - 8s - loss: 0.3228 - acc: 0.8621 - val_loss: 0.5636 - val_acc: 0.7402\n", 134 | "Epoch 8/10\n", 135 | "20000/20000 [==============================] - 8s - loss: 0.3094 - acc: 0.8681 - val_loss: 0.5850 - val_acc: 0.7444\n", 136 | "Epoch 9/10\n", 137 | "20000/20000 [==============================] - 8s - loss: 0.2957 - acc: 0.8757 - val_loss: 0.5512 - val_acc: 0.7440\n", 138 | "Epoch 10/10\n", 139 | "20000/20000 [==============================] - 7s - loss: 0.2807 - acc: 0.8823 - val_loss: 0.5894 - val_acc: 0.7450\n" 140 | ] 141 | } 142 | ], 143 | "source": [ 144 | "history = model.fit(input_train, y_train,\n", 145 | " epochs=10,\n", 146 | " batch_size=128,\n", 147 | " validation_split=0.2)" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 8, 153 | "metadata": {}, 154 | "outputs": [ 155 | { 156 | "data": { 157 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEICAYAAABfz4NwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcFdWd9/HPl00EZMdE2bpjHNk3WzSDu2LQMWKMMSAm\nGqNEJzoZY2ZiEhMZZ8yTZ7JoksdoiFGjQRhHx6iTqKMRQxw1oVF2gyACNqC2oCiiIvh7/jjVcLvp\n5QLdfW/T3/frVa+uOnXq3FPV3fW759SpKkUEZmZmbQpdATMzKw4OCGZmBjggmJlZxgHBzMwABwQz\nM8s4IJiZGeCAYDkktZW0WdKAxsxbSJI+LqnRx1ZLOlnSqpzlZZKOySfvHnzWLZK+tafbm+WrXaEr\nYHtO0uacxU7A+8D2bPnLETFjd8qLiO1Al8bO2xpExGGNUY6ki4DzIuL4nLIvaoyyzRrigNCCRcSO\nE3L2DfSiiHisrvyS2kXEtuaom1lD/PdYfNxltA+T9G+S/kPSTElvA+dJ+oSkZyS9KWm9pJ9Kap/l\nbycpJJVky7/J1j8k6W1JT0sq3d282fpTJb0gaZOkn0n6X0kX1FHvfOr4ZUkrJL0h6ac527aVdL2k\nDZJWAhPqOT7fljSrRtqNkn6czV8k6flsf17Mvr3XVVaFpOOz+U6S7szqtgQ4vEbeqyWtzMpdIumM\nLH048P+AY7LuuNdzju20nO0vyfZ9g6TfSjoon2OzO8e5qj6SHpO0UdIrkv4553O+kx2TtySVSzq4\ntu45SU9W/Z6z4zkn+5yNwNWSDpU0O/uM17Pj1i1n+4HZPlZm638iqWNW58E5+Q6StEVSr7r21/IQ\nEZ72gQlYBZxcI+3fgK3Ap0jBf3/gCOBIUuvwY8ALwGVZ/nZAACXZ8m+A14EyoD3wH8Bv9iDvgcDb\nwMRs3deAD4AL6tiXfOp4P9ANKAE2Vu07cBmwBOgH9ALmpD/zWj/nY8BmoHNO2a8BZdnyp7I8Ak4E\n3gVGZOtOBlbllFUBHJ/N/xB4AugBDASW1sh7DnBQ9js5N6vDR7J1FwFP1Kjnb4Bp2fwpWR1HAR2B\nnwOP53NsdvM4dwNeBb4K7Ad0BcZm674JLAAOzfZhFNAT+HjNYw08WfV7zvZtG3Ap0Jb09/g3wElA\nh+zv5H+BH+bsz+LseHbO8o/L1k0Hrsv5nCuB+wr9f9jSp4JXwFMj/SLrDgiPN7Dd14H/zOZrO8nf\n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\ngzkifg/8vkbad3PmlwK1DpuJiCeAo2qkvQMcvpt1NbN9XCEe+Ww7tao7lc2suLXW8f/FwgFhL51w\nwgm73GR2ww03cOmll9a7XZcuXQBYt24dZ599dq15jj/+eMrLy+st54YbbmBLzn/QaaedxptvvplP\n1c2KTmsd/18sHBD20uTJk5k1q/r9drNmzWLy5Ml5bX/wwQdzzz337PHn1wwIv//97+nevfsel2dW\nSM39eBmrzgFhL5199tn87ne/2/EynFWrVrFu3TqOOeYYNm/ezEknncSYMWMYPnw4999//y7br1q1\nimHDhgHpsRKTJk1i8ODBfPrTn97xuAiASy+9dMejs6+55hoAfvrTn7Ju3TpOOOEETjjhBABKSkp4\n/fXXAfjxj3/MsGHDGDZs2I5HZ69atYrBgwdz8cUXM3ToUE455ZRqn1PlwQcf5Mgjj2T06NGcfPLJ\nvPrqq0C61+GLX/wiw4cPZ8SIETseffHwww8zZswYRo4cyUknndQox9Zan9Y6/r9Y7FN3Lf3jP0It\nj//fK6NGQXYurVXPnj0ZO3YsDz30EBMnTmTWrFmcc845SKJjx47cd999dO3alddff52jjjqKM844\no853DN9000106tSJ559/noULFzJmzJgd66677jp69uzJ9u3bOemkk1i4cCH/8A//wI9//GNmz55N\n7969q5U1b948brvtNv785z8TERx55JEcd9xx9OjRg+XLlzNz5kx++ctfcs4553Dvvfdy3nnnVdv+\n6KOP5plnnkESt9xyC//+7//Oj370I/71X/+Vbt26sWjRIgDeeOMNKisrufjii5kzZw6lpaV+3pHt\nsdY6/r9YuIXQCHK7jXK7iyKCb33rW4wYMYKTTz6ZtWvX7vimXZs5c+bsODGPGDGCESNG7Fh39913\nM2bMGEaPHs2SJUtqfXBdrieffJJPf/rTdO7cmS5dunDWWWfxpz/9CYDS0lJGjRoF1P2I7YqKCj75\nyU8yfPhwfvCDH7BkyRIAHnvssWpvb+vRowfPPPMMxx57LKWlpYAfkd1SFctwz9Y4/r9Y7FMthPq+\nyTeliRMncsUVV/Dss8+yZcsWDj88jaidMWMGlZWVzJs3j/bt21NSUrJHj5p+6aWX+OEPf8jcuXPp\n0aMHF1xwwV49srrq0dmQHp9dW5fR5Zdfzte+9jXOOOMMnnjiCaZNm7bHn2fFz8M9DdxCaBRdunTh\n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\n", 158 | "text/plain": [ 159 | "" 160 | ] 161 | }, 162 | "metadata": {}, 163 | "output_type": "display_data" 164 | }, 165 | { 166 | "data": { 167 | "image/png": "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\n/wORvxbSc54nUwAAAABJRU5ErkJggg==\n", 168 | "text/plain": [ 169 | "" 170 | ] 171 | }, 172 | "metadata": {}, 173 | "output_type": "display_data" 174 | } 175 | ], 176 | "source": [ 177 | "import matplotlib.pyplot as plt\n", 178 | "\n", 179 | "acc = history.history['acc']\n", 180 | "val_acc = history.history['val_acc']\n", 181 | "loss = history.history['loss']\n", 182 | "val_loss = history.history['val_loss']\n", 183 | "\n", 184 | "epochs = range(1, len(acc) + 1)\n", 185 | "\n", 186 | "plt.plot(epochs, acc, 'bo', label='Training acc')\n", 187 | "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", 188 | "plt.title('Training and validation accuracy')\n", 189 | "plt.legend()\n", 190 | "\n", 191 | "plt.figure()\n", 192 | "\n", 193 | "plt.plot(epochs, loss, 'bo', label='Training loss')\n", 194 | "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", 195 | "plt.title('Training and validation loss')\n", 196 | "plt.legend()\n", 197 | "\n", 198 | "plt.show()" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": { 205 | "collapsed": true 206 | }, 207 | "outputs": [], 208 | "source": [] 209 | } 210 | ], 211 | "metadata": { 212 | "kernelspec": { 213 | "display_name": "Python 3", 214 | "language": "python", 215 | "name": "python3" 216 | }, 217 | "language_info": { 218 | "codemirror_mode": { 219 | "name": "ipython", 220 | "version": 3 221 | }, 222 | "file_extension": ".py", 223 | "mimetype": "text/x-python", 224 | "name": "python", 225 | "nbconvert_exporter": "python", 226 | "pygments_lexer": "ipython3", 227 | "version": "3.6.2" 228 | } 229 | }, 230 | "nbformat": 4, 231 | "nbformat_minor": 2 232 | } 233 | -------------------------------------------------------------------------------- /keras-tutorial/10-1DConvnets.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stderr", 10 | "output_type": "stream", 11 | "text": [ 12 | "Using TensorFlow backend.\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "from keras.datasets import imdb\n", 18 | "from keras.preprocessing import sequence\n", 19 | "\n", 20 | "max_features = 10000\n", 21 | "max_len = 500" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "name": "stdout", 31 | "output_type": "stream", 32 | "text": [ 33 | "Loading data...\n", 34 | "25000 train sequences\n", 35 | "25000 test sequences\n", 36 | "Pad sequences (samples x time)\n", 37 | "x_train shape: (25000, 500)\n", 38 | "x_test shape: (25000, 500)\n" 39 | ] 40 | } 41 | ], 42 | "source": [ 43 | "print('Loading data...')\n", 44 | "(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)\n", 45 | "print(len(x_train), 'train sequences')\n", 46 | "print(len(x_test), 'test sequences')\n", 47 | "\n", 48 | "print('Pad sequences (samples x time)')\n", 49 | "x_train = sequence.pad_sequences(x_train, maxlen=max_len)\n", 50 | "x_test = sequence.pad_sequences(x_test, maxlen=max_len)\n", 51 | "print('x_train shape:', x_train.shape)\n", 52 | "print('x_test shape:', x_test.shape)" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 4, 58 | "metadata": {}, 59 | "outputs": [ 60 | { 61 | "name": "stdout", 62 | "output_type": "stream", 63 | "text": [ 64 | "_________________________________________________________________\n", 65 | "Layer (type) Output Shape Param # \n", 66 | "=================================================================\n", 67 | "embedding_1 (Embedding) (None, 500, 128) 1280000 \n", 68 | "_________________________________________________________________\n", 69 | "conv1d_1 (Conv1D) (None, 494, 32) 28704 \n", 70 | "_________________________________________________________________\n", 71 | "max_pooling1d_1 (MaxPooling1 (None, 98, 32) 0 \n", 72 | "_________________________________________________________________\n", 73 | "conv1d_2 (Conv1D) (None, 92, 32) 7200 \n", 74 | "_________________________________________________________________\n", 75 | "global_max_pooling1d_1 (Glob (None, 32) 0 \n", 76 | "_________________________________________________________________\n", 77 | "dense_1 (Dense) (None, 1) 33 \n", 78 | "=================================================================\n", 79 | "Total params: 1,315,937\n", 80 | "Trainable params: 1,315,937\n", 81 | "Non-trainable params: 0\n", 82 | "_________________________________________________________________\n" 83 | ] 84 | } 85 | ], 86 | "source": [ 87 | "from keras.models import Sequential\n", 88 | "from keras import layers\n", 89 | "from keras.optimizers import RMSprop\n", 90 | "\n", 91 | "model = Sequential()\n", 92 | "model.add(layers.Embedding(max_features, 128, input_length=max_len))\n", 93 | "model.add(layers.Conv1D(32, 7, activation='relu'))\n", 94 | "model.add(layers.MaxPooling1D(5))\n", 95 | "model.add(layers.Conv1D(32, 7, activation='relu'))\n", 96 | "model.add(layers.GlobalMaxPooling1D())\n", 97 | "model.add(layers.Dense(1))\n", 98 | "\n", 99 | "model.summary()" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 5, 105 | "metadata": {}, 106 | "outputs": [ 107 | { 108 | "name": "stdout", 109 | "output_type": "stream", 110 | "text": [ 111 | "Train on 20000 samples, validate on 5000 samples\n", 112 | "Epoch 1/10\n", 113 | "20000/20000 [==============================] - 49s - loss: 1.1321 - acc: 0.4953 - val_loss: 0.7018 - val_acc: 0.4966\n", 114 | "Epoch 2/10\n", 115 | "20000/20000 [==============================] - 48s - loss: 0.6924 - acc: 0.5222 - val_loss: 0.6834 - val_acc: 0.5526\n", 116 | "Epoch 3/10\n", 117 | "20000/20000 [==============================] - 47s - loss: 0.6645 - acc: 0.6066 - val_loss: 0.6478 - val_acc: 0.6216\n", 118 | "Epoch 4/10\n", 119 | "20000/20000 [==============================] - 48s - loss: 0.5958 - acc: 0.7147 - val_loss: 0.5624 - val_acc: 0.7064\n", 120 | "Epoch 5/10\n", 121 | "20000/20000 [==============================] - 49s - loss: 0.4902 - acc: 0.7898 - val_loss: 0.4828 - val_acc: 0.8024\n", 122 | "Epoch 6/10\n", 123 | "20000/20000 [==============================] - 48s - loss: 0.4281 - acc: 0.8278 - val_loss: 0.4499 - val_acc: 0.8244\n", 124 | "Epoch 7/10\n", 125 | "20000/20000 [==============================] - 50s - loss: 0.3848 - acc: 0.8472 - val_loss: 0.4455 - val_acc: 0.8348\n", 126 | "Epoch 8/10\n", 127 | "20000/20000 [==============================] - 50s - loss: 0.3546 - acc: 0.8571 - val_loss: 0.4708 - val_acc: 0.8298\n", 128 | "Epoch 9/10\n", 129 | "20000/20000 [==============================] - 47s - loss: 0.3354 - acc: 0.8509 - val_loss: 0.4783 - val_acc: 0.8206\n", 130 | "Epoch 10/10\n", 131 | "20000/20000 [==============================] - 47s - loss: 0.3113 - acc: 0.8484 - val_loss: 0.4848 - val_acc: 0.8072\n" 132 | ] 133 | } 134 | ], 135 | "source": [ 136 | "model.compile(optimizer=RMSprop(lr=1e-4),\n", 137 | " loss='binary_crossentropy',\n", 138 | " metrics=['acc'])\n", 139 | "\n", 140 | "history = model.fit(x_train, y_train,\n", 141 | " epochs=10,\n", 142 | " batch_size=128,\n", 143 | " validation_split=0.2)" 144 | ] 145 | } 146 | ], 147 | "metadata": { 148 | "kernelspec": { 149 | "display_name": "Python 3", 150 | "language": "python", 151 | "name": "python3" 152 | }, 153 | "language_info": { 154 | "codemirror_mode": { 155 | "name": "ipython", 156 | "version": 3 157 | }, 158 | "file_extension": ".py", 159 | "mimetype": "text/x-python", 160 | "name": "python", 161 | "nbconvert_exporter": "python", 162 | "pygments_lexer": "ipython3", 163 | "version": "3.6.2" 164 | } 165 | }, 166 | "nbformat": 4, 167 | "nbformat_minor": 2 168 | } 169 | -------------------------------------------------------------------------------- /keras-tutorial/11-Training-Bi-LSTM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "from keras.models import Sequential\n", 12 | "from keras.layers import Embedding, Bidirectional, Dense, LSTM" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 8, 18 | "metadata": {}, 19 | "outputs": [ 20 | { 21 | "name": "stdout", 22 | "output_type": "stream", 23 | "text": [ 24 | "Loading data...\n", 25 | "25000 train sequences\n", 26 | "25000 test sequences\n", 27 | "Pad sequences (samples x time)\n", 28 | "x_train shape: (25000, 500)\n", 29 | "x_test shape: (25000, 500)\n" 30 | ] 31 | } 32 | ], 33 | "source": [ 34 | "from keras.datasets import imdb\n", 35 | "from keras.preprocessing import sequence\n", 36 | "\n", 37 | "max_features = 10000\n", 38 | "max_len = 500\n", 39 | "\n", 40 | "print('Loading data...')\n", 41 | "(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)\n", 42 | "print(len(x_train), 'train sequences')\n", 43 | "print(len(x_test), 'test sequences')\n", 44 | "\n", 45 | "print('Pad sequences (samples x time)')\n", 46 | "x_train = sequence.pad_sequences(x_train, maxlen=max_len)\n", 47 | "x_test = sequence.pad_sequences(x_test, maxlen=max_len)\n", 48 | "print('x_train shape:', x_train.shape)\n", 49 | "print('x_test shape:', x_test.shape)" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 10, 55 | "metadata": {}, 56 | "outputs": [ 57 | { 58 | "name": "stdout", 59 | "output_type": "stream", 60 | "text": [ 61 | "_________________________________________________________________\n", 62 | "Layer (type) Output Shape Param # \n", 63 | "=================================================================\n", 64 | "embedding_3 (Embedding) (None, None, 32) 320000 \n", 65 | "_________________________________________________________________\n", 66 | "bidirectional_2 (Bidirection (None, 64) 16640 \n", 67 | "_________________________________________________________________\n", 68 | "dense_2 (Dense) (None, 1) 65 \n", 69 | "=================================================================\n", 70 | "Total params: 336,705\n", 71 | "Trainable params: 336,705\n", 72 | "Non-trainable params: 0\n", 73 | "_________________________________________________________________\n" 74 | ] 75 | } 76 | ], 77 | "source": [ 78 | "model = Sequential()\n", 79 | "model.add(Embedding(max_features, 32))\n", 80 | "model.add(Bidirectional(LSTM(32)))\n", 81 | "model.add(Dense(1, activation='sigmoid'))\n", 82 | "model.summary()" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 11, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "name": "stdout", 92 | "output_type": "stream", 93 | "text": [ 94 | "Train on 20000 samples, validate on 5000 samples\n", 95 | "Epoch 1/10\n", 96 | "20000/20000 [==============================] - 251s - loss: 0.5790 - acc: 0.7067 - val_loss: 0.4655 - val_acc: 0.8106\n", 97 | "Epoch 2/10\n", 98 | "20000/20000 [==============================] - 265s - loss: 0.3593 - acc: 0.8550 - val_loss: 0.3152 - val_acc: 0.8716\n", 99 | "Epoch 3/10\n", 100 | "20000/20000 [==============================] - 260s - loss: 0.2634 - acc: 0.9006 - val_loss: 0.3007 - val_acc: 0.8694\n", 101 | "Epoch 4/10\n", 102 | "20000/20000 [==============================] - 265s - loss: 0.2183 - acc: 0.9202 - val_loss: 0.3953 - val_acc: 0.8248\n", 103 | "Epoch 5/10\n", 104 | "20000/20000 [==============================] - 266s - loss: 0.1924 - acc: 0.9289 - val_loss: 0.2863 - val_acc: 0.8862\n", 105 | "Epoch 6/10\n", 106 | "20000/20000 [==============================] - 276s - loss: 0.1672 - acc: 0.9390 - val_loss: 0.3041 - val_acc: 0.8824\n", 107 | "Epoch 7/10\n", 108 | "20000/20000 [==============================] - 264s - loss: 0.1526 - acc: 0.9464 - val_loss: 0.3222 - val_acc: 0.8636\n", 109 | "Epoch 8/10\n", 110 | "20000/20000 [==============================] - 244s - loss: 0.1403 - acc: 0.9511 - val_loss: 0.2982 - val_acc: 0.8840\n", 111 | "Epoch 9/10\n", 112 | "20000/20000 [==============================] - 236s - loss: 0.1226 - acc: 0.9583 - val_loss: 0.3643 - val_acc: 0.8766\n", 113 | "Epoch 10/10\n", 114 | "20000/20000 [==============================] - 259s - loss: 0.1170 - acc: 0.9592 - val_loss: 0.3206 - val_acc: 0.8734\n" 115 | ] 116 | } 117 | ], 118 | "source": [ 119 | "model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])\n", 120 | "\n", 121 | "history = model.fit(x_train, y_train,\n", 122 | " epochs=10,\n", 123 | " batch_size=128,\n", 124 | " validation_split=0.2)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 12, 130 | "metadata": {}, 131 | "outputs": [ 132 | { 133 | "data": { 134 | "image/png": "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\nTGgps5HQ5G8L4WxXZLdE9SNDgO5xx1IdqHhHMu1QYBGhLPtY4GRVvMnuMrNbCfcK3OLuS+KOpzpQ\n8Y6ISILoTF9EJEGyrky/VatW3r59+7jDEBGpUmbNmrXC3UtrIg1kYdJv3749ubm5cYchIlKlmFlZ\nd6UDKt4REUkUJX0RkQRR0hcRSZCsK9MvzpYtW8jLy+P777+POxQpRb169Wjbti21a5fUnYyIxK1K\nJP28vDwaN25M+/btCR03SrZxd1auXEleXh4dOnQoewURiUWVKN75/vvvadmypRJ+FjMzWrZsqasx\nkd0wYQK0bw81aoT3CRMqbltVIukDSvhVgH4jqWoqM9mWFsPIkfDFF+Ae3keOrLhYqkzSFxHJpMpO\ntiW59lrYsKHwtA0bwvSKoKSfhpUrV9KrVy969erF3nvvTZs2bXaMb968Oa3POPfcc/nkk09KXWbc\nuHFMiONUQySBKjvZlmRJCd3IlTR9T1WJitzymjAh/HBLlsD++8PNN8OI3X38BNCyZUs++OADAMaO\nHUujRo341a9+VWiZHQ8drlH8cfThhx8uczuXXHLJ7gcpIuVS2cm2JPvvH64yipteEardmX5lXrIt\nXLiQLl26MGLECLp27cpXX33FyJEjycnJoWvXrtx44407lj300EP54IMP2Lp1K82aNWPMmDH07NmT\nQw45hG+++QaA6667jrvuumvH8mPGjKFfv34cdNBBvP12eGDQd999x6mnnkqXLl047bTTyMnJ2XFA\nSnX99dfz4x//mG7dunHRRRdR0JvqggUL+MlPfkLPnj3p06cPixcvBuCWW26he/fu9OzZk2sr+1RH\nJAYlJdWKSrYluflmaNCg8LQGDcL0ilDtkn5lX7J9/PHHjB49mvnz59OmTRtuu+02cnNzmT17Nq+8\n8grz58/fZZ21a9dyxBFHMHv2bA455BDGjx9f7Ge7OzNmzOCPf/zjjgPIvffey9577838+fP5n//5\nH95///1i17388suZOXMmH374IWvXruXll18GYNiwYYwePZrZs2fz9ttvs9dee/H888/z0ksvMWPG\nDGbPns1VV12Vob0jkr0qO9mWZMQIeOABaNcOzML7Aw/sWelEadJK+mY22Mw+MbOFZjammPntzOw1\nM5tjZm+YWduUedvM7IPoNTmTwRensi/ZOnbsSE5Ozo7xiRMn0qdPH/r06cNHH31UbNKvX78+xx13\n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\n", 135 | "text/plain": [ 136 | "" 137 | ] 138 | }, 139 | "metadata": {}, 140 | "output_type": "display_data" 141 | }, 142 | { 143 | "data": { 144 | "image/png": "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\n", 145 | "text/plain": [ 146 | "" 147 | ] 148 | }, 149 | "metadata": {}, 150 | "output_type": "display_data" 151 | } 152 | ], 153 | "source": [ 154 | "import matplotlib.pyplot as plt\n", 155 | "\n", 156 | "acc = history.history['acc']\n", 157 | "val_acc = history.history['val_acc']\n", 158 | "loss = history.history['loss']\n", 159 | "val_loss = history.history['val_loss']\n", 160 | "\n", 161 | "epochs = range(1, len(acc) + 1)\n", 162 | "\n", 163 | "plt.plot(epochs, acc, 'bo', label='Training acc')\n", 164 | "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n", 165 | "plt.title('Training and validation accuracy')\n", 166 | "plt.legend()\n", 167 | "\n", 168 | "plt.figure()\n", 169 | "\n", 170 | "plt.plot(epochs, loss, 'bo', label='Training loss')\n", 171 | "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n", 172 | "plt.title('Training and validation loss')\n", 173 | "plt.legend()\n", 174 | "\n", 175 | "plt.show()" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": null, 181 | "metadata": { 182 | "collapsed": true 183 | }, 184 | "outputs": [], 185 | "source": [] 186 | } 187 | ], 188 | "metadata": { 189 | "kernelspec": { 190 | "display_name": "Python 3", 191 | "language": "python", 192 | "name": "python3" 193 | }, 194 | "language_info": { 195 | "codemirror_mode": { 196 | "name": "ipython", 197 | "version": 3 198 | }, 199 | "file_extension": ".py", 200 | "mimetype": "text/x-python", 201 | "name": "python", 202 | "nbconvert_exporter": "python", 203 | "pygments_lexer": "ipython3", 204 | "version": "3.6.2" 205 | } 206 | }, 207 | "nbformat": 4, 208 | "nbformat_minor": 2 209 | } 210 | --------------------------------------------------------------------------------