class_docstr: Convolutional FFN module.
  
  Args:
      channels (`int`): input dimension (same as output dimension)
      internal_channels (`int`): hidden dimension
      drop_rate (`float`): drop rate of drop path
class_docstr_tok: ["Convolutional","FFN","module",".","Args",":","channels","(","`","int","`",")",":","input","dimension","(","same","as","output","dimension",")","internal_channels","(","`","int","`",")",":","hidden","dimension","drop_rate","(","`","float","`",")",":","drop","rate","of","drop","path"]
code: def __init__(self, channels, internal_channels, drop_rate):
      super().__init__()
      self.drop_path = (
          DropPath(drop_rate) if drop_rate > 0.0 else nn.Identity()
      )
      self.preffn_bn = nn.BatchNorm2d(channels)
      self.pw1 = conv_bn(
          in_channels=channels,
          out_channels=internal_channels,
          kernel_size=1,
          stride=1,
          padding=0,
          groups=1,
      )
      self.pw2 = conv_bn(
          in_channels=internal_channels,
          out_channels=channels,
          kernel_size=1,
          stride=1,
          padding=0,
          groups=1,
      )
      self.nonlinear = nn.GELU()
  
imports: from torch import nn
  from towhee.models.layers.droppath import DropPath
  from towhee.models.layers.conv_bn_activation import Conv2dBNActivation
label_desc: Use image node_id 1 to create a new ConvFFN object from inherited base classes: nn with example: obj = ConvFFN(channels, internal_channels, drop_rate)