{"record":{"id":"b0b1bc6733427468","repo":"tensorflow/models","slug":"batch-norm-layer-is-not-a-class","errorCode":null,"errorMessage":"batch_norm_layer is not a class.","messagePattern":"batch_norm_layer is not a class\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"official/projects/edgetpu/vision/modeling/custom_layers.py","lineNumber":122,"sourceCode":"      ValueError: if `padding` is not `same` or `valid`.\n      ValueError: if `batch_norm_layer` is not a callable when provided.\n      ValueError: when both `strides` > 1 and `dilation_rate` > 1.\n    \"\"\"\n    if groups <= 1 or groups > filters:\n      raise ValueError(f'Number of groups {groups} should be greater than 1 and'\n                       f' less or equal than the output filters {filters}.')\n    self._groups = groups\n    if data_format != 'channels_last':\n      raise ValueError(\n          'GroupConv2D expects input to be in channels_last format.')\n\n    if padding.lower() not in ('same', 'valid'):\n      raise ValueError('Valid padding options are : same, or valid.')\n\n    self.use_batch_norm = False\n    if batch_norm_layer is not None:\n      if not inspect.isclass(batch_norm_layer):\n        raise ValueError('batch_norm_layer is not a class.')\n      self.use_batch_norm = True\n    self.bn_epsilon = bn_epsilon\n    self.bn_momentum = bn_momentum\n    self.batch_norm_layer = []\n    if self.use_batch_norm:\n      self.batch_norm_layer = [\n          batch_norm_layer(  # pyrefly: ignore[not-callable]\n              axis=-1, momentum=self.bn_momentum, epsilon=self.bn_epsilon)\n          for i in range(self._groups)\n      ]\n\n    super().__init__(\n        filters=filters,\n        kernel_size=kernel_size,\n        strides=strides,\n        padding=padding,\n        data_format=data_format,\n        dilation_rate=dilation_rate,","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/tensorflow/models/blob/e006f5f0d534913e49c1f1dae87364039fa607e2/official/projects/edgetpu/vision/modeling/custom_layers.py#L104-L140","documentation":"Error \"batch_norm_layer is not a class.\" thrown in tensorflow/models.","triggerScenarios":"Thrown at official/projects/edgetpu/vision/modeling/custom_layers.py:122 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e006f5f0d534913e49c1f1dae87364039fa607e2","analyzedAt":"2026-08-24T14:09:15.576Z","schemaVersion":2},"datasetVersion":"2026-08-24T17:17:21.512Z"}