Skip to content

Instantly share code, notes, and snippets.

@jcreinhold
Created October 25, 2018 19:55
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save jcreinhold/fbd28adf4e0c423b6cb93cb49f4232d0 to your computer and use it in GitHub Desktop.
Save jcreinhold/fbd28adf4e0c423b6cb93cb49f4232d0 to your computer and use it in GitHub Desktop.
test 3d network with Learner class in fastai
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test 3D Conv with Learner"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup notebook"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import sys\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import torch\n",
"from torch import nn\n",
"import torchvision.transforms as torch_tfms"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" Support in-notebook plotting"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Report versions"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"numpy version: 1.15.3\n",
"matplotlib version: 3.0.0\n"
]
}
],
"source": [
"print('numpy version: {}'.format(np.__version__))\n",
"from matplotlib import __version__ as mplver\n",
"print('matplotlib version: {}'.format(mplver))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"python version: 3.7.0\n"
]
}
],
"source": [
"pv = sys.version_info\n",
"print('python version: {}.{}.{}'.format(pv.major, pv.minor, pv.micro))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Reload packages where content for package development"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define test images"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"train_dir = '/Users/jcreinhold/Research/data/nn_test/real/train/'\n",
"val_dir = '/Users/jcreinhold/Research/data/nn_test/real/test/'"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from niftidataset import *"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"class AddChannel:\n",
" \"\"\" Add channel dimension to sample \"\"\"\n",
" def __call__(self, sample: Tuple[np.ndarray, np.ndarray]):\n",
" src, tgt = sample\n",
" assert src.shape == tgt.shape\n",
" return (src.unsqueeze(0), tgt.unsqueeze(0))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"patch_sz = 32\n",
"tfms = torch_tfms.Compose([RandomCrop3D(patch_sz), ToTensor(), AddChannel()])\n",
"tds = NiftiDataset(train_dir+'t1', train_dir+'flair', tfms)\n",
"vds = NiftiDataset(val_dir+'t1', val_dir+'flair', tfms)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"src,tgt = tds[0]\n",
"plt.imshow(np.rot90(src[0,:,16,:]), cmap='gist_gray')\n",
"plt.axis('off');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test fastai"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"import fastai as fai\n",
"import fastai.vision as faiv\n",
"import torchvision\n",
"from torch.utils.data import DataLoader"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fastai version: 1.0.12\n",
"pytorch version: 1.0.0.dev20181014\n",
"torchvision version: 0.2.1\n"
]
}
],
"source": [
"print(f'fastai version: {fai.__version__}')\n",
"print(f'pytorch version: {torch.__version__}')\n",
"print(f'torchvision version: {torchvision.__version__}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define a 3D Unet model\n",
"\n",
"The Unet model is described in this package: https://github.com/jcreinhold/synthit. I'll probably break this off at some point."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"from synthit.models import Unet"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setup a 3D fastai learner"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"idb = faiv.ImageDataBunch.create(tds, vds, bs=2, num_workers=1)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"loss = nn.MSELoss()\n",
"loss.__name__ = 'MSE'"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"model = Unet(1, channel_base_power=1)\n",
"learner = fai.Learner(idb, model, loss_func=loss, metrics=[loss])"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"tensor(617962.5000, grad_fn=<MseLossBackward>)\n",
"tensor(736843.1250, grad_fn=<MseLossBackward>)\n"
]
}
],
"source": [
"# test that the loss function and dataloaders are working as expected\n",
"\n",
"for x,y in idb.train_dl:\n",
" print(loss(learner.model(x),y))\n",
" break\n",
" \n",
"for x,y in idb.valid_dl:\n",
" print(loss(learner.model(x),y))\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "097faba9fb694adca3a0deb78a7d3c02",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(IntProgress(value=0, max=34), HTML(value='0.00% [0/34 00:00<00:00]'))), HTML(val…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learner.lr_find()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"learner.recorder.plot()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HBox(children=(IntProgress(value=0, max=1), HTML(value='0.00% [0/1 00:00<00:00]'))), HTML(value…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total time: 00:03\n",
"epoch train loss valid loss MSE \n",
"1 994864.687500 736764.625000 736764.625000 (00:03)\n",
"\n"
]
}
],
"source": [
"learner.fit(1)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:neuropp]",
"language": "python",
"name": "conda-env-neuropp-py"
},
"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.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment