code: def build(self, input_shape=None):
      if self.built:
          return
      self.built = True
      # Build in the build() method to make sure the names are right
      initializer = tf.keras.initializers.Constant(
          self.config.logit_scale_init_value
      )
      self.logit_scale = self.add_weight(
          shape=(1,), initializer=initializer, name="logit_scale"
      )
  
      if getattr(self, "visual_projection", None) is not None:
          with tf.name_scope(self.visual_projection.name):
              self.visual_projection.build(
                  [None, None, self.vision_embed_dim]
              )
      if getattr(self, "text_projection", None) is not None:
          with tf.name_scope(self.text_projection.name):
              self.text_projection.build(
                  [None, None, self.text_embed_dim]
              )
      with tf.name_scope(self.vision_model.name):
          self.vision_model.build(None)
      with tf.name_scope(self.text_model.name):
          self.text_model.build(None)
  
imports: from __future__ import annotations
  import re
  from typing import Optional, Tuple, Union
  import tensorflow
  from tensorflow.keras.layers import Dense
  from ...configuration_utils import PretrainedConfig
  from ...modeling_tf_utils import TFPreTrainedModel, unpack_inputs
  from ...tf_utils import shape_list
  from ...utils import DUMMY_INPUTS, add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings
  from ..auto.configuration_auto import AutoConfig
  from ..auto.modeling_tf_auto import TFAutoModel
  from ..clip.modeling_tf_clip import CLIPVisionConfig, TFCLIPOutput, TFCLIPVisionModel
  from .configuration_vision_text_dual_encoder import VisionTextDualEncoderConfig
label_desc: Use image node_id 2 for calling the TFVisionTextDualEncoderModel obj's underlying member method code with example usage: obj.build(input_shape) without return types