def __init__(self, blocks_args=None, global_params=None): super().__init__() assert isinstance(blocks_args, list), 'blocks_args should be a list' assert len(blocks_args) > 0, 'block args must be greater than 0' self._global_params = global_params self._blocks_args = blocks_args # Build blocks self._blocks = nn.ModuleList([]) self._array = [] for block_args in self._blocks_args: self.temp = [] # Update block input and output filters based on depth multiplier. block_args = block_args._replace( input_filters=round_filters(block_args.input_filters, self._global_params), output_filters=round_filters(block_args.output_filters, self._global_params), num_repeat=round_repeats(block_args.num_repeat, self._global_params)) # The first block needs to take care of stride and filter size increase. self._blocks.append(MBConvBlock(block_args, self._global_params)) self.temp.append(MBConvBlock(block_args, self._global_params)) if block_args.num_repeat > 1: block_args = block_args._replace( input_filters=block_args.output_filters, stride=1) for _ in range(block_args.num_repeat - 1): self._blocks.append( MBConvBlock(block_args, self._global_params)) self.temp.append(MBConvBlock(block_args, self._global_params)) self._array.append(nn.Sequential(*self.temp))
def __init__(self, blocks_args=None, global_params=None): super().__init__() assert isinstance(blocks_args, list), 'blocks_args should be a list' assert len(blocks_args) > 0, 'block args must be greater than 0' self._global_params = global_params self._blocks_args = blocks_args Conv2d = get_same_padding_conv2d(image_size=global_params.image_size) bn_mom = 1 - self._global_params.batch_norm_momentum bn_eps = self._global_params.batch_norm_epsilon in_channels = 3 # rgb out_channels = round_filters( 32, self._global_params) # number of output channels self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) self._bn0 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) self._blocks = nn.ModuleList([]) for block_args in self._blocks_args: # Update block input and output filters based on depth multiplier. block_args = block_args._replace( input_filters=round_filters(block_args.input_filters, self._global_params), output_filters=round_filters(block_args.output_filters, self._global_params), num_repeat=round_repeats(block_args.num_repeat, self._global_params)) self._blocks.append(MBConvBlock(block_args, self._global_params)) if block_args.num_repeat > 1: block_args = block_args._replace( input_filters=block_args.output_filters, stride=1) for _ in range(block_args.num_repeat - 1): self._blocks.append( MBConvBlock(block_args, self._global_params)) in_channels = block_args.output_filters # output of final block out_channels = round_filters(1280, self._global_params) self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False) self._bn1 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) self._dropout = self._global_params.dropout_rate self._fc = nn.Linear(out_channels, self._global_params.num_classes)
def __init__(self, blocks_args=None, global_params=None): super().__init__() assert isinstance(blocks_args, list), "blocks_args should be a list" assert len(blocks_args) > 0, "block args must be greater than 0" self._global_params = global_params self._blocks_args = blocks_args # Get static or dynamic convolution depending on image size Conv2d = get_same_padding_conv2d(image_size=global_params.image_size) # Batch norm parameters bn_mom = 1 - self._global_params.batch_norm_momentum bn_eps = self._global_params.batch_norm_epsilon # Build blocks self._blocks = nn.ModuleList([]) for i, block_args in enumerate(self._blocks_args): # Update block input and output filters based on depth multiplier. block_args = block_args._replace( input_filters=round_filters(block_args.input_filters, self._global_params), output_filters=round_filters(block_args.output_filters, self._global_params), num_repeat=round_repeats(block_args.num_repeat, self._global_params), ) print(i, block_args) # The first block needs to take care of stride and filter size increase. self._blocks.append(MBConvBlock(block_args, self._global_params)) if block_args.num_repeat > 1: block_args = block_args._replace( input_filters=block_args.output_filters, stride=1) for _ in range(block_args.num_repeat - 1): self._blocks.append( MBConvBlock(block_args, self._global_params)) # Head in_channels = block_args.output_filters # output of final block out_channels = round_filters(1280, self._global_params) self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False) self._bn1 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) # Define the activation function self._swish = MemoryEfficientSwish()
def __init__(self, blocks_args=None, global_params=None): super().__init__() assert isinstance(blocks_args, list), 'blocks_args should be a list' assert len(blocks_args) > 0, 'block args must be greater than 0' self._global_params = global_params self._blocks_args = blocks_args # Get static or dynamic convolution depending on image size Conv2d = get_same_padding_conv2d(image_size=global_params.image_size) # Batch norm parameters bn_mom = 1 - self._global_params.batch_norm_momentum bn_eps = self._global_params.batch_norm_epsilon # Stem in_channels = 3 # rgb out_channels = round_filters(32, self._global_params) # number of output channels self._conv_stem = Conv2d(in_channels, out_channels, kernel_size=3, stride=2, bias=False) self._bn0 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) # Build blocks self._blocks = nn.ModuleList([]) for block_args in self._blocks_args: # Update block input and output filters based on depth multiplier. block_args = block_args._replace( input_filters=round_filters(block_args.input_filters, self._global_params), output_filters=round_filters(block_args.output_filters, self._global_params), num_repeat=round_repeats(block_args.num_repeat, self._global_params) ) # The first block needs to take care of stride and filter size increase. self._blocks.append(MBConvBlock(block_args, self._global_params)) if block_args.num_repeat > 1: block_args = block_args._replace(input_filters=block_args.output_filters, stride=1) for _ in range(block_args.num_repeat - 1): self._blocks.append(MBConvBlock(block_args, self._global_params)) # Head in_channels = block_args.output_filters # output of final block out_channels = round_filters(1280, self._global_params) self._conv_head = Conv2d(in_channels, out_channels, kernel_size=1, bias=False) self._bn1 = nn.BatchNorm2d(num_features=out_channels, momentum=bn_mom, eps=bn_eps) # Final linear layer self._avg_pooling = nn.AdaptiveAvgPool2d(1) self._dropout = nn.Dropout(self._global_params.dropout_rate) self._fc = nn.Linear(out_channels, self._global_params.num_classes) self._swish = MemoryEfficientSwish()
def __init__( self, efficientnet: nn.Module, input_size: int, extract_blocks: Iterable[int] = [5], freeze: bool = False, ) -> NoReturn: super().__init__() self.freeze = freeze self.input_size = input_size self._global_params = efficientnet._global_params # Forget about the fc layers, but copy out everything else. self._conv_stem = efficientnet._conv_stem self._bn0 = efficientnet._bn0 self._swish = efficientnet._swish # EfficientNet saves all layers (including repeats) in a flat _blocks # parameter. To keep the model comparable we keep the same approach # but map to extract_blocks when needed. self.block_to_layer = [-1] # block index to layer index (w/o first). self.layer_to_block = {} # Probably a bit more efficient forward pass. layer = -1 for i, block_args in enumerate(efficientnet._blocks_args): block_args = block_args._replace(num_repeat=round_repeats( block_args.num_repeat, self._global_params)) layer += block_args.num_repeat self.block_to_layer.append(layer) self.layer_to_block[layer] = i + 1 assert layer == len(efficientnet._blocks) - 1 # Last layer. # Attach blocks only as needed. assert len(extract_blocks) == len(set( extract_blocks)), "extract_blocks must only contain unique indices" assert (sorted(extract_blocks) == extract_blocks ), "attach_block must be sorted in increasing order" # Last two blocks are conv & fc layer assert set(extract_blocks) <= set( range(len(self.block_to_layer) + 1)), "only block indices from 0 to {} are valid".format( len(self.block_to_layer)) self.extract_blocks = extract_blocks max_block = max(extract_blocks) if max_block < len(self.block_to_layer) - 1: # Last layer inclusive. self._blocks = efficientnet._blocks[:self. block_to_layer[max_block] + 1] else: self._blocks = efficientnet._blocks self.orig_len_blocks = len(efficientnet._blocks) # For drop connect. if max_block >= len(self.block_to_layer): self._conv_head = efficientnet._conv_head self._bn1 = efficientnet._bn1 if max_block == len(self.block_to_layer) + 1: self._avg_pooling = efficientnet._avg_pooling self._dropout = efficientnet._dropout self.fc = efficientnet._fc # freeze learnable model parameters if self.freeze: for param in self.parameters(): param.requires_grad = False
import torch