Pimed / training_code /model /resnet.py
deboraJ23's picture
upload training_code
64fd08f verified
Raw History Blame Contribute Delete
2.11 kB
import torch
import torch.nn as nn
from monai.networks.nets import ResNet
from monai.networks.nets.resnet import ResNetBlock, ResNetBottleneck
class Resnet(nn.Module):
def __init__(self, model_name: str, num_classes: int, norm: str = "batch"):
super().__init__()
self.model_name = model_name
valid_model_names = ["resnet10", "resnet18", "resnet34", "resnet50", "resnet101", "resnet152", "resnet200"]
assert self.model_name in valid_model_names, f"Model name must be one of {valid_model_names}"
# Get default resnet parameters
# >> model_name: (block, layers, shortcut_type, bias_downsample)
resnet_params = {
"resnet10": ("basic", [1, 1, 1, 1], "B", False),
"resnet18": ("basic", [2, 2, 2, 2], "A", True),
"resnet34": ("basic", [3, 4, 6, 3], "A", True),
"resnet50": ("bottleneck", [3, 4, 6, 3], "B", False),
"resnet101": ("bottleneck", [3, 4, 23, 3], "B", False),
"resnet152": ("bottleneck", [3, 8, 36, 3], "B", False),
"resnet200": ("bottleneck", [3, 24, 36, 3], "B", False),
}
block, layers, shortcut_type, bias_downsample = resnet_params[self.model_name]
block = ResNetBlock if block == "basic" else ResNetBottleneck
# Get default norm parameters
norm_mapper = {
"group": ("group", {"num_groups": 8}),
"instance": ("instance", {"affine": True}),
"batch": "batch"
}
_norm = norm_mapper[norm]
# Create resnet model
self.net = ResNet(
block=block,
layers=layers,
block_inplanes=[64, 128, 256, 512],
spatial_dims=3,
n_input_channels=1,
num_classes=num_classes,
bias_downsample=bias_downsample,
shortcut_type=shortcut_type,
norm=_norm
)
return
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.net(x)