Skip to content

Commit d1543b0

Browse files
author
ayasyrev
committed
yresnet, stem_stride_on
1 parent d0a4395 commit d1543b0

File tree

6 files changed

+1686
-59
lines changed

6 files changed

+1686
-59
lines changed

model_constructor/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.1.1"
1+
__version__ = "0.1.4"

model_constructor/_nbdev.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,23 @@
3131
"xresnet50": "03_xresnet.ipynb",
3232
"init_cnn": "04_Net.ipynb",
3333
"NewResBlock": "04_Net.ipynb",
34-
"net34": "04_Net.ipynb",
35-
"net50": "04_Net.ipynb",
3634
"nn": "05_Twist.ipynb",
3735
"F": "05_Twist.ipynb",
3836
"ConvTwist": "05_Twist.ipynb",
3937
"ConvLayerTwist": "05_Twist.ipynb",
4038
"NewResBlockTwist": "05_Twist.ipynb",
41-
"ResBlockTwist": "05_Twist.ipynb"}
39+
"ResBlockTwist": "05_Twist.ipynb",
40+
"YResBlock": "06_YResnet.ipynb",
41+
"yresnet34": "06_YResnet.ipynb",
42+
"yresnet50": "06_YResnet.ipynb"}
4243

4344
modules = ["constructor.py",
4445
"layers.py",
4546
"resnet.py",
4647
"xresnet.py",
4748
"net.py",
48-
"twist.py"]
49+
"twist.py",
50+
"yresnet.py"]
4951

5052
doc_url = "https://ayasyrev.github.io/model_constructor/"
5153

model_constructor/net.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/04_Net.ipynb (unless otherwise specified).
22

3-
__all__ = ['init_cnn', 'act_fn', 'ResBlock', 'NewResBlock', 'Net', 'net34', 'net50']
3+
__all__ = ['init_cnn', 'act_fn', 'ResBlock', 'NewResBlock', 'Net']
44

55
# Cell
66
import torch.nn as nn
77
import sys, torch
88
from functools import partial
99
from collections import OrderedDict
10-
1110
from .layers import *
1211

1312
# Cell
@@ -70,7 +69,8 @@ def forward(self, x):
7069
# Cell
7170
def _make_stem(self):
7271
stem = [(f"conv_{i}", self.conv_layer(self.stem_sizes[i], self.stem_sizes[i+1],
73-
stride=2 if i==0 else 1,
72+
# stride=2 if i==0 else 1,
73+
stride=2 if i==self.stem_stride_on else 1,
7474
bn_layer=(not self.stem_bn_end) if i==(len(self.stem_sizes)-2) else True,
7575
act_fn=self.act_fn, bn_1st=self.bn_1st))
7676
for i in range(len(self.stem_sizes)-1)]
@@ -105,18 +105,18 @@ def _make_head(self):
105105
# Cell
106106
# v8
107107
class Net():
108-
def __init__(self, expansion=1, layers=[2,2,2,2], c_in=3, c_out=1000, name='Net',
109-
act_fn=nn.ReLU(inplace=True), pool = nn.AvgPool2d(2, ceil_mode=True), sa=0):
108+
def __init__(self, expansion=1, layers=[2,2,2,2], c_in=3, c_out=1000,
109+
name='Net', block=ResBlock,act_fn=nn.ReLU(inplace=True),
110+
pool = nn.AvgPool2d(2, ceil_mode=True), sa=0):
110111
super().__init__()
111112
self.name = name
112113
self.c_in, self.c_out,self.expansion,self.layers = c_in,c_out,expansion,layers # todo setter for expansion
113-
self.act_fn, self.pool, self.sa = act_fn, pool, sa
114+
self.block, self.act_fn, self.pool, self.sa = block, act_fn, pool, sa
114115
self.groups = 1
115-
116116
self.stem_sizes = [c_in,32,32,64]
117117
self.stem_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
118+
self.stem_stride_on = 0
118119
self.stem_bn_end = False
119-
self.block = ResBlock
120120
self.norm = nn.BatchNorm2d
121121
self.bn_1st = True
122122
self.zero_bn=True
@@ -155,16 +155,4 @@ def __call__(self):
155155
model.extra_repr = lambda : f"model {self.name}"
156156
return model
157157
def __repr__(self):
158-
return f" constr {self.name}\n expansion: {self.expansion}, sa: {self.sa}, groups: {self.groups}\n stem sizes: {self.stem_sizes}\n body sizes {self.block_szs}"
159-
160-
# Cell
161-
# me = sys.modules[__name__]
162-
# for n,e,l in [[ 18 , 1, [2,2,2 ,2] ],
163-
# [ 34 , 1, [3,4,6 ,3] ],
164-
# [ 50 , 4, [3,4,6 ,3] ],
165-
# [ 101, 4, [3,4,23,3] ],
166-
# [ 152, 4, [3,8,36,3] ],]:
167-
# name = f'net{n}'
168-
# setattr(me, name, partial(Net, expansion=e, layers=l, name=name))
169-
net34 = partial(Net, expansion=1, layers=[3, 4, 6, 3], name='xresnet34')
170-
net50 = partial(Net, expansion=4, layers=[3, 4, 6, 3], name='xresnet50')
158+
return f"{self.name} constructor\n expansion: {self.expansion}, sa: {self.sa}, groups: {self.groups}\n stem sizes: {self.stem_sizes}\n body sizes {self.block_szs}"

model_constructor/yresnet.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/06_YResnet.ipynb (unless otherwise specified).
2+
3+
__all__ = ['YResBlock', 'yresnet34', 'yresnet50']
4+
5+
# Cell
6+
import torch.nn as nn
7+
import sys, torch
8+
from functools import partial
9+
from collections import OrderedDict
10+
from .layers import *
11+
from .net import Net
12+
13+
# Cell
14+
# YResBlock - former NewResBlock.
15+
class YResBlock(nn.Module):
16+
'''YResBlock. Reduce by pool instead of stride 2'''
17+
def __init__(self, expansion, ni, nh, stride=1,
18+
conv_layer=ConvLayer, act_fn=act_fn, zero_bn=True, bn_1st=True,
19+
pool=nn.AvgPool2d(2, ceil_mode=True), sa=False,sym=False, groups=1):
20+
super().__init__()
21+
nf,ni = nh*expansion,ni*expansion
22+
self.reduce = noop if stride==1 else pool
23+
layers = [(f"conv_0", conv_layer(ni, nh, 3, stride=1, act_fn=act_fn, bn_1st=bn_1st)), # stride 1 !!!
24+
(f"conv_1", conv_layer(nh, nf, 3, zero_bn=zero_bn, act=False, bn_1st=bn_1st))
25+
] if expansion == 1 else [
26+
(f"conv_0",conv_layer(ni, nh, 1, act_fn=act_fn, bn_1st=bn_1st)),
27+
(f"conv_1",conv_layer(nh, nh, 3, stride=1, act_fn=act_fn, bn_1st=bn_1st, groups=int(nh/groups))), # stride 1 !!!
28+
(f"conv_2",conv_layer(nh, nf, 1, zero_bn=zero_bn, act=False, bn_1st=bn_1st))
29+
]
30+
if sa: layers.append(('sa', SimpleSelfAttention(nf,ks=1,sym=sym)))
31+
self.convs = nn.Sequential(OrderedDict(layers))
32+
self.idconv = noop if ni==nf else conv_layer(ni, nf, 1, act=False)
33+
self.merge =act_fn
34+
35+
def forward(self, x):
36+
o = self.reduce(x)
37+
return self.merge(self.convs(o) + self.idconv(o))
38+
39+
# Cell
40+
yresnet34 = partial(Net, block=YResBlock, expansion=1, layers=[3, 4, 6, 3], name='yresnet34')
41+
yresnet50 = partial(Net, block=YResBlock, expansion=4, layers=[3, 4, 6, 3], name='yresnet50')

nbs/04_Net.ipynb

Lines changed: 68 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@
6969
"import sys, torch\n",
7070
"from functools import partial\n",
7171
"from collections import OrderedDict\n",
72-
"\n",
7372
"from model_constructor.layers import *"
7473
]
7574
},
@@ -496,7 +495,8 @@
496495
"%nbdev_export\n",
497496
"def _make_stem(self):\n",
498497
" stem = [(f\"conv_{i}\", self.conv_layer(self.stem_sizes[i], self.stem_sizes[i+1], \n",
499-
" stride=2 if i==0 else 1, \n",
498+
"# stride=2 if i==0 else 1, \n",
499+
" stride=2 if i==self.stem_stride_on else 1, \n",
500500
" bn_layer=(not self.stem_bn_end) if i==(len(self.stem_sizes)-2) else True,\n",
501501
" act_fn=self.act_fn, bn_1st=self.bn_1st))\n",
502502
" for i in range(len(self.stem_sizes)-1)]\n",
@@ -566,18 +566,18 @@
566566
"%nbdev_export\n",
567567
"# v8\n",
568568
"class Net():\n",
569-
" def __init__(self, expansion=1, layers=[2,2,2,2], c_in=3, c_out=1000, name='Net',\n",
570-
" act_fn=nn.ReLU(inplace=True), pool = nn.AvgPool2d(2, ceil_mode=True), sa=0):\n",
569+
" def __init__(self, expansion=1, layers=[2,2,2,2], c_in=3, c_out=1000, \n",
570+
" name='Net', block=ResBlock,act_fn=nn.ReLU(inplace=True), \n",
571+
" pool = nn.AvgPool2d(2, ceil_mode=True), sa=0):\n",
571572
" super().__init__()\n",
572573
" self.name = name\n",
573574
" self.c_in, self.c_out,self.expansion,self.layers = c_in,c_out,expansion,layers # todo setter for expansion\n",
574-
" self.act_fn, self.pool, self.sa = act_fn, pool, sa\n",
575+
" self.block, self.act_fn, self.pool, self.sa = block, act_fn, pool, sa\n",
575576
" self.groups = 1\n",
576-
" \n",
577577
" self.stem_sizes = [c_in,32,32,64]\n",
578578
" self.stem_pool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n",
579+
" self.stem_stride_on = 0\n",
579580
" self.stem_bn_end = False\n",
580-
" self.block = ResBlock\n",
581581
" self.norm = nn.BatchNorm2d\n",
582582
" self.bn_1st = True\n",
583583
" self.zero_bn=True\n",
@@ -616,7 +616,7 @@
616616
" model.extra_repr = lambda : f\"model {self.name}\"\n",
617617
" return model\n",
618618
" def __repr__(self):\n",
619-
" return f\" constr {self.name}\\n expansion: {self.expansion}, sa: {self.sa}, groups: {self.groups}\\n stem sizes: {self.stem_sizes}\\n body sizes {self.block_szs}\""
619+
" return f\"{self.name} constructor\\n expansion: {self.expansion}, sa: {self.sa}, groups: {self.groups}\\n stem sizes: {self.stem_sizes}\\n body sizes {self.block_szs}\""
620620
]
621621
},
622622
{
@@ -636,7 +636,7 @@
636636
{
637637
"data": {
638638
"text/plain": [
639-
" constr Net\n",
639+
"Net constructor\n",
640640
" expansion: 1, sa: 0, groups: 1\n",
641641
" stem sizes: [3, 32, 32, 64]\n",
642642
" body sizes [64, 64, 128, 256, 512]"
@@ -709,6 +709,45 @@
709709
"model.stem"
710710
]
711711
},
712+
{
713+
"cell_type": "code",
714+
"execution_count": null,
715+
"metadata": {},
716+
"outputs": [
717+
{
718+
"data": {
719+
"text/plain": [
720+
"Sequential(\n",
721+
" (conv_0): ConvLayer(\n",
722+
" (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
723+
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
724+
" (act_fn): ReLU(inplace=True)\n",
725+
" )\n",
726+
" (conv_1): ConvLayer(\n",
727+
" (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
728+
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
729+
" (act_fn): ReLU(inplace=True)\n",
730+
" )\n",
731+
" (conv_2): ConvLayer(\n",
732+
" (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
733+
" (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
734+
" (act_fn): ReLU(inplace=True)\n",
735+
" )\n",
736+
" (stem_pool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
737+
")"
738+
]
739+
},
740+
"execution_count": null,
741+
"metadata": {},
742+
"output_type": "execute_result"
743+
}
744+
],
745+
"source": [
746+
"%nbdev_collapse_output\n",
747+
"model.stem_stride_on = 1\n",
748+
"model.stem"
749+
]
750+
},
712751
{
713752
"cell_type": "code",
714753
"execution_count": null,
@@ -1112,12 +1151,12 @@
11121151
"text/plain": [
11131152
"Sequential(\n",
11141153
" (conv_0): ConvLayer(\n",
1115-
" (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
1154+
" (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
11161155
" (act_fn): LeakyReLU(negative_slope=0.01, inplace=True)\n",
11171156
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
11181157
" )\n",
11191158
" (conv_1): ConvLayer(\n",
1120-
" (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
1159+
" (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
11211160
" (act_fn): LeakyReLU(negative_slope=0.01, inplace=True)\n",
11221161
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
11231162
" )\n",
@@ -1238,12 +1277,12 @@
12381277
" model Net\n",
12391278
" (stem): Sequential(\n",
12401279
" (conv_0): ConvLayer(\n",
1241-
" (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
1280+
" (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
12421281
" (act_fn): LeakyReLU(negative_slope=0.01, inplace=True)\n",
12431282
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
12441283
" )\n",
12451284
" (conv_1): ConvLayer(\n",
1246-
" (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
1285+
" (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
12471286
" (act_fn): LeakyReLU(negative_slope=0.01, inplace=True)\n",
12481287
" (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
12491288
" )\n",
@@ -1682,30 +1721,25 @@
16821721
"assert y.shape == torch.Size([bs_test, 1000]), f\"size expected {bs_test}, 1000\""
16831722
]
16841723
},
1685-
{
1686-
"cell_type": "markdown",
1687-
"metadata": {},
1688-
"source": [
1689-
"## xresnet constructor"
1690-
]
1691-
},
16921724
{
16931725
"cell_type": "code",
16941726
"execution_count": null,
16951727
"metadata": {},
16961728
"outputs": [],
16971729
"source": [
1698-
"%nbdev_export\n",
1699-
"# me = sys.modules[__name__]\n",
1700-
"# for n,e,l in [[ 18 , 1, [2,2,2 ,2] ],\n",
1701-
"# [ 34 , 1, [3,4,6 ,3] ],\n",
1702-
"# [ 50 , 4, [3,4,6 ,3] ],\n",
1703-
"# [ 101, 4, [3,4,23,3] ],\n",
1704-
"# [ 152, 4, [3,8,36,3] ],]:\n",
1705-
"# name = f'net{n}'\n",
1706-
"# setattr(me, name, partial(Net, expansion=e, layers=l, name=name))\n",
1707-
"net34 = partial(Net, expansion=1, layers=[3, 4, 6, 3], name='xresnet34')\n",
1708-
"net50 = partial(Net, expansion=4, layers=[3, 4, 6, 3], name='xresnet50')"
1730+
"## xresnet constructor\n",
1731+
"\n",
1732+
"# %nbdev_export\n",
1733+
"# # me = sys.modules[__name__]\n",
1734+
"# # for n,e,l in [[ 18 , 1, [2,2,2 ,2] ],\n",
1735+
"# # [ 34 , 1, [3,4,6 ,3] ],\n",
1736+
"# # [ 50 , 4, [3,4,6 ,3] ],\n",
1737+
"# # [ 101, 4, [3,4,23,3] ],\n",
1738+
"# # [ 152, 4, [3,8,36,3] ],]:\n",
1739+
"# # name = f'net{n}'\n",
1740+
"# # setattr(me, name, partial(Net, expansion=e, layers=l, name=name))\n",
1741+
"# net34 = partial(Net, expansion=1, layers=[3, 4, 6, 3], name='xresnet34')\n",
1742+
"# net50 = partial(Net, expansion=4, layers=[3, 4, 6, 3], name='xresnet50')"
17091743
]
17101744
},
17111745
{
@@ -1714,7 +1748,7 @@
17141748
"metadata": {},
17151749
"outputs": [],
17161750
"source": [
1717-
"m = net50(c_out=10)"
1751+
"# m = net50(c_out=10)"
17181752
]
17191753
},
17201754
{
@@ -1738,7 +1772,7 @@
17381772
}
17391773
],
17401774
"source": [
1741-
"m, m.c_out"
1775+
"# m, m.c_out"
17421776
]
17431777
},
17441778
{
@@ -1765,6 +1799,7 @@
17651799
"Converted 03_xresnet.ipynb.\n",
17661800
"Converted 04_Net.ipynb.\n",
17671801
"Converted 05_Twist.ipynb.\n",
1802+
"Converted 06_YResnet.ipynb.\n",
17681803
"Converted index.ipynb.\n"
17691804
]
17701805
}

0 commit comments

Comments
 (0)