Module brevettiai.model.factory.lenet_backbone

Expand source code
""""""
from functools import partial
from typing import List
from typing_extensions import Literal
from pydantic import Field
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Conv2D
from tensorflow.keras import layers

from brevettiai.model.factory import ModelFactory


class LeNetSegmentationBackbone(ModelFactory):
    """
    Derived from [Backpropagation Applied to Handwritten Zip Code Recognition](https://direct.mit.edu/neco/article-abstract/1/4/541/5515/Backpropagation-Applied-to-Handwritten-Zip-Code?redirectedFrom=fulltext)
    """
    output_layers: List[str]
    layers: int = 3
    filters: int = 8
    filter_bank_multiplier: float = 2.0
    activation: str = Field(default="relu")
    pooling: Literal["AvgPool2D", "MaxPool2D"] = Field(default="MaxPool2D")
    padding: Literal["SAME", "VALID"] = Field(default="SAME")
    kernel_size: List = Field(default=[3, 3], description="Kernel size for convolutional kernels")

    def build(self, input_shape, *args, **kwargs):
        backbone = Sequential(name="BaseLeNetBackbone")
        pooling_factory = lambda : getattr(layers, self.pooling)

        filters = self.filters
        backbone.add(Conv2D(filters, self.kernel_size, 1,
                            input_shape=input_shape,
                            activation=self.activation,
                            name="conv2d_1",
                            padding=self.padding))

        for layer in range(1, self.layers):
            filters = int(filters * self.filter_bank_multiplier)
            backbone.add(pooling_factory()((2, 2), name=f"{self.pooling.lower()}_{layer}"))
            backbone.add(Conv2D(filters, self.kernel_size, 1, activation=self.activation, name=f"conv2d_{layer + 1}",
                                padding=self.padding))

        backbone = Model(backbone.input, [backbone.get_layer(l).output for l in self.output_layers],
                                  name="LeNetBackbone")

        return backbone


lenet_backbone = partial(
    LeNetSegmentationBackbone,
    layers=6,
    filter_bank_multiplier=1.5,
    padding="VALID",
    output_layers=['conv2d_5', 'conv2d_6']) #'conv2d_4',

Classes

class LeNetSegmentationBackbone (**data: Any)

Derived from Backpropagation Applied to Handwritten Zip Code Recognition

Create a new model by parsing and validating input data from keyword arguments.

Raises ValidationError if the input data cannot be parsed to form a valid model.

Expand source code
class LeNetSegmentationBackbone(ModelFactory):
    """
    Derived from [Backpropagation Applied to Handwritten Zip Code Recognition](https://direct.mit.edu/neco/article-abstract/1/4/541/5515/Backpropagation-Applied-to-Handwritten-Zip-Code?redirectedFrom=fulltext)
    """
    output_layers: List[str]
    layers: int = 3
    filters: int = 8
    filter_bank_multiplier: float = 2.0
    activation: str = Field(default="relu")
    pooling: Literal["AvgPool2D", "MaxPool2D"] = Field(default="MaxPool2D")
    padding: Literal["SAME", "VALID"] = Field(default="SAME")
    kernel_size: List = Field(default=[3, 3], description="Kernel size for convolutional kernels")

    def build(self, input_shape, *args, **kwargs):
        backbone = Sequential(name="BaseLeNetBackbone")
        pooling_factory = lambda : getattr(layers, self.pooling)

        filters = self.filters
        backbone.add(Conv2D(filters, self.kernel_size, 1,
                            input_shape=input_shape,
                            activation=self.activation,
                            name="conv2d_1",
                            padding=self.padding))

        for layer in range(1, self.layers):
            filters = int(filters * self.filter_bank_multiplier)
            backbone.add(pooling_factory()((2, 2), name=f"{self.pooling.lower()}_{layer}"))
            backbone.add(Conv2D(filters, self.kernel_size, 1, activation=self.activation, name=f"conv2d_{layer + 1}",
                                padding=self.padding))

        backbone = Model(backbone.input, [backbone.get_layer(l).output for l in self.output_layers],
                                  name="LeNetBackbone")

        return backbone

Ancestors

  • ModelFactory
  • abc.ABC
  • pydantic.main.BaseModel
  • pydantic.utils.Representation

Class variables

var activation : str
var filter_bank_multiplier : float
var filters : int
var kernel_size : List[~T]
var layers : int
var output_layers : List[str]
var padding : typing_extensions.Literal['SAME', 'VALID']
var pooling : typing_extensions.Literal['AvgPool2D', 'MaxPool2D']

Inherited members