class_docstr: Implements Conv3d + Bn + Activation for pointwise layers.
  The conv layer has fixed kernel_size = (1,1,1),
  groups = 1, padding = 0, stride = 1, dilation = 1.
  
                        Input
                          |
                          ↓
                      conv3d (1x1x1)
                          ↓
                      BatchNorm (optional)
                          ↓
                      Activation
  
  Conv3dPwBnAct is in original form (for training) once instantiated. User can
  call convert() method to convert it into deployable form for deployment.
  
  convert_flag variable is to record whether the Conv3dPwBnAct instance
  has been converted; Conv3dPwBnAct is in original form if convert_flag is false,
  while it is in deployable form if convert_flag is true.
  
  Current implementation of this layer in QNNPACK is very efficient.
  Args:
      in_channels (int): number of input channels for conv3d 1x1x1.
      out_channels (int): number of output channels for conv3d 1x1x1.
      bias (bool): if true, use bias for conv.
      activation (str): applies selected activation from supported_act_functions.
          See activation_functions.py for more info about supported activations.
          Currently ReLU ('relu'), Swish ('swish'), Hardswish ('hswish'), Identity
          ('identity') are supported.
      use_bn (bool): if true, use batchnorm.
      norm_eps (float): epsilon for batchnorm.
      norm_momentum (float): momentum for batchnorm.
class_docstr_tok: ["Implements","Conv3d","+","Bn","+","Activation","for","pointwise","layers",".","The","conv","layer","has","fixed","kernel_size","=","(","1,1,1",")",",","groups","=","1",",","padding","=","0",",","stride","=","1",",","dilation","=","1",".","Input","|","\u2193","conv3d","(","1x1x1",")","\u2193","BatchNorm","(","optional",")","\u2193","Activation","Conv3dPwBnAct","is","in","original","form","(","for","training",")","once","instantiated",".","User","can","call","convert","(",")","method","to","convert","it","into","deployable","form","for","deployment",".","convert_flag","variable","is","to","record","whether","the","Conv3dPwBnAct","instance","has","been","converted",";","Conv3dPwBnAct","is","in","original","form","if","convert_flag","is","false",",","while","it","is","in","deployable","form","if","convert_flag","is","true",".","Current","implementation","of","this","layer","in","QNNPACK","is","very","efficient",".","Args",":","in_channels","(","int",")",":","number","of","input","channels","for","conv3d","1x1x1",".","out_channels","(","int",")",":","number","of","output","channels","for","conv3d","1x1x1",".","bias","(","bool",")",":","if","true",",","use","bias","for","conv",".","activation","(","str",")",":","applies","selected","activation","from","supported_act_functions",".","See","activation_functions.py","for","more","info","about","supported","activations",".","Currently","ReLU","(","'relu","'",")",",","Swish","(","'swish","'",")",",","Hardswish","(","'hswish","'",")",",","Identity","(","'identity","'",")","are","supported",".","use_bn","(","bool",")",":","if","true",",","use","batchnorm",".","norm_eps","(","float",")",":","epsilon","for","batchnorm",".","norm_momentum","(","float",")",":","momentum","for","batchnorm","."]
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      bias=False,
      activation: str = "relu",
      use_bn=True,
      norm_eps: float = 1e-5,
      norm_momentum: float = 0.1,
  ):
      super().__init__()
      self._in_channels = in_channels
      self._out_channels = out_channels
      self.act = activation
      kernel = OrderedDict()
      kernel["conv"] = nn.Conv3d(
          in_channels, out_channels, kernel_size=1, bias=bias
      )
      if use_bn:
          kernel["bn"] = nn.BatchNorm3d(
              out_channels, eps=norm_eps, momentum=norm_momentum
          )
      assert (
          activation in supported_act_functions
      ), f"Conv3dPwBnAct: {activation} is not in supported_act_functions."
      kernel["act"] = supported_act_functions[activation]()
      self.kernel = nn.Sequential(kernel)
      self.convert_flag = False
  
imports: import logging
  from collections import OrderedDict
  from typing import Tuple
  import torch
  import torch.nn
  from pytorchvideo.accelerator.efficient_blocks.efficient_block_base import EfficientBlockBase
  from .activation_functions import supported_act_functions
  from .conv_helper import _Conv3dTemporalKernel1Decomposed, _Conv3dTemporalKernel3Decomposed, _Conv3dTemporalKernel5Decomposed, _Reshape
label_desc: Use image node_id 1 to create a new Conv3dPwBnAct object from inherited base classes: EfficientBlockBase with example: obj = Conv3dPwBnAct(in_channels, out_channels, bias, activation, use_bn, norm_eps, norm_momentum)