{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import fastbook\n", "fastbook.setup_book()\n", "from fastbook import *\n", "from fastai.vision.widgets import *\n", "import skimage\n", "from skimage import io as skio\n", "import numpy\n", "from PIL import ImageEnhance\n", "path =Path(\"D:/pytorch/data/2D_FishAge\")\n", "Path.BASE_PATH =path\n", "image_list = (path/'images').ls()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# #Data processing only.\n", "# #Potential problem here, the 16bit images is squished into a narrow float range before being normalized out to 0-1\n", "# #Attempting to use tensors for speed when scaling to 3D GB data\n", "\n", "# #added - add 3 columns and reshape to a 3channel image to make it easier to use with the fastai model batching\n", "# image_tensors = [tensor(skimage.img_as_float( np.transpose( np.repeat( np.asarray(Image.open(o))[:, :, np.newaxis], 3, axis=2), (2,0,1)) )) for o in image_list]\n", "# #normalize the dataset to min-max\n", "# stacked_images_tensor = torch.stack(image_tensors)\n", "# stacked_images_tensor.shape\n", "# max = torch.max(stacked_images_tensor)\n", "# min = torch.min(stacked_images_tensor)\n", "# #considering min*0.98 and max*0.98 to reduce error from speckles\n", "# normal_stacked_images_tensor = (stacked_images_tensor-min)/(max-min)\n", "# # df = pd.DataFrame(image1_tensor)\n", "# # df.style.set_properties(**{'font-size':'6pt'}).background_gradient('Greys')\n", "\n", "# ##########################################\n", "# ## Replace this all with a better dataloader\n", "# ## Requires dummy files to be in place in the images folder\n", "# ## ADD TO TFMS??https://forums.fast.ai/t/how-to-use-segmentationdataloaders-correctly/88226/11\n", "# #########################################\n", "\n", "# numpy_array = [(o.numpy()*255).astype(numpy.uint8) for o in normal_stacked_images_tensor]\n", "\n", "# from tifffile import imsave\n", "# image_list_output = (path/'images').ls()\n", "# zippy = zip(image_list_output, (numpy_array))\n", "# #list(zippy)\n", "# [imsave(str(a),b) for a,b in zippy]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "fnames = get_image_files(path/\"images\")\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Due to IPython and Windows limitation, python multiprocessing isn't available now.\n", "So `number_workers` is changed to 0 to avoid getting stuck\n" ] } ], "source": [ "#minutes between time points\n", "minutes=15\n", "fnames = get_image_files(path/\"images\")\n", "def name_to_hrs (r): return float(round(float(os.path.basename(r)[0:-4].split(\"_\")[1][1:])*(minutes/60)+5,2))\n", "def validation_split (r): return os.path.basename(r)[0:-4].split(\"_\")[3] == \"R0003\" or os.path.basename(r)[0:-4].split(\"_\")[3] == \"R0006\"\n", "dblock = DataBlock(blocks=(ImageBlock, RegressionBlock),\n", " get_items = get_image_files,\n", " get_y= name_to_hrs,\n", " splitter = FuncSplitter(validation_split),\n", " batch_tfms =[*aug_transforms(size=(512,512), flip_vert=True), Normalize()]\n", " )\n", "dls = dblock.dataloaders(path, bs=16)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "dls.show_batch(max_n=20, figsize=(8,8))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\MichaelSNelson\\AppData\\Roaming\\Python\\Python310\\site-packages\\torchvision\\models\\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and will be removed in 0.15, please use 'weights' instead.\n", " warnings.warn(\n", "C:\\Users\\MichaelSNelson\\AppData\\Roaming\\Python\\Python310\\site-packages\\torchvision\\models\\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and will be removed in 0.15. 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", " warnings.warn(msg)\n" ] } ], "source": [ "learn = vision_learner(dls, resnet18, y_range=(4.9,24)).to_fp16()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "SuggestedLRs(valley=0.0006918309954926372)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "learn.lr_find()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losstime
06.2922031.85874900:06
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", " 70.00% [35/50 03:53<01:40]\n", "
\n", " \n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losstime
06.3911561.89347100:06
16.1355802.45258900:06
25.9646662.59715200:06
35.6755702.44352700:06
45.6030382.24233700:06
55.5332682.29830900:06
65.5130601.88458800:06
75.3065552.14353000:06
85.3190312.04687800:06
95.2358931.98644000:06
105.0246341.76808700:06
114.8263891.01952300:06
124.8116581.74091200:06
134.6969612.25757300:07
144.5171681.91568400:06
154.3058281.45048700:06
164.1116441.87532400:06
174.0074401.30420100:06
183.8608621.22706700:06
193.7215341.68991200:06
203.5250901.34872900:06
213.4398991.24875600:06
223.3125401.49387300:06
233.2648810.93241000:06
243.2220091.54528600:06
253.1493801.26937500:06
263.1410111.34787800:06
273.1285541.73473500:06
283.1210711.17953000:06
293.2976881.21841900:06
303.1870181.37092700:06
313.1476301.28864700:06
322.9460351.44867000:06
332.9654661.65818200:06
342.8407371.83138500:06

\n", "\n", "

\n", " \n", " 93.33% [14/15 00:05<00:00 2.8544]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[1;32mc:\\Users\\MichaelSNelson\\OneDrive - UW-Madison\\GitHub_clones\\zebrafish_2D\\Zebrafish age predictor.ipynb Cell 8'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m lr \u001b[39m=\u001b[39m \u001b[39m0.0006\u001b[39m\n\u001b[1;32m----> 2\u001b[0m learn\u001b[39m.\u001b[39;49mfine_tune(\u001b[39m50\u001b[39;49m, lr)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\callback\\schedule.py:164\u001b[0m, in \u001b[0;36mfine_tune\u001b[1;34m(self, epochs, base_lr, freeze_epochs, lr_mult, pct_start, div, **kwargs)\u001b[0m\n\u001b[0;32m 162\u001b[0m base_lr \u001b[39m/\u001b[39m\u001b[39m=\u001b[39m \u001b[39m2\u001b[39m\n\u001b[0;32m 163\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39munfreeze()\n\u001b[1;32m--> 164\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfit_one_cycle(epochs, \u001b[39mslice\u001b[39m(base_lr\u001b[39m/\u001b[39mlr_mult, base_lr), pct_start\u001b[39m=\u001b[39mpct_start, div\u001b[39m=\u001b[39mdiv, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\callback\\schedule.py:116\u001b[0m, in \u001b[0;36mfit_one_cycle\u001b[1;34m(self, n_epoch, lr_max, div, div_final, pct_start, wd, moms, cbs, reset_opt)\u001b[0m\n\u001b[0;32m 113\u001b[0m lr_max \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39marray([h[\u001b[39m'\u001b[39m\u001b[39mlr\u001b[39m\u001b[39m'\u001b[39m] \u001b[39mfor\u001b[39;00m h \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mopt\u001b[39m.\u001b[39mhypers])\n\u001b[0;32m 114\u001b[0m scheds \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mlr\u001b[39m\u001b[39m'\u001b[39m: combined_cos(pct_start, lr_max\u001b[39m/\u001b[39mdiv, lr_max, lr_max\u001b[39m/\u001b[39mdiv_final),\n\u001b[0;32m 115\u001b[0m \u001b[39m'\u001b[39m\u001b[39mmom\u001b[39m\u001b[39m'\u001b[39m: combined_cos(pct_start, \u001b[39m*\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmoms \u001b[39mif\u001b[39;00m moms \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m moms))}\n\u001b[1;32m--> 116\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mfit(n_epoch, cbs\u001b[39m=\u001b[39;49mParamScheduler(scheds)\u001b[39m+\u001b[39;49mL(cbs), reset_opt\u001b[39m=\u001b[39;49mreset_opt, wd\u001b[39m=\u001b[39;49mwd)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:222\u001b[0m, in \u001b[0;36mLearner.fit\u001b[1;34m(self, n_epoch, lr, wd, cbs, reset_opt)\u001b[0m\n\u001b[0;32m 220\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mopt\u001b[39m.\u001b[39mset_hypers(lr\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlr \u001b[39mif\u001b[39;00m lr \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m lr)\n\u001b[0;32m 221\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mn_epoch \u001b[39m=\u001b[39m n_epoch\n\u001b[1;32m--> 222\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_with_events(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_do_fit, \u001b[39m'\u001b[39;49m\u001b[39mfit\u001b[39;49m\u001b[39m'\u001b[39;49m, CancelFitException, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_end_cleanup)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:164\u001b[0m, in \u001b[0;36mLearner._with_events\u001b[1;34m(self, f, event_type, ex, final)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_with_events\u001b[39m(\u001b[39mself\u001b[39m, f, event_type, ex, final\u001b[39m=\u001b[39mnoop):\n\u001b[1;32m--> 164\u001b[0m \u001b[39mtry\u001b[39;00m: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mbefore_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); f()\n\u001b[0;32m 165\u001b[0m \u001b[39mexcept\u001b[39;00m ex: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_cancel_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[0;32m 166\u001b[0m \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); final()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:213\u001b[0m, in \u001b[0;36mLearner._do_fit\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 211\u001b[0m \u001b[39mfor\u001b[39;00m epoch \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mn_epoch):\n\u001b[0;32m 212\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mepoch\u001b[39m=\u001b[39mepoch\n\u001b[1;32m--> 213\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_with_events(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_do_epoch, \u001b[39m'\u001b[39;49m\u001b[39mepoch\u001b[39;49m\u001b[39m'\u001b[39;49m, CancelEpochException)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:164\u001b[0m, in \u001b[0;36mLearner._with_events\u001b[1;34m(self, f, event_type, ex, final)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_with_events\u001b[39m(\u001b[39mself\u001b[39m, f, event_type, ex, final\u001b[39m=\u001b[39mnoop):\n\u001b[1;32m--> 164\u001b[0m \u001b[39mtry\u001b[39;00m: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mbefore_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); f()\n\u001b[0;32m 165\u001b[0m \u001b[39mexcept\u001b[39;00m ex: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_cancel_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[0;32m 166\u001b[0m \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); final()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:207\u001b[0m, in \u001b[0;36mLearner._do_epoch\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 206\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_do_epoch\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m--> 207\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_do_epoch_train()\n\u001b[0;32m 208\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_do_epoch_validate()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:199\u001b[0m, in \u001b[0;36mLearner._do_epoch_train\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 197\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_do_epoch_train\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 198\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdl \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdls\u001b[39m.\u001b[39mtrain\n\u001b[1;32m--> 199\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_with_events(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mall_batches, \u001b[39m'\u001b[39;49m\u001b[39mtrain\u001b[39;49m\u001b[39m'\u001b[39;49m, CancelTrainException)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:164\u001b[0m, in \u001b[0;36mLearner._with_events\u001b[1;34m(self, f, event_type, ex, final)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_with_events\u001b[39m(\u001b[39mself\u001b[39m, f, event_type, ex, final\u001b[39m=\u001b[39mnoop):\n\u001b[1;32m--> 164\u001b[0m \u001b[39mtry\u001b[39;00m: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mbefore_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); f()\n\u001b[0;32m 165\u001b[0m \u001b[39mexcept\u001b[39;00m ex: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_cancel_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[0;32m 166\u001b[0m \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); final()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:170\u001b[0m, in \u001b[0;36mLearner.all_batches\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 168\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mall_batches\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 169\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mn_iter \u001b[39m=\u001b[39m \u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdl)\n\u001b[1;32m--> 170\u001b[0m \u001b[39mfor\u001b[39;00m o \u001b[39min\u001b[39;00m \u001b[39menumerate\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdl): \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mone_batch(\u001b[39m*\u001b[39;49mo)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:195\u001b[0m, in \u001b[0;36mLearner.one_batch\u001b[1;34m(self, i, b)\u001b[0m\n\u001b[0;32m 193\u001b[0m b \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_set_device(b)\n\u001b[0;32m 194\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_split(b)\n\u001b[1;32m--> 195\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_with_events(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_do_one_batch, \u001b[39m'\u001b[39;49m\u001b[39mbatch\u001b[39;49m\u001b[39m'\u001b[39;49m, CancelBatchException)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:164\u001b[0m, in \u001b[0;36mLearner._with_events\u001b[1;34m(self, f, event_type, ex, final)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_with_events\u001b[39m(\u001b[39mself\u001b[39m, f, event_type, ex, final\u001b[39m=\u001b[39mnoop):\n\u001b[1;32m--> 164\u001b[0m \u001b[39mtry\u001b[39;00m: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mbefore_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); f()\n\u001b[0;32m 165\u001b[0m \u001b[39mexcept\u001b[39;00m ex: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_cancel_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[0;32m 166\u001b[0m \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); final()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:182\u001b[0m, in \u001b[0;36mLearner._do_one_batch\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 180\u001b[0m \u001b[39mself\u001b[39m(\u001b[39m'\u001b[39m\u001b[39mbefore_backward\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m 181\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mloss_grad\u001b[39m.\u001b[39mbackward()\n\u001b[1;32m--> 182\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_with_events(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mopt\u001b[39m.\u001b[39;49mstep, \u001b[39m'\u001b[39;49m\u001b[39mstep\u001b[39;49m\u001b[39m'\u001b[39;49m, CancelStepException)\n\u001b[0;32m 183\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mopt\u001b[39m.\u001b[39mzero_grad()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:164\u001b[0m, in \u001b[0;36mLearner._with_events\u001b[1;34m(self, f, event_type, ex, final)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_with_events\u001b[39m(\u001b[39mself\u001b[39m, f, event_type, ex, final\u001b[39m=\u001b[39mnoop):\n\u001b[1;32m--> 164\u001b[0m \u001b[39mtry\u001b[39;00m: \u001b[39mself\u001b[39;49m(\u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39mbefore_\u001b[39;49m\u001b[39m{\u001b[39;49;00mevent_type\u001b[39m}\u001b[39;49;00m\u001b[39m'\u001b[39;49m); f()\n\u001b[0;32m 165\u001b[0m \u001b[39mexcept\u001b[39;00m ex: \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_cancel_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[0;32m 166\u001b[0m \u001b[39mself\u001b[39m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mafter_\u001b[39m\u001b[39m{\u001b[39;00mevent_type\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m); final()\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:142\u001b[0m, in \u001b[0;36mLearner.__call__\u001b[1;34m(self, event_name)\u001b[0m\n\u001b[1;32m--> 142\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, event_name): L(event_name)\u001b[39m.\u001b[39;49mmap(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_call_one)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastcore\\foundation.py:155\u001b[0m, in \u001b[0;36mL.map\u001b[1;34m(self, f, gen, *args, **kwargs)\u001b[0m\n\u001b[1;32m--> 155\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mmap\u001b[39m(\u001b[39mself\u001b[39m, f, \u001b[39m*\u001b[39margs, gen\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs): \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_new(map_ex(\u001b[39mself\u001b[39m, f, \u001b[39m*\u001b[39margs, gen\u001b[39m=\u001b[39mgen, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs))\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastcore\\basics.py:780\u001b[0m, in \u001b[0;36mmap_ex\u001b[1;34m(iterable, f, gen, *args, **kwargs)\u001b[0m\n\u001b[0;32m 778\u001b[0m res \u001b[39m=\u001b[39m \u001b[39mmap\u001b[39m(g, iterable)\n\u001b[0;32m 779\u001b[0m \u001b[39mif\u001b[39;00m gen: \u001b[39mreturn\u001b[39;00m res\n\u001b[1;32m--> 780\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mlist\u001b[39;49m(res)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastcore\\basics.py:765\u001b[0m, in \u001b[0;36mbind.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 763\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(v,_Arg): kwargs[k] \u001b[39m=\u001b[39m args\u001b[39m.\u001b[39mpop(v\u001b[39m.\u001b[39mi)\n\u001b[0;32m 764\u001b[0m fargs \u001b[39m=\u001b[39m [args[x\u001b[39m.\u001b[39mi] \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(x, _Arg) \u001b[39melse\u001b[39;00m x \u001b[39mfor\u001b[39;00m x \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpargs] \u001b[39m+\u001b[39m args[\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmaxi\u001b[39m+\u001b[39m\u001b[39m1\u001b[39m:]\n\u001b[1;32m--> 765\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfunc(\u001b[39m*\u001b[39mfargs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\learner.py:146\u001b[0m, in \u001b[0;36mLearner._call_one\u001b[1;34m(self, event_name)\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_call_one\u001b[39m(\u001b[39mself\u001b[39m, event_name):\n\u001b[0;32m 145\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mhasattr\u001b[39m(event, event_name): \u001b[39mraise\u001b[39;00m \u001b[39mException\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39mmissing \u001b[39m\u001b[39m{\u001b[39;00mevent_name\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m)\n\u001b[1;32m--> 146\u001b[0m \u001b[39mfor\u001b[39;00m cb \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcbs\u001b[39m.\u001b[39msorted(\u001b[39m'\u001b[39m\u001b[39morder\u001b[39m\u001b[39m'\u001b[39m): cb(event_name)\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\callback\\core.py:57\u001b[0m, in \u001b[0;36mCallback.__call__\u001b[1;34m(self, event_name)\u001b[0m\n\u001b[0;32m 55\u001b[0m res \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[0;32m 56\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mrun \u001b[39mand\u001b[39;00m _run:\n\u001b[1;32m---> 57\u001b[0m \u001b[39mtry\u001b[39;00m: res \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39;49m(\u001b[39mself\u001b[39;49m, event_name, noop)()\n\u001b[0;32m 58\u001b[0m \u001b[39mexcept\u001b[39;00m (CancelBatchException, CancelEpochException, CancelFitException, CancelStepException, CancelTrainException, CancelValidException): \u001b[39mraise\u001b[39;00m\n\u001b[0;32m 59\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mException\u001b[39;00m \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\fastai\\callback\\fp16.py:28\u001b[0m, in \u001b[0;36mMixedPrecision.before_step\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mbefore_step\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 27\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mskipped\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m\n\u001b[1;32m---> 28\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mscaler\u001b[39m.\u001b[39;49mstep(\u001b[39mself\u001b[39;49m)\n\u001b[0;32m 29\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mskipped: \u001b[39mraise\u001b[39;00m CancelStepException()\n\u001b[0;32m 30\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mscales\u001b[39m.\u001b[39mappend(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mscaler\u001b[39m.\u001b[39mget_scale())\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\torch\\cuda\\amp\\grad_scaler.py:338\u001b[0m, in \u001b[0;36mGradScaler.step\u001b[1;34m(self, optimizer, *args, **kwargs)\u001b[0m\n\u001b[0;32m 334\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39munscale_(optimizer)\n\u001b[0;32m 336\u001b[0m \u001b[39massert\u001b[39;00m \u001b[39mlen\u001b[39m(optimizer_state[\u001b[39m\"\u001b[39m\u001b[39mfound_inf_per_device\u001b[39m\u001b[39m\"\u001b[39m]) \u001b[39m>\u001b[39m \u001b[39m0\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mNo inf checks were recorded for this optimizer.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m--> 338\u001b[0m retval \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_maybe_opt_step(optimizer, optimizer_state, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 340\u001b[0m optimizer_state[\u001b[39m\"\u001b[39m\u001b[39mstage\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m OptState\u001b[39m.\u001b[39mSTEPPED\n\u001b[0;32m 342\u001b[0m \u001b[39mreturn\u001b[39;00m retval\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\torch\\cuda\\amp\\grad_scaler.py:284\u001b[0m, in \u001b[0;36mGradScaler._maybe_opt_step\u001b[1;34m(self, optimizer, optimizer_state, *args, **kwargs)\u001b[0m\n\u001b[0;32m 282\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_maybe_opt_step\u001b[39m(\u001b[39mself\u001b[39m, optimizer, optimizer_state, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 283\u001b[0m retval \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m--> 284\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39msum\u001b[39;49m(v\u001b[39m.\u001b[39;49mitem() \u001b[39mfor\u001b[39;49;00m v \u001b[39min\u001b[39;49;00m optimizer_state[\u001b[39m\"\u001b[39;49m\u001b[39mfound_inf_per_device\u001b[39;49m\u001b[39m\"\u001b[39;49m]\u001b[39m.\u001b[39;49mvalues()):\n\u001b[0;32m 285\u001b[0m retval \u001b[39m=\u001b[39m optimizer\u001b[39m.\u001b[39mstep(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 286\u001b[0m \u001b[39mreturn\u001b[39;00m retval\n", "File \u001b[1;32md:\\Anaconda\\envs\\fastai2\\lib\\site-packages\\torch\\cuda\\amp\\grad_scaler.py:284\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 282\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_maybe_opt_step\u001b[39m(\u001b[39mself\u001b[39m, optimizer, optimizer_state, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 283\u001b[0m retval \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m--> 284\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39msum\u001b[39m(v\u001b[39m.\u001b[39;49mitem() \u001b[39mfor\u001b[39;00m v \u001b[39min\u001b[39;00m optimizer_state[\u001b[39m\"\u001b[39m\u001b[39mfound_inf_per_device\u001b[39m\u001b[39m\"\u001b[39m]\u001b[39m.\u001b[39mvalues()):\n\u001b[0;32m 285\u001b[0m retval \u001b[39m=\u001b[39m optimizer\u001b[39m.\u001b[39mstep(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 286\u001b[0m \u001b[39mreturn\u001b[39;00m retval\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "lr = 0.0006\n", "learn.fine_tune(50, lr)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epochtrain_lossvalid_losstime
02.5815091.62549100:10
12.4365881.59074500:08
22.6758111.89287800:08
32.4524140.89532600:08
42.6228872.22950400:08
52.8274761.95226500:08
62.8800802.17591300:08
72.7495751.42729800:08
82.7793921.54240800:08
92.6398180.98449100:08
102.5777682.60982800:08
112.4239542.79428600:08
122.4839721.61734400:08
132.4061931.17492000:08
142.4337061.29036100:08
152.3792401.85815200:08
162.6189760.67120900:08
172.6694050.72179100:08
182.6676881.11016800:08
192.5844660.67053400:08
202.4395691.31213800:09
212.3807650.93273300:08
222.3115581.63655900:09
232.3921530.52532900:08
242.2460400.69316900:08
252.2238521.20327400:08
262.1327651.55841100:08
272.1567050.98546000:09
282.1543771.41373800:08
292.2472520.71722500:08
302.0805380.89342500:08
311.9808020.50038100:09
321.9596841.57851800:08
331.8773440.59834100:08
341.7943180.95407000:08
351.7916301.03096500:08
361.7476371.43347700:08
371.6510120.96214400:08
381.5827690.94316100:08
391.5998860.74997100:08
401.5310201.08032100:08
411.4700441.11050700:08
421.4967430.96153900:08
431.5519680.99050500:08
441.4960320.85226400:08
451.5028370.85125900:08
461.4944280.87954100:08
471.5549750.86658500:08
481.5102560.95004400:08
491.5267130.97549600:08
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "learn.to_fp32()\n", "learn.unfreeze\n", "learn.fit_one_cycle(50, lr_max=slice(1e-6, 2e-3))" ] }, { "cell_type": "code", "execution_count": 211, "metadata": {}, "outputs": [], "source": [ "learn.export('export.pkl')" ] }, { "cell_type": "code", "execution_count": 210, "metadata": {}, "outputs": [], "source": [ "learn.path = Path(\"D:/pytorch/data/2D_FishAge\")" ] }, { "cell_type": "code", "execution_count": 212, "metadata": { "scrolled": true }, "outputs": [], "source": [ "zebrafish_age_predictor = load_learner(path/'export.pkl')\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'fnames' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mc:\\Users\\MichaelSNelson\\OneDrive - UW-Madison\\GitHub_clones\\zebrafish_2D\\Zebrafish age predictor.ipynb Cell 14'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m n\u001b[39m=\u001b[39m\u001b[39m1080\u001b[39m\n\u001b[1;32m----> 2\u001b[0m \u001b[39mprint\u001b[39m(os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mbasename(fnames[n]))\n\u001b[0;32m 3\u001b[0m img \u001b[39m=\u001b[39m plt\u001b[39m.\u001b[39mimread(fnames[n])\n\u001b[0;32m 4\u001b[0m age,tensor, tensor\u001b[39m=\u001b[39mzebrafish_age_predictor\u001b[39m.\u001b[39mpredict(img)\n", "\u001b[1;31mNameError\u001b[0m: name 'fnames' is not defined" ] } ], "source": [ "n=1080\n", "print(os.path.basename(fnames[n]))\n", "img = plt.imread(fnames[n])\n", "age,tensor, tensor=zebrafish_age_predictor.predict(img)\n", "print(\"Estimated age is \"+str(round(age[0],2))+\"hrs.\")\n", "plt.figure(figsize=(4,4))\n", "\n", "plt.axis('off')\n", "plt.imshow(img*10)\n" ] }, { "cell_type": "code", "execution_count": 281, "metadata": {}, "outputs": [], "source": [ "# IGNORE FOR NOW\n", "#attempt to make a GUI for Voila\n", "out_pl = widgets.Output()\n", "lbl_pred = widgets.Label()\n", "zebrafish_age_predictor = load_learner(path/'export.pkl')\n", "btn_run = widgets.Button(description='Process')\n", "def on_click_classify(change):\n", " img = PILImage.create(btn_upload.data[-1])\n", " out_pl.clear_output()\n", " enhancer = ImageEnhance.Brightness(img)\n", " factor = 10 \n", " im_output = enhancer.enhance(factor)\n", " with out_pl: display(im_output.to_thumb(128,128))\n", " age,tensor, tensor=zebrafish_age_predictor.predict(img)\n", " lbl_pred.value = f'Predicted age: {age[0]};'\n", "\n", "btn_run.on_click(on_click_classify)" ] }, { "cell_type": "code", "execution_count": 286, "metadata": {}, "outputs": [], "source": [ "btn_upload= widgets.FileUpload()" ] }, { "cell_type": "code", "execution_count": 287, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e6ed0b03df764305bf7ee3e98f1c990a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(Label(value='Upload a grayscale zebrafish embryo image'), FileUpload(value={}, description='Upl…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "VBox([widgets.Label('Upload a grayscale zebrafish embryo image'), \n", " btn_upload, btn_run, out_pl, lbl_pred])" ] }, { "cell_type": "code", "execution_count": 252, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "((18.362674713134766,), TensorBase([18.3627]), TensorBase([18.3627]))" ] }, "execution_count": 252, "metadata": {}, "output_type": "execute_result" } ], "source": [ "zebrafish_age_predictor.predict(img)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "jupytext": { "split_at_heading": true }, "kernelspec": { "display_name": "Python 3.10.4 ('fastai2')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" }, "vscode": { "interpreter": { "hash": "f69c838de7ce47136ebe027dd64b911371851962ad08f8b0aa77da2666fa0521" } } }, "nbformat": 4, "nbformat_minor": 4 }