class_docstr: A block containing multiple subsequent vgg style convolutions.
  
  One convolution stack consists of two subsequent 3x3 convolution layers followed by 2x2 max pooling.
  The block expects the input tensors to have the from (batch-dim, channel-dim, row-dim, column-dim).
  
  :param in_keys: One key identifying the input tensors.
  :param out_keys: One key identifying the output tensors.
  :param in_shapes: List of input shapes.
  :param hidden_channels: List containing the number of hidden channels for hidden layers.
  :param non_lin: The non-linearity to apply after each layer.
class_docstr_tok: ["A","block","containing","multiple","subsequent","vgg","style","convolutions",".","One","convolution","stack","consists","of","two","subsequent","3x3","convolution","layers","followed","by","2x2","max","pooling",".","The","block","expects","the","input","tensors","to","have","the","from","(","batch-dim",",","channel-dim",",","row-dim",",","column-dim",")",".",":","param","in_keys",":","One","key","identifying","the","input","tensors",".",":","param","out_keys",":","One","key","identifying","the","output","tensors",".",":","param","in_shapes",":","List","of","input","shapes",".",":","param","hidden_channels",":","List","containing","the","number","of","hidden","channels","for","hidden","layers",".",":","param","non_lin",":","The","non-linearity","to","apply","after","each","layer","."]
docstr: Compiles a block-specific dictionary of network layers.
  This could be overwritten by derived layers
  (e.g. to get a 'BatchNormalizedConvolutionBlock').
  
  :return: Ordered dictionary of torch modules [str, nn.Module]
docstr_tok: ["Compiles","a","block-specific","dictionary","of","network","layers",".","This","could","be","overwritten","by","derived","layers","(","e.g",".","to","get","a","'BatchNormalizedConvolutionBlock","'",")",".",":","return",":","Ordered","dictionary","of","torch","modules","[","str",",","nn.Module","]"]
code: def build_layer_dict(self) -> OrderedDict:
      """Compiles a block-specific dictionary of network layers.
      This could be overwritten by derived layers
      (e.g. to get a 'BatchNormalizedConvolutionBlock').
  
      :return: Ordered dictionary of torch modules [str, nn.Module]
      """
      layer_dict = OrderedDict()
  
      # treat first layer
      layer_dict["conv_00"] = nn.Conv2d(
          in_channels=self.input_channels,
          out_channels=self.hidden_channels[0],
          kernel_size=3,
          stride=1,
          padding=1,
      )
      layer_dict[f"{self.non_lin.__name__}_00"] = self.non_lin()
  
      layer_dict["conv_01"] = nn.Conv2d(
          in_channels=self.hidden_channels[0],
          out_channels=self.hidden_channels[0],
          kernel_size=3,
          stride=1,
          padding=1,
      )
      layer_dict[f"{self.non_lin.__name__}_01"] = self.non_lin()
  
      layer_dict["pool_01"] = nn.MaxPool2d(
          kernel_size=2, stride=2, padding=0
      )
  
      # treat remaining layers
      for i, h in enumerate(self.hidden_channels[1:], start=1):
          layer_dict[f"conv_{i}0"] = nn.Conv2d(
              in_channels=self.hidden_channels[i - 1],
              out_channels=self.hidden_channels[i],
              kernel_size=3,
              stride=1,
              padding=1,
          )
          layer_dict[f"{self.non_lin.__name__}_{i}0"] = self.non_lin()
  
          layer_dict[f"conv_{i}1"] = nn.Conv2d(
              in_channels=self.hidden_channels[i],
              out_channels=self.hidden_channels[i],
              kernel_size=3,
              stride=1,
              padding=1,
          )
          layer_dict[f"{self.non_lin.__name__}_{i}1"] = self.non_lin()
  
          layer_dict[f"pool_{i}1"] = nn.MaxPool2d(
              kernel_size=2, stride=2, padding=0
          )
  
      return layer_dict
  
file_path: maze/maze/perception/blocks/feed_forward/vgg_conv.py
imports: from collections import OrderedDict
  from typing import Union, List, Sequence, Dict
  import torch
  from torch import nn
  from maze.core.annotations import override
  from maze.core.utils.factory import Factory
  from maze.perception.blocks.shape_normalization import ShapeNormalizationBlock
label_desc: Use image node_id 3 for calling the VGGConvolutionBlock obj's underlying member method code with example usage: obj.build_layer_dict() and returns: layer_dict