├── Examples.ipynb ├── Imagewoof from scratch.ipynb ├── LICENSE ├── Pretrained on ImageWoof.ipynb ├── README.md ├── efficientnet.py └── train.py /Examples.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Runs on ImageWoof dataset" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": {}, 16 | "outputs": [ 17 | { 18 | "name": "stdout", 19 | "output_type": "stream", 20 | "text": [ 21 | "lr: 0.003; eff_lr: 0.003; size: 300; alpha: 0.99; mom: 0.9; eps: 1e-06\n" 22 | ] 23 | }, 24 | { 25 | "data": { 26 | "text/html": [], 27 | "text/plain": [ 28 | "" 29 | ] 30 | }, 31 | "metadata": {}, 32 | "output_type": "display_data" 33 | }, 34 | { 35 | "name": "stdout", 36 | "output_type": "stream", 37 | "text": [ 38 | "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" 39 | ] 40 | }, 41 | { 42 | "data": { 43 | "image/png": "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\n", 44 | "text/plain": [ 45 | "
" 46 | ] 47 | }, 48 | "metadata": { 49 | "needs_background": "light" 50 | }, 51 | "output_type": "display_data" 52 | } 53 | ], 54 | "source": [ 55 | "\n", 56 | "%run train.py --woof 1 --size 300 --bs 32 --mixup 0 --epoch 5 --lr 3e-3 --arch 'efficientnetB3' --lrfinder 1\n" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "name": "stdout", 66 | "output_type": "stream", 67 | "text": [ 68 | "lr: 0.001; eff_lr: 0.001; size: 300; alpha: 0.99; mom: 0.9; eps: 1e-06\n" 69 | ] 70 | }, 71 | { 72 | "data": { 73 | "text/html": [ 74 | "\n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.4254572.2780510.1360000.59600002:55
12.2113192.1462100.2040000.70800002:55
22.0811412.0388900.2680000.80200002:55
31.9548451.9287650.3300000.84600002:55
41.8796871.8830100.3660000.84600002:55
" 128 | ], 129 | "text/plain": [ 130 | "" 131 | ] 132 | }, 133 | "metadata": {}, 134 | "output_type": "display_data" 135 | } 136 | ], 137 | "source": [ 138 | "\n", 139 | "%run train.py --woof 1 --size 300 --bs 32 --mixup 0 --epoch 5 --lr 1e-3 --arch 'efficientnetB3' \n" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 5, 145 | "metadata": {}, 146 | "outputs": [ 147 | { 148 | "name": "stdout", 149 | "output_type": "stream", 150 | "text": [ 151 | "lr: 0.001; eff_lr: 0.001; size: 224; alpha: 0.99; mom: 0.9; eps: 1e-06\n" 152 | ] 153 | }, 154 | { 155 | "data": { 156 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.3460462.3009280.1100000.56000000:55
12.2154812.1520910.2160000.71800000:54
22.0801962.0348560.2820000.79800000:54
31.9482251.8847090.3380000.82800000:54
41.8734701.8372160.3660000.85600000:54
" 211 | ], 212 | "text/plain": [ 213 | "" 214 | ] 215 | }, 216 | "metadata": {}, 217 | "output_type": "display_data" 218 | } 219 | ], 220 | "source": [ 221 | "\n", 222 | "%run train.py --woof 1 --size 224 --bs 64 --mixup 0 --epoch 5 --lr 1e-3 --arch 'efficientnetB0' \n" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": null, 228 | "metadata": {}, 229 | "outputs": [], 230 | "source": [] 231 | } 232 | ], 233 | "metadata": { 234 | "kernelspec": { 235 | "display_name": "Python 3", 236 | "language": "python", 237 | "name": "python3" 238 | }, 239 | "language_info": { 240 | "codemirror_mode": { 241 | "name": "ipython", 242 | "version": 3 243 | }, 244 | "file_extension": ".py", 245 | "mimetype": "text/x-python", 246 | "name": "python", 247 | "nbconvert_exporter": "python", 248 | "pygments_lexer": "ipython3", 249 | "version": "3.7.1" 250 | } 251 | }, 252 | "nbformat": 4, 253 | "nbformat_minor": 2 254 | } 255 | -------------------------------------------------------------------------------- /Imagewoof from scratch.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Training from scratch on Imagewoof with the efficientnet_pytorch repo" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "https://github.com/lukemelas/EfficientNet-PyTorch" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "name": "stdout", 24 | "output_type": "stream", 25 | "text": [ 26 | "Collecting efficientnet_pytorch\n", 27 | " Downloading https://files.pythonhosted.org/packages/06/ff/881afd965c46b11fc6f3c8316de9e08d37fc3b71056dbab861b76faee6ca/efficientnet_pytorch-0.1.0-py3-none-any.whl\n", 28 | "Requirement already satisfied: torch in /opt/conda/lib/python3.7/site-packages (from efficientnet_pytorch) (1.0.0)\n", 29 | "Installing collected packages: efficientnet-pytorch\n", 30 | "Successfully installed efficientnet-pytorch-0.1.0\n", 31 | "\u001b[33mYou are using pip version 10.0.1, however version 19.1.1 is available.\n", 32 | "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n" 33 | ] 34 | } 35 | ], 36 | "source": [ 37 | "!pip install efficientnet_pytorch" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 4, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "from fastai.script import *\n", 47 | "from fastai.vision import *\n", 48 | "from fastai.callbacks import *\n", 49 | "from fastai.distributed import *\n", 50 | "from fastprogress import fastprogress\n", 51 | "from torchvision.models import *\n", 52 | "from efficientnet_pytorch import EfficientNet\n", 53 | "import sys\n", 54 | "\n", 55 | "torch.backends.cudnn.benchmark = True\n", 56 | "fastprogress.MAX_COLS = 80\n", 57 | "\n", 58 | "def get_data(size, woof, bs, workers=None):\n", 59 | " if size<=128: path = URLs.IMAGEWOOF_160 if woof else URLs.IMAGENETTE_160\n", 60 | " elif size<=224: path = URLs.IMAGEWOOF_320 if woof else URLs.IMAGENETTE_320\n", 61 | " else : path = URLs.IMAGEWOOF if woof else URLs.IMAGENETTE\n", 62 | " path = untar_data(path)\n", 63 | "\n", 64 | " n_gpus = num_distrib() or 1\n", 65 | " if workers is None: workers = min(8, num_cpus()//n_gpus)\n", 66 | "\n", 67 | " return (ImageList.from_folder(path).split_by_folder(valid='val')\n", 68 | " .label_from_folder().transform(([flip_lr(p=0.5)], []), size=size)\n", 69 | " .databunch(bs=bs, num_workers=workers)\n", 70 | " .presize(size, scale=(0.35,1))\n", 71 | " .normalize(imagenet_stats))\n", 72 | "\n" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "Change image size and batch size below depending on model:" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 14, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "data = get_data(300,1,16) #240, bs=32 for B1, 300, bs=16 for B3" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 15, 94 | "metadata": {}, 95 | "outputs": [], 96 | "source": [ 97 | "opt_func = partial(optim.Adam, betas=(0.9,0.99), eps=1e-6)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "Pick model below:" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 33, 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [ 113 | "m = EfficientNet.from_name('efficientnet-b3')" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 34, 119 | "metadata": {}, 120 | "outputs": [], 121 | "source": [ 122 | "m._fc = nn.Linear(m._fc.in_features, out_features=10, bias=True)\n", 123 | "nn.init.kaiming_normal_(m._fc.weight);" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 35, 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [ 132 | "\n", 133 | "learn = (Learner(data, m, wd=1e-5, opt_func=opt_func,\n", 134 | " metrics=[accuracy,top_k_accuracy],\n", 135 | " bn_wd=False, true_wd=True,\n", 136 | " loss_func = LabelSmoothingCrossEntropy())\n", 137 | " )\n", 138 | " " 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 36, 144 | "metadata": {}, 145 | "outputs": [], 146 | "source": [ 147 | "mixup = 0\n", 148 | "if mixup: learn = learn.mixup(alpha=mixup)\n", 149 | "learn = learn.to_fp16(dynamic=True)\n", 150 | " \n", 151 | " \n" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": 10, 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "text/html": [], 162 | "text/plain": [ 163 | "" 164 | ] 165 | }, 166 | "metadata": {}, 167 | "output_type": "display_data" 168 | }, 169 | { 170 | "name": "stdout", 171 | "output_type": "stream", 172 | "text": [ 173 | "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" 174 | ] 175 | }, 176 | { 177 | "data": { 178 | "image/png": "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\n", 179 | "text/plain": [ 180 | "
" 181 | ] 182 | }, 183 | "metadata": { 184 | "needs_background": "light" 185 | }, 186 | "output_type": "display_data" 187 | } 188 | ], 189 | "source": [ 190 | "#B1\n", 191 | "learn.lr_find()\n", 192 | "learn.recorder.plot()" 193 | ] 194 | }, 195 | { 196 | "cell_type": "markdown", 197 | "metadata": {}, 198 | "source": [ 199 | "## 5 epochs B1 (xresnet50 gets ~ 62%; xresnet50 + self attention gets 67%)" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 9, 205 | "metadata": {}, 206 | "outputs": [ 207 | { 208 | "data": { 209 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.2430002.3057010.1000000.50000001:57
12.1167342.1529970.2480000.74200001:56
22.0290702.0065470.3100000.79000001:57
31.9578091.9236890.3600000.81200001:56
41.9300431.9213970.3680000.79400001:55
" 264 | ], 265 | "text/plain": [ 266 | "" 267 | ] 268 | }, 269 | "metadata": {}, 270 | "output_type": "display_data" 271 | } 272 | ], 273 | "source": [ 274 | "learn.fit_one_cycle(5, 1e-4, div_factor=10, pct_start=0.3)" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 15, 280 | "metadata": {}, 281 | "outputs": [ 282 | { 283 | "data": { 284 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.1150522.3627080.1000000.50000001:56
11.9551346.9124240.1760000.70200001:58
21.7874051.8315670.4480000.89400001:56
31.6574721.5483860.5260000.93600001:55
41.5593271.4478170.5780000.94600001:55
" 339 | ], 340 | "text/plain": [ 341 | "" 342 | ] 343 | }, 344 | "metadata": {}, 345 | "output_type": "display_data" 346 | } 347 | ], 348 | "source": [ 349 | "# restarted from scratch\n", 350 | "learn.fit_one_cycle(5, 1e-3, div_factor=10, pct_start=0.3)" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 21, 356 | "metadata": {}, 357 | "outputs": [ 358 | { 359 | "data": { 360 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.1660824.7656020.1000000.50200001:55
12.0789465.7777190.1580000.61600001:54
21.9760103.2232280.2140000.68800001:56
31.8469231.9058360.3100000.87800001:58
41.8084021.7176240.4440000.90400001:56
" 415 | ], 416 | "text/plain": [ 417 | "" 418 | ] 419 | }, 420 | "metadata": {}, 421 | "output_type": "display_data" 422 | } 423 | ], 424 | "source": [ 425 | "# restarted from scratch\n", 426 | "learn.fit_one_cycle(5, 5e-3, div_factor=10, pct_start=0.3)" 427 | ] 428 | }, 429 | { 430 | "cell_type": "markdown", 431 | "metadata": {}, 432 | "source": [ 433 | "## 80 epochs B1 (xresnet50 gets 89.9% on 256px)" 434 | ] 435 | }, 436 | { 437 | "cell_type": "code", 438 | "execution_count": 11, 439 | "metadata": {}, 440 | "outputs": [ 441 | { 442 | "data": { 443 | "text/html": [ 444 | "\n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | " \n", 640 | " \n", 641 | " \n", 642 | " \n", 643 | " \n", 644 | " \n", 645 | " \n", 646 | " \n", 647 | " \n", 648 | " \n", 649 | " \n", 650 | " \n", 651 | " \n", 652 | " \n", 653 | " \n", 654 | " \n", 655 | " \n", 656 | " \n", 657 | " \n", 658 | " \n", 659 | " \n", 660 | " \n", 661 | " \n", 662 | " \n", 663 | " \n", 664 | " \n", 665 | " \n", 666 | " \n", 667 | " \n", 668 | " \n", 669 | " \n", 670 | " \n", 671 | " \n", 672 | " \n", 673 | " \n", 674 | " \n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | " \n", 830 | " \n", 831 | " \n", 832 | " \n", 833 | " \n", 834 | " \n", 835 | " \n", 836 | " \n", 837 | " \n", 838 | " \n", 839 | " \n", 840 | " \n", 841 | " \n", 842 | " \n", 843 | " \n", 844 | " \n", 845 | " \n", 846 | " \n", 847 | " \n", 848 | " \n", 849 | " \n", 850 | " \n", 851 | " \n", 852 | " \n", 853 | " \n", 854 | " \n", 855 | " \n", 856 | " \n", 857 | " \n", 858 | " \n", 859 | " \n", 860 | " \n", 861 | " \n", 862 | " \n", 863 | " \n", 864 | " \n", 865 | " \n", 866 | " \n", 867 | " \n", 868 | " \n", 869 | " \n", 870 | " \n", 871 | " \n", 872 | " \n", 873 | " \n", 874 | " \n", 875 | " \n", 876 | " \n", 877 | " \n", 878 | " \n", 879 | " \n", 880 | " \n", 881 | " \n", 882 | " \n", 883 | " \n", 884 | " \n", 885 | " \n", 886 | " \n", 887 | " \n", 888 | " \n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | " \n", 972 | " \n", 973 | " \n", 974 | " \n", 975 | " \n", 976 | " \n", 977 | " \n", 978 | " \n", 979 | " \n", 980 | " \n", 981 | " \n", 982 | " \n", 983 | " \n", 984 | " \n", 985 | " \n", 986 | " \n", 987 | " \n", 988 | " \n", 989 | " \n", 990 | " \n", 991 | " \n", 992 | " \n", 993 | " \n", 994 | " \n", 995 | " \n", 996 | " \n", 997 | " \n", 998 | " \n", 999 | " \n", 1000 | " \n", 1001 | " \n", 1002 | " \n", 1003 | " \n", 1004 | " \n", 1005 | " \n", 1006 | " \n", 1007 | " \n", 1008 | " \n", 1009 | " \n", 1010 | " \n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.1844762.3117040.1000000.50000001:38
12.1035702.0550840.3220000.78200001:39
22.0193372.0181850.3200000.82200001:39
31.9769482.1576840.3160000.82600001:40
41.9026791.8773820.3960000.88000001:39
51.8650952.1331090.3660000.85800001:40
61.8079391.9293970.4100000.87600001:38
71.7787911.7039100.4740000.90800001:38
81.7293281.7396150.4620000.91800001:38
91.7006361.5910240.5260000.93400001:39
101.6799441.4771340.5960000.92000001:39
111.6263811.5047800.6100000.92200001:39
121.6034201.3738630.6120000.95200001:38
131.5555031.3307400.6360000.95800001:40
141.5239421.5662080.5720000.93800001:39
151.5107561.4729170.6120000.91600001:39
161.4630481.3547840.6100000.94400001:39
171.4342901.4068970.5940000.96400001:39
181.4114461.6764490.5220000.94400001:40
191.4101151.1852810.7120000.96800001:38
201.4029361.1397410.7320000.96600001:38
211.3449391.2115830.6860000.97400001:39
221.3524691.2579150.6960000.96400001:40
231.3542991.1190910.7300000.96800001:40
241.3160741.1632590.7140000.97600001:39
251.2980491.1635320.7140000.97600001:40
261.2944241.0850450.7520000.96600001:40
271.2715081.1074230.7400000.97400001:40
281.2656701.0028890.7820000.97600001:40
291.2304491.0240710.7820000.97600001:40
301.2112741.0389930.7880000.97400001:39
311.1908480.9551530.8140000.98400001:40
321.1893890.9978740.7940000.98000001:40
331.1994220.8991790.8280000.98400001:40
341.1480740.9553340.8000000.98600001:39
351.1519981.0476160.7980000.98600001:39
361.1489420.9845910.7780000.98400001:39
371.1391430.9381570.8260000.98600001:39
381.1246560.9604300.8140000.98200001:38
391.1148230.9134930.8180000.98400001:38
401.0946100.9022650.8360000.99200001:39
411.0738060.9405590.8140000.98800001:39
421.0682090.8973910.8260000.99600001:39
431.0985970.9288590.8200000.99200001:40
441.0730280.9513750.8180000.99000001:40
451.0530770.9050370.8260000.99600001:38
461.0382160.9340720.8340000.98800001:39
471.0256190.8658270.8380000.99200001:38
481.0247520.8890820.8400000.99000001:40
491.0288490.8797140.8440000.99000001:41
501.0155710.8690140.8500000.98600001:40
510.9766750.8954340.8400000.98800001:39
520.9987980.8928370.8420000.99200001:39
530.9914630.9439280.8420000.98400001:39
540.9547120.8585460.8500000.99000001:40
550.9746460.9579260.8360000.97400001:39
560.9735380.8855350.8520000.99000001:39
570.9580350.9371780.8560000.97200001:41
580.9308640.8739950.8660000.98600001:39
590.9358110.8893350.8460000.98600001:39
600.9057990.8878540.8480000.98600001:39
610.9284360.8865740.8520000.98800001:39
620.9133370.8997560.8600000.98600001:38
630.9171060.8537050.8660000.98800001:39
640.8993100.8603660.8680000.99000001:39
650.9210510.8699420.8700000.98200001:40
660.8950610.8623540.8620000.98400001:39
670.9176060.9048990.8480000.97400001:39
680.9230860.8812840.8620000.98200001:39
690.8742480.8742540.8600000.98400001:39
700.8983910.8608070.8700000.98200001:41
710.9016140.8569320.8600000.98400001:40
720.8985560.8680280.8660000.98200001:39
730.8862240.8528710.8680000.98200001:39
740.8931470.8596240.8660000.98600001:38
750.8823700.8649530.8640000.98200001:39
760.8763450.8618770.8660000.98400001:39
770.8771400.8622450.8700000.98400001:39
780.8806940.8630580.8660000.98400001:39
790.8810460.8633260.8660000.98400001:39
" 1098 | ], 1099 | "text/plain": [ 1100 | "" 1101 | ] 1102 | }, 1103 | "metadata": {}, 1104 | "output_type": "display_data" 1105 | } 1106 | ], 1107 | "source": [ 1108 | "# restarted from scratch, mixup =0.2\n", 1109 | "learn.fit_one_cycle(80, 1e-3, div_factor=10, pct_start=0.3)" 1110 | ] 1111 | }, 1112 | { 1113 | "cell_type": "markdown", 1114 | "metadata": {}, 1115 | "source": [ 1116 | "# 5 epochs B3" 1117 | ] 1118 | }, 1119 | { 1120 | "cell_type": "code", 1121 | "execution_count": 20, 1122 | "metadata": {}, 1123 | "outputs": [ 1124 | { 1125 | "data": { 1126 | "text/html": [], 1127 | "text/plain": [ 1128 | "" 1129 | ] 1130 | }, 1131 | "metadata": {}, 1132 | "output_type": "display_data" 1133 | }, 1134 | { 1135 | "name": "stdout", 1136 | "output_type": "stream", 1137 | "text": [ 1138 | "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" 1139 | ] 1140 | }, 1141 | { 1142 | "data": { 1143 | "image/png": "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\n", 1144 | "text/plain": [ 1145 | "
" 1146 | ] 1147 | }, 1148 | "metadata": { 1149 | "needs_background": "light" 1150 | }, 1151 | "output_type": "display_data" 1152 | } 1153 | ], 1154 | "source": [ 1155 | "learn.lr_find()\n", 1156 | "learn.recorder.plot()" 1157 | ] 1158 | }, 1159 | { 1160 | "cell_type": "code", 1161 | "execution_count": 21, 1162 | "metadata": {}, 1163 | "outputs": [ 1164 | { 1165 | "data": { 1166 | "text/html": [ 1167 | "\n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.2036452.2318690.1820000.64200003:38
12.0791882.1540680.2760000.72800003:39
21.9158071.8419700.4040000.84800003:39
31.8107111.7144420.4500000.86600003:39
41.7166741.6681850.4760000.87600003:37
" 1221 | ], 1222 | "text/plain": [ 1223 | "" 1224 | ] 1225 | }, 1226 | "metadata": {}, 1227 | "output_type": "display_data" 1228 | } 1229 | ], 1230 | "source": [ 1231 | "learn.fit_one_cycle(5, 1e-4, div_factor=10, pct_start=0.3)" 1232 | ] 1233 | }, 1234 | { 1235 | "cell_type": "code", 1236 | "execution_count": 27, 1237 | "metadata": {}, 1238 | "outputs": [ 1239 | { 1240 | "data": { 1241 | "text/html": [ 1242 | "\n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | " \n", 1287 | " \n", 1288 | " \n", 1289 | " \n", 1290 | " \n", 1291 | " \n", 1292 | " \n", 1293 | " \n", 1294 | " \n", 1295 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.1644519.3963870.1540000.60800003:38
12.0468088.0890100.1200000.64800003:38
21.9492581.9184080.3300000.87400003:37
31.8545801.7827760.3960000.87800003:39
41.7773211.7114880.4600000.88800003:38
" 1296 | ], 1297 | "text/plain": [ 1298 | "" 1299 | ] 1300 | }, 1301 | "metadata": {}, 1302 | "output_type": "display_data" 1303 | } 1304 | ], 1305 | "source": [ 1306 | "#restart\n", 1307 | "learn.fit_one_cycle(5, 1e-3, div_factor=10, pct_start=0.3)" 1308 | ] 1309 | }, 1310 | { 1311 | "cell_type": "code", 1312 | "execution_count": 37, 1313 | "metadata": {}, 1314 | "outputs": [ 1315 | { 1316 | "data": { 1317 | "text/html": [ 1318 | "\n", 1319 | " \n", 1320 | " \n", 1321 | " \n", 1322 | " \n", 1323 | " \n", 1324 | " \n", 1325 | " \n", 1326 | " \n", 1327 | " \n", 1328 | " \n", 1329 | " \n", 1330 | " \n", 1331 | " \n", 1332 | " \n", 1333 | " \n", 1334 | " \n", 1335 | " \n", 1336 | " \n", 1337 | " \n", 1338 | " \n", 1339 | " \n", 1340 | " \n", 1341 | " \n", 1342 | " \n", 1343 | " \n", 1344 | " \n", 1345 | " \n", 1346 | " \n", 1347 | " \n", 1348 | " \n", 1349 | " \n", 1350 | " \n", 1351 | " \n", 1352 | " \n", 1353 | " \n", 1354 | " \n", 1355 | " \n", 1356 | " \n", 1357 | " \n", 1358 | " \n", 1359 | " \n", 1360 | " \n", 1361 | " \n", 1362 | " \n", 1363 | " \n", 1364 | " \n", 1365 | " \n", 1366 | " \n", 1367 | " \n", 1368 | " \n", 1369 | " \n", 1370 | " \n", 1371 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
02.2209252.1885930.2020000.66200003:39
12.1220362.1705640.2320000.73400003:39
22.0377242.0309750.2840000.79600003:39
31.9395141.9340670.3560000.80800003:39
41.9048111.9047350.3660000.82000003:38
" 1372 | ], 1373 | "text/plain": [ 1374 | "" 1375 | ] 1376 | }, 1377 | "metadata": {}, 1378 | "output_type": "display_data" 1379 | } 1380 | ], 1381 | "source": [ 1382 | "#restart\n", 1383 | "learn.fit_one_cycle(5, 5e-5, div_factor=10, pct_start=0.3)" 1384 | ] 1385 | }, 1386 | { 1387 | "cell_type": "code", 1388 | "execution_count": null, 1389 | "metadata": {}, 1390 | "outputs": [], 1391 | "source": [] 1392 | } 1393 | ], 1394 | "metadata": { 1395 | "kernelspec": { 1396 | "display_name": "Python 3", 1397 | "language": "python", 1398 | "name": "python3" 1399 | }, 1400 | "language_info": { 1401 | "codemirror_mode": { 1402 | "name": "ipython", 1403 | "version": 3 1404 | }, 1405 | "file_extension": ".py", 1406 | "mimetype": "text/x-python", 1407 | "name": "python", 1408 | "nbconvert_exporter": "python", 1409 | "pygments_lexer": "ipython3", 1410 | "version": "3.7.1" 1411 | } 1412 | }, 1413 | "nbformat": 4, 1414 | "nbformat_minor": 2 1415 | } 1416 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Pretrained on ImageWoof.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from torch.utils import model_zoo\n", 10 | "from efficientnet import *\n", 11 | "import collections\n", 12 | "from torch import nn\n", 13 | "from fastai.script import *\n", 14 | "from fastai.vision import *\n", 15 | "from fastai.callbacks import *\n", 16 | "from fastai.distributed import *\n", 17 | "from fastprogress import fastprogress\n", 18 | "import torchvision.models as models\n" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "def get_data(size, woof, bs, workers=None):\n", 28 | " if size<=128: path = URLs.IMAGEWOOF_160 if woof else URLs.IMAGENETTE_160\n", 29 | " elif size<=224: path = URLs.IMAGEWOOF_320 if woof else URLs.IMAGENETTE_320\n", 30 | " else : path = URLs.IMAGEWOOF if woof else URLs.IMAGENETTE\n", 31 | " path = untar_data(path)\n", 32 | "\n", 33 | " n_gpus = num_distrib() or 1\n", 34 | " if workers is None: workers = min(8, num_cpus()//n_gpus)\n", 35 | "\n", 36 | " return (ImageList.from_folder(path).split_by_folder(valid='val')\n", 37 | " .label_from_folder().transform(([flip_lr(p=0.5)], []), size=size)\n", 38 | " .databunch(bs=bs, num_workers=workers)\n", 39 | " .presize(size, scale=(0.35,1))\n", 40 | " .normalize(imagenet_stats))" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [ 49 | "data = get_data(size=300, woof=1, bs=16)\n", 50 | "opt_func = partial(optim.Adam, betas=(0.9,0.99), eps=1e-6)" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "metadata": {}, 56 | "source": [ 57 | "# Efficient Net Transfer Learning" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 12, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "# from https://github.com/lukemelas/EfficientNet-PyTorch - Thank you!\n", 67 | "url_map = {\n", 68 | " 'efficientnetB0': 'http://storage.googleapis.com/public-models/efficientnet-b0-08094119.pth',\n", 69 | " 'efficientnetB1': 'http://storage.googleapis.com/public-models/efficientnet-b1-dbc7070a.pth',\n", 70 | " 'efficientnetB2': 'http://storage.googleapis.com/public-models/efficientnet-b2-27687264.pth',\n", 71 | " 'efficientnetB3': 'http://storage.googleapis.com/public-models/efficientnet-b3-c8376fa2.pth',\n", 72 | "}" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "Note the default resolution for each model\n", 80 | "\n", 81 | "(width_coefficient, depth_coefficient, resolution, dropout_rate)\n", 82 | "\n", 83 | " 'efficientnet-b0': (1.0, 1.0, 224, 0.2),\n", 84 | " 'efficientnet-b1': (1.0, 1.1, 240, 0.2),\n", 85 | " 'efficientnet-b2': (1.1, 1.2, 260, 0.3),\n", 86 | " 'efficientnet-b3': (1.2, 1.4, 300, 0.3),\n", 87 | " 'efficientnet-b4': (1.4, 1.8, 380, 0.4),\n", 88 | " 'efficientnet-b5': (1.6, 2.2, 456, 0.4),\n", 89 | " 'efficientnet-b6': (1.8, 2.6, 528, 0.5),\n", 90 | " 'efficientnet-b7': (2.0, 3.1, 600, 0.5)," 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": 24, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "name = 'efficientnetB3'\n", 100 | "m = globals()[name]()" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 25, 106 | "metadata": {}, 107 | "outputs": [], 108 | "source": [ 109 | "#load pretrained weights\n", 110 | "# layers are named differently\n", 111 | "state_dict_load = model_zoo.load_url(url_map[name])\n", 112 | "keys_new=list(state_dict_load)\n", 113 | "keys_curr = list(m.state_dict())\n", 114 | "\n", 115 | "state_dict_combined = collections.OrderedDict()\n", 116 | "\n", 117 | "for i in range(len(keys_new)):\n", 118 | " state_dict_combined[keys_curr[i]] = state_dict_load[keys_new[i]]\n", 119 | "\n", 120 | " \n", 121 | "m.load_state_dict(state_dict_combined)" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 26, 127 | "metadata": {}, 128 | "outputs": [], 129 | "source": [ 130 | "# change the last FC layer\n", 131 | "c_out = 10\n", 132 | "m[-1] = nn.Linear(m[-1].in_features,c_out)" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 27, 145 | "metadata": {}, 146 | "outputs": [], 147 | "source": [ 148 | "learn = Learner(data, m, wd=1e-5, opt_func=opt_func,metrics=[accuracy,top_k_accuracy],\n", 149 | " bn_wd=False, true_wd=True,\n", 150 | " loss_func = LabelSmoothingCrossEntropy())" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 28, 156 | "metadata": {}, 157 | "outputs": [], 158 | "source": [ 159 | "learn.model;" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 29, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "learn.layer_groups;" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 30, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [ 177 | "# Pick a layer to freeze the model to\n", 178 | "# cf learn.layer_groups\n", 179 | "# will differ depending on which model you use\n", 180 | "\n", 181 | "learn.freeze_to(139) " 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 32, 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "data": { 191 | "text/html": [], 192 | "text/plain": [ 193 | "" 194 | ] 195 | }, 196 | "metadata": {}, 197 | "output_type": "display_data" 198 | }, 199 | { 200 | "name": "stdout", 201 | "output_type": "stream", 202 | "text": [ 203 | "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" 204 | ] 205 | }, 206 | { 207 | "data": { 208 | "image/png": "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\n", 209 | "text/plain": [ 210 | "
" 211 | ] 212 | }, 213 | "metadata": { 214 | "needs_background": "light" 215 | }, 216 | "output_type": "display_data" 217 | } 218 | ], 219 | "source": [ 220 | "learn.lr_find(wd=1e-5)\n", 221 | "learn.recorder.plot()" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 33, 227 | "metadata": {}, 228 | "outputs": [ 229 | { 230 | "data": { 231 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
01.1393331.7084080.3960000.90800002:09
11.1824511.7386080.4940000.88600002:09
21.1072181.2412320.6800000.97200002:10
30.9724690.8656670.8480000.99800002:09
40.9182140.8161040.8640000.99800002:10
" 286 | ], 287 | "text/plain": [ 288 | "" 289 | ] 290 | }, 291 | "metadata": {}, 292 | "output_type": "display_data" 293 | } 294 | ], 295 | "source": [ 296 | "learn.fit_one_cycle(5, 5e-2,wd=1e-5, div_factor=10, pct_start=0.3)" 297 | ] 298 | }, 299 | { 300 | "cell_type": "markdown", 301 | "metadata": {}, 302 | "source": [ 303 | "# Resnet 152 baseline" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 8, 309 | "metadata": {}, 310 | "outputs": [], 311 | "source": [ 312 | "learn = cnn_learner(data, models.resnet152, metrics=[accuracy,top_k_accuracy],loss_func = LabelSmoothingCrossEntropy())" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 9, 318 | "metadata": {}, 319 | "outputs": [], 320 | "source": [ 321 | "learn.freeze()" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 6, 327 | "metadata": {}, 328 | "outputs": [ 329 | { 330 | "data": { 331 | "text/html": [], 332 | "text/plain": [ 333 | "" 334 | ] 335 | }, 336 | "metadata": {}, 337 | "output_type": "display_data" 338 | }, 339 | { 340 | "name": "stdout", 341 | "output_type": "stream", 342 | "text": [ 343 | "LR Finder is complete, type {learner_name}.recorder.plot() to see the graph.\n" 344 | ] 345 | }, 346 | { 347 | "data": { 348 | "image/png": "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\n", 349 | "text/plain": [ 350 | "
" 351 | ] 352 | }, 353 | "metadata": { 354 | "needs_background": "light" 355 | }, 356 | "output_type": "display_data" 357 | } 358 | ], 359 | "source": [ 360 | "learn.lr_find(wd=1e-2)\n", 361 | "learn.recorder.plot()" 362 | ] 363 | }, 364 | { 365 | "cell_type": "code", 366 | "execution_count": 7, 367 | "metadata": {}, 368 | "outputs": [ 369 | { 370 | "data": { 371 | "text/html": [ 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 | "
epochtrain_lossvalid_lossaccuracytop_k_accuracytime
00.8666130.9000080.8400000.99200003:10
10.9194140.8166540.8900000.98600003:09
20.8312100.7214640.9080000.99600003:08
30.7264210.6758390.9320001.00000003:08
40.6897860.6865000.9300000.99800003:09
" 426 | ], 427 | "text/plain": [ 428 | "" 429 | ] 430 | }, 431 | "metadata": {}, 432 | "output_type": "display_data" 433 | } 434 | ], 435 | "source": [ 436 | "learn.fit_one_cycle(5, 3e-3,wd=1e-2, div_factor=10, pct_start=0.3)" 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": {}, 443 | "outputs": [], 444 | "source": [] 445 | } 446 | ], 447 | "metadata": { 448 | "kernelspec": { 449 | "display_name": "Python 3", 450 | "language": "python", 451 | "name": "python3" 452 | }, 453 | "language_info": { 454 | "codemirror_mode": { 455 | "name": "ipython", 456 | "version": 3 457 | }, 458 | "file_extension": ".py", 459 | "mimetype": "text/x-python", 460 | "name": "python", 461 | "nbconvert_exporter": "python", 462 | "pygments_lexer": "ipython3", 463 | "version": "3.7.1" 464 | } 465 | }, 466 | "nbformat": 4, 467 | "nbformat_minor": 2 468 | } 469 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EfficientNet (Working but not validated) 2 | The objective of this repository is to convert EfficientNet to Pytorch for use with fastai. 3 | 4 | This is still work in progress. We currently have a functioning attempt at replicating EfficientNet-B0 to EfficientNet-B7, which still needs to be validated and tested. 5 | -------------------------------------------------------------------------------- /efficientnet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch,math,sys 3 | import torch.utils.model_zoo as model_zoo 4 | from functools import partial 5 | import torch.nn.functional as F 6 | 7 | 8 | 9 | __all__ = ['EfficientNet', 'efficientnetB0','efficientnetB1', 'efficientnetB2', 'efficientnetB3', 'efficientnetB4', 'efficientnetB5', 'efficientnetB6', 'efficientnetB7'] 10 | 11 | class Swish(nn.Module): 12 | def forward(self, x): 13 | x = x * torch.sigmoid(x) #nn.functional.sigmoid is deprecated, use torch.sigmoid instead 14 | return x 15 | 16 | act_fn = Swish() #nn.ReLU(inplace=True) 17 | 18 | 19 | #from https://github.com/lukemelas/EfficientNet-PyTorch/blob/master/efficientnet_pytorch/utils.py 20 | class Conv2dSamePadding(nn.Conv2d): 21 | """ 2D Convolutions like TensorFlow """ 22 | def __init__(self, in_channels, out_channels, kernel_size, stride=1, dilation=1, groups=1, bias=True): 23 | super().__init__(in_channels, out_channels, kernel_size, stride, 0, dilation, groups, bias) 24 | self.stride = self.stride if len(self.stride) == 2 else [self.stride[0]]*2 25 | 26 | def forward(self, x): 27 | ih, iw = x.size()[-2:] 28 | kh, kw = self.weight.size()[-2:] 29 | sh, sw = self.stride 30 | oh, ow = math.ceil(ih / sh), math.ceil(iw / sw) 31 | pad_h = max((oh - 1) * self.stride[0] + (kh - 1) * self.dilation[0] + 1 - ih, 0) 32 | pad_w = max((ow - 1) * self.stride[1] + (kw - 1) * self.dilation[1] + 1 - iw, 0) 33 | if pad_h > 0 or pad_w > 0: 34 | x = F.pad(x, [pad_w//2, pad_w - pad_w//2, pad_h//2, pad_h - pad_h//2]) 35 | return F.conv2d(x, self.weight, self.bias, self.stride, self.padding, self.dilation, self.groups) 36 | 37 | #added groups, needed for DWConv 38 | #"The configuration when groups == in_channels and out_channels = K * in_channels where K is a positive integer is termed in literature as depthwise convolution." 39 | 40 | 41 | # gotta pick one of the returns for 'same' padding or a simpler ks//2 padding 42 | def conv(ni, nf, ks=3, stride=1, groups=1, bias=False): 43 | #return nn.Conv2d(ni, nf, kernel_size=ks, stride=stride, padding=ks//2, groups= groups, bias=bias) 44 | return Conv2dSamePadding(ni, nf, kernel_size=ks, stride=stride, groups= groups, bias=bias) 45 | 46 | 47 | #class noop(nn.Module): 48 | # def __init__(self): 49 | # super().__init__() 50 | # def forward(self,x): return x 51 | 52 | def noop(x): return x 53 | 54 | def init_cnn(m): 55 | if getattr(m, 'bias', None) is not None: nn.init.constant_(m.bias, 0) 56 | if isinstance(m, (nn.Conv2d,nn.Linear)): nn.init.kaiming_normal_(m.weight) 57 | for l in m.children(): init_cnn(l) 58 | 59 | 60 | # not compatible with fp16 training 61 | class Drop_Connect(nn.Module): 62 | """create a tensor mask and apply to inputs, for removing drop_ratio % of weights""" 63 | def __init__(self, drop_ratio=0): 64 | super().__init__() 65 | self.keep_percent = 1.0 - drop_ratio 66 | 67 | def forward(self, x): 68 | if not self.training: 69 | return x 70 | 71 | batch_size = x.size(0) 72 | random_tensor = self.keep_percent 73 | random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=x.dtype,device=x.device) #dtype is causing issues with fp16 training 74 | binary_tensor = torch.floor(random_tensor) 75 | output = x / self.keep_percent * binary_tensor 76 | 77 | return output 78 | 79 | 80 | def drop_connect(inputs, p, training): 81 | """ Drop connect. """ 82 | if not training: return inputs 83 | batch_size = inputs.shape[0] 84 | keep_prob = 1 - p 85 | random_tensor = keep_prob 86 | random_tensor += torch.rand([batch_size, 1, 1, 1], dtype=inputs.dtype,device=inputs.device) # uniform [0,1) 87 | binary_tensor = torch.floor(random_tensor) 88 | output = inputs / keep_prob * binary_tensor 89 | return output 90 | 91 | 92 | #added groups, needed for DWConv 93 | #fixed batch norm momentum = 1- Tensorflow value 94 | def conv_layer(ni, nf, ks=3, stride=1,groups=1, zero_bn=False, act=True, eps=1e-03, momentum=0.01): 95 | bn = nn.BatchNorm2d(nf, eps=eps, momentum=momentum) 96 | nn.init.constant_(bn.weight, 0. if zero_bn else 1.) 97 | layers = [conv(ni, nf, ks, stride=stride, groups=groups), bn] 98 | if act: layers.append(act_fn) 99 | return nn.Sequential(*layers) 100 | 101 | 102 | 103 | class SqueezeEx(nn.Module): 104 | def __init__(self, ni, ns): 105 | super().__init__() 106 | 107 | 108 | ns = max(1, int(ns)) 109 | 110 | layers = [nn.AdaptiveAvgPool2d(1), 111 | conv(ni,ns,ks=1,bias=True), 112 | act_fn, 113 | conv(ns,ni,ks=1,bias=True), 114 | nn.Sigmoid()] 115 | 116 | 117 | self.layers = nn.Sequential(*layers) 118 | 119 | def forward(self, x): 120 | 121 | return x * self.layers(x) 122 | 123 | 124 | 125 | 126 | class MBConv(nn.Module): 127 | def __init__(self, ni, nf, expand_ratio, ks=3, stride=2, se = None, skip=True, drop_connect_rate=None): 128 | super().__init__() 129 | 130 | 131 | 132 | self.drop_connect_rate = drop_connect_rate 133 | # Expansion (only if expand ratio>1) 134 | 135 | ne = ni*expand_ratio 136 | self.conv_exp = noop if ni==ne else conv_layer(ni, ne, ks=1) 137 | 138 | # Depthwise Convolution (implemented using 'groups') 139 | # This is where ks and stride get used 140 | #"The configuration when groups == in_channels and out_channels = K * in_channels 141 | # where K is a positive integer is termed in literature as depthwise convolution." 142 | # depth_multiplier=1 is default in original TF code so we keep the same number of channels 143 | 144 | self.dw_conv = conv_layer(ne, ne, ks=ks, stride= stride, groups=ne) 145 | 146 | 147 | # Squeeze and Excitation (if se ratio is specified) 148 | # se ratio applies to ni and not ne 149 | 150 | 151 | self.se = SqueezeEx(ne, ni*se) if se else noop 152 | 153 | # Output Conv (no relu) 154 | 155 | self.conv_out = conv_layer(ne, nf, ks=1, act=False) 156 | 157 | 158 | 159 | # add skip connection or not 160 | self.skip = skip and stride==1 and ni==nf 161 | 162 | # Drop connect 163 | 164 | #self.dc = Drop_Connect(drop_connect_rate) if drop_connect_rate else noop 165 | 166 | 167 | 168 | def forward(self, x): 169 | 170 | self.dc = partial(drop_connect,p=self.drop_connect_rate, training=self.training) if self.drop_connect_rate else noop 171 | 172 | out = self.conv_out(self.se(self.dw_conv(self.conv_exp(x)))) 173 | if self.skip: out = self.dc(out) + x 174 | 175 | 176 | return out 177 | 178 | 179 | 180 | class Flatten(nn.Module): 181 | def forward(self, x): return x.view(x.size(0), -1) 182 | 183 | class EfficientNet(nn.Sequential): 184 | def __init__(self, channels, repeat, ks, stride, expand, w_mult=1.0, d_mult=1.0, se = None, drop_connect_rate = None,dropout_rate= None, c_in=3, c_out=1000): 185 | 186 | 187 | repeat = [int(math.ceil(r*d_mult)) for r in repeat] 188 | channels = round_filters(channels, w_mult) 189 | 190 | 191 | stem = [conv_layer(c_in, channels[0], ks=3 ,stride=2)] 192 | 193 | blocks = [] 194 | #The first block needs to take care of stride and filter size increase. 195 | 196 | for i in range(len(repeat)): 197 | blocks+= [MBConv(channels[i], channels[i+1], expand[i], ks=ks[i], stride=stride[i], se = se, drop_connect_rate=drop_connect_rate)] 198 | blocks+= [MBConv(channels[i+1], channels[i+1], expand[i], ks=ks[i], stride=1, se = se, drop_connect_rate=drop_connect_rate)] *(repeat[i]-1) 199 | 200 | dropout = nn.Dropout(p=dropout_rate) if dropout_rate else noop 201 | 202 | head = [conv_layer(channels[-2], channels[-1], ks=1 ,stride=1), nn.AdaptiveAvgPool2d(1), Flatten(), dropout, nn.Linear(channels[-1], c_out)] 203 | 204 | 205 | super().__init__(*stem,*blocks, *head) 206 | 207 | init_cnn(self) 208 | 209 | 210 | 211 | 212 | def round_filters(filters, d_mult, divisor=8, min_depth=None): 213 | """ Calculate and round number of filters based on depth multiplier. """ 214 | 215 | if not d_mult: 216 | return filters 217 | 218 | filters = [f*d_mult for f in filters] 219 | min_depth = min_depth or divisor 220 | new_filters = [max(min_depth, int(f + divisor / 2) // divisor * divisor) for f in filters] 221 | # prevent rounding by more than 10% 222 | new_filters = [new_filters[i] + (new_filters[i] < 0.9 * filters[i])* divisor for i in range(len(new_filters))] 223 | new_filters = [int(f) for f in new_filters] 224 | return new_filters 225 | 226 | 227 | me = sys.modules[__name__] 228 | c = [32,16,24,40,80,112,192,320,1280] 229 | r = [1,2,2,3,3,4,1] 230 | ks = [3,3,5,3,5,5,3] 231 | str = [1,2,2,2,1,2,1] 232 | exp = [1,6,6,6,6,6,6] 233 | se = 0.25 234 | do = 0.2 235 | dc=0.2 236 | 237 | 238 | # base without multipliers and dropout 239 | setattr(me, 'efficientnet', partial(EfficientNet, channels=c, repeat=r, ks=ks, stride=str, expand=exp, se=se, drop_connect_rate=dc)) 240 | 241 | # (number, width_coefficient, depth_coefficient, dropout_rate) 242 | for n, wm, dm, do in [ 243 | [ 0, 1.0, 1.0, 0.2], 244 | [ 1, 1.0, 1.1, 0.2], 245 | [ 2, 1.1, 1.2, 0.3], 246 | [ 3, 1.2, 1.4, 0.3], 247 | [ 4, 1.4, 1.8, 0.4], 248 | [ 5, 1.6, 2.2, 0.4], 249 | [ 6, 1.8, 2.6, 0.5], 250 | [ 7, 2.0, 3.1, 0.5], 251 | ]: 252 | name = f'efficientnetB{n}' 253 | setattr(me, name, partial(efficientnet, d_mult=dm, w_mult=wm, dropout_rate=do)) 254 | 255 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | from fastai.script import * 2 | from fastai.vision import * 3 | from fastai.callbacks import * 4 | from fastai.distributed import * 5 | from fastprogress import fastprogress 6 | from torchvision.models import * 7 | from efficientnet import * 8 | import sys 9 | 10 | torch.backends.cudnn.benchmark = True 11 | fastprogress.MAX_COLS = 80 12 | 13 | def get_data(size, woof, bs, workers=None): 14 | if size<=128: path = URLs.IMAGEWOOF_160 if woof else URLs.IMAGENETTE_160 15 | elif size<=224: path = URLs.IMAGEWOOF_320 if woof else URLs.IMAGENETTE_320 16 | else : path = URLs.IMAGEWOOF if woof else URLs.IMAGENETTE 17 | path = untar_data(path) 18 | 19 | n_gpus = num_distrib() or 1 20 | if workers is None: workers = min(8, num_cpus()//n_gpus) 21 | 22 | return (ImageList.from_folder(path).split_by_folder(valid='val') 23 | .label_from_folder().transform(([flip_lr(p=0.5)], []), size=size) 24 | .databunch(bs=bs, num_workers=workers) 25 | .presize(size, scale=(0.35,1)) 26 | .normalize(imagenet_stats)) 27 | 28 | @call_parse 29 | def main( 30 | gpu:Param("GPU to run on", str)=None, 31 | woof: Param("Use imagewoof (otherwise imagenette)", int)=0, 32 | lr: Param("Learning rate", float)=1e-3, 33 | size: Param("Size (px: 128,192,224)", int)=128, 34 | alpha: Param("Alpha", float)=0.99, 35 | mom: Param("Momentum", float)=0.9, 36 | eps: Param("epsilon", float)=1e-6, 37 | epochs: Param("Number of epochs", int)=5, 38 | bs: Param("Batch size", int)=256, 39 | mixup: Param("Mixup", float)=0., 40 | opt: Param("Optimizer (adam,rms,sgd)", str)='adam', 41 | arch: Param("Architecture (efficientnetB0)", str)='efficientnetB0', 42 | #sa: Param("Self-attention", int)=0, 43 | #sym: Param("Symmetry for self-attention", int)=0, 44 | dump: Param("Print model; don't train", int)=0, 45 | lrfinder: Param("Run learning rate finder; don't train", int)=0, 46 | wd: Param("weight decay", float)=1e-5, 47 | ): 48 | "Distributed training of Imagenette." 49 | 50 | 51 | bs_one_gpu = bs 52 | gpu = setup_distrib(gpu) 53 | if gpu is None: bs *= torch.cuda.device_count() 54 | if opt=='adam' : opt_func = partial(optim.Adam, betas=(mom,alpha), eps=eps) 55 | elif opt=='rms' : opt_func = partial(optim.RMSprop, alpha=alpha, eps=eps) 56 | elif opt=='sgd' : opt_func = partial(optim.SGD, momentum=mom) 57 | 58 | data = get_data(size, woof, bs) 59 | bs_rat = bs/bs_one_gpu #originally bs/256 60 | if gpu is not None: bs_rat *= num_distrib() 61 | if not gpu: print(f'lr: {lr}; eff_lr: {lr*bs_rat}; size: {size}; alpha: {alpha}; mom: {mom}; eps: {eps}') 62 | lr *= bs_rat 63 | 64 | m = globals()[arch] 65 | learn = (Learner(data, m(c_out=10), wd=wd, opt_func=opt_func, 66 | metrics=[accuracy,top_k_accuracy], 67 | bn_wd=False, true_wd=True, 68 | loss_func = LabelSmoothingCrossEntropy()) 69 | ) 70 | if dump: print(learn.model); sys.exit() 71 | if mixup: learn = learn.mixup(alpha=mixup) 72 | learn = learn.to_fp16(dynamic=True) 73 | if gpu is None: learn.to_parallel() 74 | elif num_distrib()>1: learn.to_distributed(gpu) # Requires `-m fastai.launch` 75 | 76 | if lrfinder: 77 | # run learning rate finder 78 | 79 | learn.lr_find(wd=wd) 80 | learn.recorder.plot() 81 | else: 82 | learn.fit_one_cycle(epochs, lr, div_factor=10, pct_start=0.3) 83 | --------------------------------------------------------------------------------