Brian Sigafoos commited on
Commit
be10678
1 Parent(s): d3fee11

More clean up

Browse files
Files changed (1) hide show
  1. model.ipynb +40 -537
model.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 2,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
@@ -14,7 +14,7 @@
14
  },
15
  {
16
  "cell_type": "code",
17
- "execution_count": 3,
18
  "metadata": {},
19
  "outputs": [],
20
  "source": [
@@ -24,20 +24,9 @@
24
  },
25
  {
26
  "cell_type": "code",
27
- "execution_count": 4,
28
  "metadata": {},
29
- "outputs": [
30
- {
31
- "data": {
32
- "text/plain": [
33
- "10"
34
- ]
35
- },
36
- "execution_count": 4,
37
- "metadata": {},
38
- "output_type": "execute_result"
39
- }
40
- ],
41
  "source": [
42
  "ims = search_images_ddg('gingko biloba tree leaf', max_images=10)\n",
43
  "len(ims)"
@@ -45,64 +34,9 @@
45
  },
46
  {
47
  "cell_type": "code",
48
- "execution_count": 5,
49
  "metadata": {},
50
- "outputs": [
51
- {
52
- "data": {
53
- "text/html": [
54
- "\n",
55
- "<style>\n",
56
- " /* Turns off some styling */\n",
57
- " progress {\n",
58
- " /* gets rid of default border in Firefox and Opera. */\n",
59
- " border: none;\n",
60
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
61
- " background-size: auto;\n",
62
- " }\n",
63
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
64
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
65
- " }\n",
66
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
67
- " background: #F44336;\n",
68
- " }\n",
69
- "</style>\n"
70
- ],
71
- "text/plain": [
72
- "<IPython.core.display.HTML object>"
73
- ]
74
- },
75
- "metadata": {},
76
- "output_type": "display_data"
77
- },
78
- {
79
- "data": {
80
- "text/html": [
81
- "\n",
82
- " <div>\n",
83
- " <progress value='65536' class='' max='62078' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
84
- " 105.57% [65536/62078 00:00&lt;00:00]\n",
85
- " </div>\n",
86
- " "
87
- ],
88
- "text/plain": [
89
- "<IPython.core.display.HTML object>"
90
- ]
91
- },
92
- "metadata": {},
93
- "output_type": "display_data"
94
- },
95
- {
96
- "data": {
97
- "text/plain": [
98
- "Path('images/tree.jpg')"
99
- ]
100
- },
101
- "execution_count": 5,
102
- "metadata": {},
103
- "output_type": "execute_result"
104
- }
105
- ],
106
  "source": [
107
  "dest = 'images/tree.jpg'\n",
108
  "download_url(ims[0], dest)"
@@ -120,7 +54,7 @@
120
  },
121
  {
122
  "cell_type": "code",
123
- "execution_count": 25,
124
  "metadata": {},
125
  "outputs": [],
126
  "source": [
@@ -130,7 +64,7 @@
130
  },
131
  {
132
  "cell_type": "code",
133
- "execution_count": 26,
134
  "metadata": {},
135
  "outputs": [],
136
  "source": [
@@ -155,20 +89,9 @@
155
  },
156
  {
157
  "cell_type": "code",
158
- "execution_count": 10,
159
  "metadata": {},
160
- "outputs": [
161
- {
162
- "data": {
163
- "text/plain": [
164
- "(#0) []"
165
- ]
166
- },
167
- "execution_count": 10,
168
- "metadata": {},
169
- "output_type": "execute_result"
170
- }
171
- ],
172
  "source": [
173
  "failed = verify_images(fns)\n",
174
  "failed"
@@ -176,7 +99,7 @@
176
  },
177
  {
178
  "cell_type": "code",
179
- "execution_count": 11,
180
  "metadata": {},
181
  "outputs": [],
182
  "source": [
@@ -192,22 +115,20 @@
192
  },
193
  {
194
  "cell_type": "code",
195
- "execution_count": 12,
196
  "metadata": {},
197
  "outputs": [],
198
  "source": [
199
- "trees = DataBlock(\n",
200
- " blocks=(ImageBlock, CategoryBlock), \n",
201
- " get_items=get_image_files, \n",
202
- " splitter=RandomSplitter(valid_pct=0.2, seed=42),\n",
203
- " get_y=parent_label,\n",
204
- " item_tfms=Resize(128)\n",
205
- ")"
206
  ]
207
  },
208
  {
209
  "cell_type": "code",
210
- "execution_count": 13,
211
  "metadata": {},
212
  "outputs": [],
213
  "source": [
@@ -238,7 +159,7 @@
238
  "source": [
239
  "trees = trees.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))\n",
240
  "dls = trees.dataloaders(path)\n",
241
- "dls.train.show_batch(max_n=8, nrows=2, unique=True)"
242
  ]
243
  },
244
  {
@@ -250,280 +171,30 @@
250
  },
251
  {
252
  "cell_type": "code",
253
- "execution_count": 16,
254
  "metadata": {},
255
  "outputs": [],
256
  "source": [
257
- "trees = trees.new(\n",
258
- " item_tfms=RandomResizedCrop(224, min_scale=0.5),\n",
259
- " batch_tfms=aug_transforms()\n",
260
- ")\n",
261
- "dls = trees.dataloaders(path)"
262
  ]
263
  },
264
  {
265
  "cell_type": "code",
266
- "execution_count": 17,
267
  "metadata": {},
268
- "outputs": [
269
- {
270
- "name": "stderr",
271
- "output_type": "stream",
272
- "text": [
273
- "/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n",
274
- " warnings.warn(\n",
275
- "/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=ResNet18_Weights.IMAGENET1K_V1`. You can also use `weights=ResNet18_Weights.DEFAULT` to get the most up-to-date weights.\n",
276
- " warnings.warn(msg)\n"
277
- ]
278
- },
279
- {
280
- "data": {
281
- "text/html": [
282
- "\n",
283
- "<style>\n",
284
- " /* Turns off some styling */\n",
285
- " progress {\n",
286
- " /* gets rid of default border in Firefox and Opera. */\n",
287
- " border: none;\n",
288
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
289
- " background-size: auto;\n",
290
- " }\n",
291
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
292
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
293
- " }\n",
294
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
295
- " background: #F44336;\n",
296
- " }\n",
297
- "</style>\n"
298
- ],
299
- "text/plain": [
300
- "<IPython.core.display.HTML object>"
301
- ]
302
- },
303
- "metadata": {},
304
- "output_type": "display_data"
305
- },
306
- {
307
- "data": {
308
- "text/html": [
309
- "<table border=\"1\" class=\"dataframe\">\n",
310
- " <thead>\n",
311
- " <tr style=\"text-align: left;\">\n",
312
- " <th>epoch</th>\n",
313
- " <th>train_loss</th>\n",
314
- " <th>valid_loss</th>\n",
315
- " <th>error_rate</th>\n",
316
- " <th>time</th>\n",
317
- " </tr>\n",
318
- " </thead>\n",
319
- " <tbody>\n",
320
- " <tr>\n",
321
- " <td>0</td>\n",
322
- " <td>2.664093</td>\n",
323
- " <td>1.748974</td>\n",
324
- " <td>0.630952</td>\n",
325
- " <td>00:27</td>\n",
326
- " </tr>\n",
327
- " </tbody>\n",
328
- "</table>"
329
- ],
330
- "text/plain": [
331
- "<IPython.core.display.HTML object>"
332
- ]
333
- },
334
- "metadata": {},
335
- "output_type": "display_data"
336
- },
337
- {
338
- "name": "stderr",
339
- "output_type": "stream",
340
- "text": [
341
- "/Users/briansigafoos/.pyenv/versions/3.9.15/lib/python3.9/site-packages/PIL/Image.py:979: UserWarning: Palette images with Transparency expressed in bytes should be converted to RGBA images\n",
342
- " warnings.warn(\n"
343
- ]
344
- },
345
- {
346
- "data": {
347
- "text/html": [
348
- "\n",
349
- "<style>\n",
350
- " /* Turns off some styling */\n",
351
- " progress {\n",
352
- " /* gets rid of default border in Firefox and Opera. */\n",
353
- " border: none;\n",
354
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
355
- " background-size: auto;\n",
356
- " }\n",
357
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
358
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
359
- " }\n",
360
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
361
- " background: #F44336;\n",
362
- " }\n",
363
- "</style>\n"
364
- ],
365
- "text/plain": [
366
- "<IPython.core.display.HTML object>"
367
- ]
368
- },
369
- "metadata": {},
370
- "output_type": "display_data"
371
- },
372
- {
373
- "data": {
374
- "text/html": [
375
- "<table border=\"1\" class=\"dataframe\">\n",
376
- " <thead>\n",
377
- " <tr style=\"text-align: left;\">\n",
378
- " <th>epoch</th>\n",
379
- " <th>train_loss</th>\n",
380
- " <th>valid_loss</th>\n",
381
- " <th>error_rate</th>\n",
382
- " <th>time</th>\n",
383
- " </tr>\n",
384
- " </thead>\n",
385
- " <tbody>\n",
386
- " <tr>\n",
387
- " <td>0</td>\n",
388
- " <td>1.634005</td>\n",
389
- " <td>1.019112</td>\n",
390
- " <td>0.404762</td>\n",
391
- " <td>00:30</td>\n",
392
- " </tr>\n",
393
- " <tr>\n",
394
- " <td>1</td>\n",
395
- " <td>1.273253</td>\n",
396
- " <td>0.574415</td>\n",
397
- " <td>0.178571</td>\n",
398
- " <td>00:31</td>\n",
399
- " </tr>\n",
400
- " <tr>\n",
401
- " <td>2</td>\n",
402
- " <td>0.994689</td>\n",
403
- " <td>0.358244</td>\n",
404
- " <td>0.130952</td>\n",
405
- " <td>00:31</td>\n",
406
- " </tr>\n",
407
- " <tr>\n",
408
- " <td>3</td>\n",
409
- " <td>0.821999</td>\n",
410
- " <td>0.284416</td>\n",
411
- " <td>0.119048</td>\n",
412
- " <td>00:30</td>\n",
413
- " </tr>\n",
414
- " <tr>\n",
415
- " <td>4</td>\n",
416
- " <td>0.692663</td>\n",
417
- " <td>0.258062</td>\n",
418
- " <td>0.107143</td>\n",
419
- " <td>00:30</td>\n",
420
- " </tr>\n",
421
- " </tbody>\n",
422
- "</table>"
423
- ],
424
- "text/plain": [
425
- "<IPython.core.display.HTML object>"
426
- ]
427
- },
428
- "metadata": {},
429
- "output_type": "display_data"
430
- }
431
- ],
432
  "source": [
433
  "learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
434
- "learn.fine_tune(5)"
435
  ]
436
  },
437
  {
438
  "cell_type": "code",
439
- "execution_count": 18,
440
  "metadata": {},
441
- "outputs": [
442
- {
443
- "data": {
444
- "text/html": [
445
- "\n",
446
- "<style>\n",
447
- " /* Turns off some styling */\n",
448
- " progress {\n",
449
- " /* gets rid of default border in Firefox and Opera. */\n",
450
- " border: none;\n",
451
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
452
- " background-size: auto;\n",
453
- " }\n",
454
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
455
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
456
- " }\n",
457
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
458
- " background: #F44336;\n",
459
- " }\n",
460
- "</style>\n"
461
- ],
462
- "text/plain": [
463
- "<IPython.core.display.HTML object>"
464
- ]
465
- },
466
- "metadata": {},
467
- "output_type": "display_data"
468
- },
469
- {
470
- "data": {
471
- "text/html": [],
472
- "text/plain": [
473
- "<IPython.core.display.HTML object>"
474
- ]
475
- },
476
- "metadata": {},
477
- "output_type": "display_data"
478
- },
479
- {
480
- "data": {
481
- "text/html": [
482
- "\n",
483
- "<style>\n",
484
- " /* Turns off some styling */\n",
485
- " progress {\n",
486
- " /* gets rid of default border in Firefox and Opera. */\n",
487
- " border: none;\n",
488
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
489
- " background-size: auto;\n",
490
- " }\n",
491
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
492
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
493
- " }\n",
494
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
495
- " background: #F44336;\n",
496
- " }\n",
497
- "</style>\n"
498
- ],
499
- "text/plain": [
500
- "<IPython.core.display.HTML object>"
501
- ]
502
- },
503
- "metadata": {},
504
- "output_type": "display_data"
505
- },
506
- {
507
- "data": {
508
- "text/html": [],
509
- "text/plain": [
510
- "<IPython.core.display.HTML object>"
511
- ]
512
- },
513
- "metadata": {},
514
- "output_type": "display_data"
515
- },
516
- {
517
- "data": {
518
- "image/png": "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r917gv/18vyvUkdQq9QMcQPsqGRLSUmBq5MNkpM//F3FUbhEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCLoSR2ASFu9PP+r1BHUyqbX71JHUKsXmwdJHYGKQaaBboHn5R4oERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYlQoOtAZ8+eXegFy2QyTJ8+vdCfIyIi0gQFKqDBwcGFXjALKBERabMCFVC5XF7cOYiIiDQKz4ESERGJwAJKREQkguibyV+5cgWLFy/GxYsXkZycrHKYVyaT4e7dux8dkIiIqCQStQcaHh4OLy8v7N27F87Ozrh37x4qVqwIZ2dnxMbGwszMDH5+fkWdlYiIqMQQVUBnzJiBihUr4vbt21izZg0AYMqUKYiMjMSpU6fw6NEj9OjRo0iDEhERlSSiCujFixcxePBgWFhYQFc359lp2dnZAABvb28MHz6cl7AQEZFWE1VA9fT0YG5uDgCwsrKCvr4+EhISFNMrVqyIGzduFE1CIiKiEkhUAfXw8EB0dDSAnMFCVapUwc6dOxXT9+3bB0dHx6JJSEREVAKJKqDt2rXDpk2bkJWVBQAYP348duzYgU8++QSffPIJ/vrrLwwfPrxIgxIREZUkoi5jmT59OsaOHas4/xkQEABdXV1s374durq6mDp1KgYMGFCUOYmIiEoUUQVUX18ftra2Sm39+vVDv379iiQUERFRScc7EREREYkgqoA2b978g68WLVoUdVaiAktPT8fUoMlwK+8Ma3Nj+DbyxpHDYVLHKjba2l9TIz1M6/Epdk/9DI/W9MXb0EHo19Qjz3kD21TFxYVd8HJTAGKW98T3AV4wMRR9s7USQ1u3bX40qb+iCqhcLocgCEqvrKws3L17F+Hh4Xj06FGxP8HF1dVV9HlWV1dXdOjQoWgDiRQeHg6ZTIbQ0NAPzjtgwAC4uroqtclkMlGPm1u7di1kMhkuXLhQ6M9qgqGDB2DRwgXo1bsvflzwC3R1deHfsR1ORkZKHa1YaGt/bc2NMKXHp6hczgpXY1/kO9+3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ezI0NBShoaHIzMzEjBkzcO7cuRJ/pxoiIqKPIaqAAoCpqSlmzZqFq1ev4u3bt3j79i3Onz+P6tWro0+fPnBycirKnERERCWKqEO47xIEAUeOHMHGjRuxc+dOvHr1CnZ2dhy9SkREWk10Af3nn3+wceNGbN68GfHx8ZDJZOjVqxdGjRqFBg0aKN1snYiISNsUqoDeu3cPGzduxMaNGxEdHY2yZcuib9++8PLyQs+ePdG1a1c0bNiwuLISERGVGAUuoA0bNsS5c+dgZ2eHbt26YdWqVfDx8QEA3L17t9gCEhERlUQFLqBnz56Fm5sbFixYgPbt24t6XBkREZG2KPAo3F9//RVOTk7o3LkzHB0dMXz4cBw7doyXqxARUalU4AI6cuRIREZG4u7duxg3bhwiIiLQokULlC1bFjNmzIBMJuPAISIiKjUKfR2om5sbpk2bhhs3buD8+fPo1asXwsPDIQgCRo4ciWHDhimeXkJERKStRN9IAQDq1q2LBQsW4OHDhzh06BBat26NLVu2oFOnTu99WgsREZGm+6gCqliIjg5atmyJtWvX4unTp9i0aRNatGhRFIsmIiIqkYqkgL7LyMgIPXv2xO7du4t60URERCVGkRdQIiKi0oAXcxIVk9SMbKkjqNWLzYOkjqBW3X8/L3UEtdo2qL7UEUoc7oESERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCyhppfT0dEwNmgy38s6wNjeGbyNvHDkcJnWsYvH69WuEzAlGt8/boWI5e9iY6uHPDeukjlVstHnbGunpoE9dZwS3rYQ/+3+KPcPqo0UlW5X5Pqtih5AOlbG+X23sGFwXq3rVxNgmrnAwM5AgddHSpO2rlQV0wIABcHV1VWqTyWQIDg6WJI+mCA8Ph0wmQ3h4uNRRPtrQwQOwaOEC9OrdFz8u+AW6urrw79gOJyMjpY5W5F48f4b5IXNw5/YteNaoKXWcYqfN29bCSA+965aFi5UR7r94m+987ramePoqAzui4rAkMhbHYp6jrosVFnSuBhsTfTUmLnqatH31pA5A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5cuX8KxREzt274WP78f/ECxpSlNfc/36ywI8/Pd/p1/27t6Jvbt3AgB69OqrNQXU0r4MZDq6OLppJdJTX8PG0QXtBo9H056DofuB7z4plLxEauDr64vvvvsODx8+VCqUfn5+WL58OVxdXVGuXLmPXk+tWrUQEBCAFStWKA6Znjt3DuvWrYO/v79iNOy7uTZv3owaNWrA2jrnThx16tSBqakp7ty588Hzn4VZZ6NGjWBtbY2AgACMGTMGMpkMGzZsUCqoebGzs0NYWBh8fHzQsmVLREZGomzZsiL/QsUjdK/23lg8P0ZGRgiZNx8h8+ZLHaXYlaa+5oq6eVfqCGphV7YCRvykOTfKL1kHlNWkUaNG0NXVhbm5OWrVqqVof/dwblFZtWoVZs2ahfPnz2PcuHE4evQogoKCsHnzZpV5c9f77uhfPT09NGzYsFC5CrJOW1tb7N27F05OTpg2bRp+/PFHtGrVCj/88MMHl1+2bFkcPnwY6enpaNWqFZ49e1agXERE2kQmfGiXg6gIpKSkwNLSEjdjE2H+n9uwaStbM976UZulZnz4jl3aZP0//0odQS3S3rzCN21rITk5WeWWkf9VKvdAiYiIPhYLKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEILKBEREQisIASERGJoCd1ACodBEEAALx+9UriJOqjLzeQOgIVo9SMbKkjqFXam9Lx/920N68B/O87631YQEktXv1/4azvWVHiJEREH/bq1StYWlq+dx6ZUJAyS/SR5HI5njx5AnNzc8hkMrWtNyUlBS4uLnj48CEsLCzUtl6psL/aqzT1FZCuv4Ig4NWrV3B2doaOzvvPcnIPlNRCR0cH5cqVk2z9FhYWpeJLJxf7q71KU18Bafr7oT3PXBxEREREJAILKBERkQgsoKTVDA0NMXPmTBgaGkodRS3YX+1VmvoKaEZ/OYiIiIhIBO6BEhERicACSkREJAILKBERkQgsoERERCKwgBIRlXDJycnIztbee+/K5fIPzvPixQs1JCkcFlAiDXbixAkkJibmO/3Zs2c4ceKEGhMVv8zMTFy9ehWRkZE4ceKEyktbXLhwAW3a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MkKlSpUwatSoPO8OVFLt378fwcHBUscgLcCnsRBRocyePRtubm5IS0tDZGQkli5div379+PatWswMTFRWw4/Pz+kpqbCwMCgUJ/bv38/fvvtNxZR+mgsoERUKG3btkW9evUAAEOGDIGtrS0WLFiA3bt3o3fv3irzv3nzBqampkWeQ0dHB0ZGRkW+XKKC4iFcIvoozZs3BwDcv38fAwYMgJmZGe7evYt27drB3Nwcffv2BZBz96CFCxeievXqMDIyQpkyZTB8+HC8fPlSaXmCIGDOnDkoV64cTExM0KxZM1y/fl1lvfmdAz179izatWsHa2trmJqaombNmvjll18AAAMGDMBvv/0GAEqHo3MVdUbSbtwDJaKPcvfuXQCAra0tACArKwutW7eGj48PfvzxR8Vh3eHDh2Pt2rUYOHAgxowZg/v37+PXX3/FpUuXcPLkSejr6wMAZsyYgTlz5qBdu3Zo164dLl68iM8++wwZGRkfzBIWFoYOHTrAyckJY8eOhaOjI27evIm9e/di7NixGD58OJ48eYKwsDBs2LBB5fPqyEhaRCAiKoA1a9YIAITDhw8LiYmJwsOHD4XNmzcLtra2grGxsfDo0SMhICBAACB88803Sp+NiIgQAAgbN25Uaj948KBSe0JCgmBgYCC0b99ekMvlivmmTJkiABACAgIUbceOHRMACMeOHRMEQRCysrIENzc3oUKFCsLLly+V1vPusr788kshr6++4shI2o2HcImoUFq2bAl7e3u4uLigV69eMDMzw86dO1G2bFnFPCNGjFD6zLZt22BpaYlWrVrh2bNnilfdunVhZmaGY8eOAQAOHz6MjIwMjB49WunQ6rhx4z6Y69KlS7h//z7GjRsHKysrpWnvLis/6shI2oWHcImoUH777TdUqlQJenp6KFOmDCpXrqz0NBQ9PT2UK1dO6TPR0dFITk6Gg4NDnsvMfbJKbGwsAOCTTz5Rmm5vbw9ra+v35so9lOzp6Vm4DqkxI2kXFlAiKhQvLy/FKNy8GBoaqjxeTC6Xw8HBARs3bszzM/b29kWaUQxNyEglCwsoERU7d3d3HD58GI0bN4axsXG+81WoUAFAzt5gxYoVFe2JiYkqI2HzWgcAXLt2DS1btsx3vvwO56ojI2kXngMlomLXo0cPZGdn49tvv1WZlpWVhaSkJAA551f19fWxePFiCO88qnjhwoUfXEedOnXg5uaGhQsXKpaX691l5V6T+t951JGRtAv3QImo2DVp0gTDhw9HSEgILl++jM8++wz6+vqIjo7Gtm3b8Msvv6Bbt26wt7fHhAkTEBISgg4dOqBdu3a4dOkSDhw4ADs7u/euQ0dHB0uXLkXHjh1Ru3ZtDBw4EE5OTrh16xauX7+Ov//+GwBQt25dAMCYMWPQunVr6OrqolevXmrJSFpG4lHARKQhci9jOX/+fL7zBAQECKampvlOX7FihVC3bl3B2NhYMDc3F2rUqCFMmjRJePLkiWKe7OxsYdasWYKTk5NgbGwsNG3aVLh27ZpQoUKF917GkisyMlJo1aqVYG5uLpiamgo1a9YUFi9erJielZUljB49WrC3txdkMpnKJS1FmZG0m0wQ3jkGQURERAXCc6BEREQisIASERGJwAJKREQkAgsoERGRCCygREREIrCAEhERicACSkREJAILKBERkQgsoERERCKwgBIREYnAAkpERCQCCygREZEI/wdbmbzBQDCL3QAAAABJRU5ErkJggg==",
519
- "text/plain": [
520
- "<Figure size 640x480 with 1 Axes>"
521
- ]
522
- },
523
- "metadata": {},
524
- "output_type": "display_data"
525
- }
526
- ],
527
  "source": [
528
  "interp = ClassificationInterpretation.from_learner(learn)\n",
529
  "interp.plot_confusion_matrix()"
@@ -540,98 +211,9 @@
540
  },
541
  {
542
  "cell_type": "code",
543
- "execution_count": 32,
544
  "metadata": {},
545
- "outputs": [
546
- {
547
- "data": {
548
- "text/html": [
549
- "\n",
550
- "<style>\n",
551
- " /* Turns off some styling */\n",
552
- " progress {\n",
553
- " /* gets rid of default border in Firefox and Opera. */\n",
554
- " border: none;\n",
555
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
556
- " background-size: auto;\n",
557
- " }\n",
558
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
559
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
560
- " }\n",
561
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
562
- " background: #F44336;\n",
563
- " }\n",
564
- "</style>\n"
565
- ],
566
- "text/plain": [
567
- "<IPython.core.display.HTML object>"
568
- ]
569
- },
570
- "metadata": {},
571
- "output_type": "display_data"
572
- },
573
- {
574
- "data": {
575
- "text/html": [],
576
- "text/plain": [
577
- "<IPython.core.display.HTML object>"
578
- ]
579
- },
580
- "metadata": {},
581
- "output_type": "display_data"
582
- },
583
- {
584
- "data": {
585
- "text/html": [
586
- "\n",
587
- "<style>\n",
588
- " /* Turns off some styling */\n",
589
- " progress {\n",
590
- " /* gets rid of default border in Firefox and Opera. */\n",
591
- " border: none;\n",
592
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
593
- " background-size: auto;\n",
594
- " }\n",
595
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
596
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
597
- " }\n",
598
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
599
- " background: #F44336;\n",
600
- " }\n",
601
- "</style>\n"
602
- ],
603
- "text/plain": [
604
- "<IPython.core.display.HTML object>"
605
- ]
606
- },
607
- "metadata": {},
608
- "output_type": "display_data"
609
- },
610
- {
611
- "data": {
612
- "text/html": [],
613
- "text/plain": [
614
- "<IPython.core.display.HTML object>"
615
- ]
616
- },
617
- "metadata": {},
618
- "output_type": "display_data"
619
- },
620
- {
621
- "data": {
622
- "application/vnd.jupyter.widget-view+json": {
623
- "model_id": "8f05f558f0424dc2a87d4e4c68263e39",
624
- "version_major": 2,
625
- "version_minor": 0
626
- },
627
- "text/plain": [
628
- "VBox(children=(Dropdown(options=('ash', 'chestnut', 'ginkgo biloba', 'silver maple', 'willow oak'), value='ash…"
629
- ]
630
- },
631
- "metadata": {},
632
- "output_type": "display_data"
633
- }
634
- ],
635
  "source": [
636
  "cleaner = ImageClassifierCleaner(learn)\n",
637
  "cleaner"
@@ -639,7 +221,7 @@
639
  },
640
  {
641
  "cell_type": "code",
642
- "execution_count": 33,
643
  "metadata": {},
644
  "outputs": [],
645
  "source": [
@@ -664,7 +246,7 @@
664
  },
665
  {
666
  "cell_type": "code",
667
- "execution_count": 20,
668
  "metadata": {},
669
  "outputs": [],
670
  "source": [
@@ -673,28 +255,17 @@
673
  },
674
  {
675
  "cell_type": "code",
676
- "execution_count": 21,
677
  "metadata": {},
678
- "outputs": [
679
- {
680
- "data": {
681
- "text/plain": [
682
- "(#1) [Path('model.pkl')]"
683
- ]
684
- },
685
- "execution_count": 21,
686
- "metadata": {},
687
- "output_type": "execute_result"
688
- }
689
- ],
690
  "source": [
691
  "path = Path()\n",
692
- "path.ls(file_exts='.pkl')"
693
  ]
694
  },
695
  {
696
  "cell_type": "code",
697
- "execution_count": 22,
698
  "metadata": {},
699
  "outputs": [],
700
  "source": [
@@ -703,89 +274,21 @@
703
  },
704
  {
705
  "cell_type": "code",
706
- "execution_count": 23,
707
  "metadata": {},
708
- "outputs": [
709
- {
710
- "data": {
711
- "text/html": [
712
- "\n",
713
- "<style>\n",
714
- " /* Turns off some styling */\n",
715
- " progress {\n",
716
- " /* gets rid of default border in Firefox and Opera. */\n",
717
- " border: none;\n",
718
- " /* Needs to be in here for Safari polyfill so background images work as expected. */\n",
719
- " background-size: auto;\n",
720
- " }\n",
721
- " progress:not([value]), progress:not([value])::-webkit-progress-bar {\n",
722
- " background: repeating-linear-gradient(45deg, #7e7e7e, #7e7e7e 10px, #5c5c5c 10px, #5c5c5c 20px);\n",
723
- " }\n",
724
- " .progress-bar-interrupted, .progress-bar-interrupted::-webkit-progress-bar {\n",
725
- " background: #F44336;\n",
726
- " }\n",
727
- "</style>\n"
728
- ],
729
- "text/plain": [
730
- "<IPython.core.display.HTML object>"
731
- ]
732
- },
733
- "metadata": {},
734
- "output_type": "display_data"
735
- },
736
- {
737
- "data": {
738
- "text/html": [],
739
- "text/plain": [
740
- "<IPython.core.display.HTML object>"
741
- ]
742
- },
743
- "metadata": {},
744
- "output_type": "display_data"
745
- },
746
- {
747
- "data": {
748
- "text/plain": [
749
- "('ash',\n",
750
- " TensorBase(0),\n",
751
- " TensorBase([7.8849e-01, 1.4656e-03, 4.6224e-04, 6.6382e-03, 2.0294e-01]))"
752
- ]
753
- },
754
- "execution_count": 23,
755
- "metadata": {},
756
- "output_type": "execute_result"
757
- }
758
- ],
759
  "source": [
760
  "learn_inf.predict('images/ash.jpg')"
761
  ]
762
  },
763
  {
764
  "cell_type": "code",
765
- "execution_count": 24,
766
  "metadata": {},
767
- "outputs": [
768
- {
769
- "data": {
770
- "text/plain": [
771
- "['ash', 'chestnut', 'ginkgo biloba', 'silver maple', 'willow oak']"
772
- ]
773
- },
774
- "execution_count": 24,
775
- "metadata": {},
776
- "output_type": "execute_result"
777
- }
778
- ],
779
  "source": [
780
  "learn_inf.dls.vocab"
781
  ]
782
- },
783
- {
784
- "cell_type": "code",
785
- "execution_count": null,
786
- "metadata": {},
787
- "outputs": [],
788
- "source": []
789
  }
790
  ],
791
  "metadata": {
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": null,
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
14
  },
15
  {
16
  "cell_type": "code",
17
+ "execution_count": null,
18
  "metadata": {},
19
  "outputs": [],
20
  "source": [
24
  },
25
  {
26
  "cell_type": "code",
27
+ "execution_count": null,
28
  "metadata": {},
29
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
30
  "source": [
31
  "ims = search_images_ddg('gingko biloba tree leaf', max_images=10)\n",
32
  "len(ims)"
34
  },
35
  {
36
  "cell_type": "code",
37
+ "execution_count": null,
38
  "metadata": {},
39
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  "source": [
41
  "dest = 'images/tree.jpg'\n",
42
  "download_url(ims[0], dest)"
54
  },
55
  {
56
  "cell_type": "code",
57
+ "execution_count": null,
58
  "metadata": {},
59
  "outputs": [],
60
  "source": [
64
  },
65
  {
66
  "cell_type": "code",
67
+ "execution_count": null,
68
  "metadata": {},
69
  "outputs": [],
70
  "source": [
89
  },
90
  {
91
  "cell_type": "code",
92
+ "execution_count": null,
93
  "metadata": {},
94
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
95
  "source": [
96
  "failed = verify_images(fns)\n",
97
  "failed"
99
  },
100
  {
101
  "cell_type": "code",
102
+ "execution_count": null,
103
  "metadata": {},
104
  "outputs": [],
105
  "source": [
115
  },
116
  {
117
  "cell_type": "code",
118
+ "execution_count": null,
119
  "metadata": {},
120
  "outputs": [],
121
  "source": [
122
+ "trees = DataBlock(blocks=(ImageBlock, CategoryBlock),\n",
123
+ " get_items=get_image_files,\n",
124
+ " splitter=RandomSplitter(valid_pct=0.2, seed=42),\n",
125
+ " get_y=parent_label,\n",
126
+ " item_tfms=Resize(128))\n"
 
 
127
  ]
128
  },
129
  {
130
  "cell_type": "code",
131
+ "execution_count": null,
132
  "metadata": {},
133
  "outputs": [],
134
  "source": [
159
  "source": [
160
  "trees = trees.new(item_tfms=Resize(128), batch_tfms=aug_transforms(mult=2))\n",
161
  "dls = trees.dataloaders(path)\n",
162
+ "dls.train.show_batch(max_n=8, nrows=2, unique=True)\n"
163
  ]
164
  },
165
  {
171
  },
172
  {
173
  "cell_type": "code",
174
+ "execution_count": null,
175
  "metadata": {},
176
  "outputs": [],
177
  "source": [
178
+ "trees = trees.new(item_tfms=RandomResizedCrop(224, min_scale=0.5),\n",
179
+ " batch_tfms=aug_transforms())\n",
180
+ "dls = trees.dataloaders(path)\n"
 
 
181
  ]
182
  },
183
  {
184
  "cell_type": "code",
185
+ "execution_count": null,
186
  "metadata": {},
187
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  "source": [
189
  "learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
190
+ "learn.fine_tune(5)\n"
191
  ]
192
  },
193
  {
194
  "cell_type": "code",
195
+ "execution_count": null,
196
  "metadata": {},
197
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  "source": [
199
  "interp = ClassificationInterpretation.from_learner(learn)\n",
200
  "interp.plot_confusion_matrix()"
211
  },
212
  {
213
  "cell_type": "code",
214
+ "execution_count": null,
215
  "metadata": {},
216
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  "source": [
218
  "cleaner = ImageClassifierCleaner(learn)\n",
219
  "cleaner"
221
  },
222
  {
223
  "cell_type": "code",
224
+ "execution_count": null,
225
  "metadata": {},
226
  "outputs": [],
227
  "source": [
246
  },
247
  {
248
  "cell_type": "code",
249
+ "execution_count": null,
250
  "metadata": {},
251
  "outputs": [],
252
  "source": [
255
  },
256
  {
257
  "cell_type": "code",
258
+ "execution_count": null,
259
  "metadata": {},
260
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
261
  "source": [
262
  "path = Path()\n",
263
+ "path.ls(file_exts='.pkl')\n"
264
  ]
265
  },
266
  {
267
  "cell_type": "code",
268
+ "execution_count": null,
269
  "metadata": {},
270
  "outputs": [],
271
  "source": [
274
  },
275
  {
276
  "cell_type": "code",
277
+ "execution_count": null,
278
  "metadata": {},
279
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  "source": [
281
  "learn_inf.predict('images/ash.jpg')"
282
  ]
283
  },
284
  {
285
  "cell_type": "code",
286
+ "execution_count": null,
287
  "metadata": {},
288
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
289
  "source": [
290
  "learn_inf.dls.vocab"
291
  ]
 
 
 
 
 
 
 
292
  }
293
  ],
294
  "metadata": {