docstr: This function places the continuous_embeddings into the word_embeddings at the locations
  indicated by image_patch_input_indices. Different batch elements can have different numbers of continuous
  embeddings.
  
  Args:
      word_embeddings (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):
          Tensor of word embeddings.
      continuous_embeddings (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`):
          Tensor of continuous embeddings. The length of the list is the batch size. Each entry is shape
          [num_image_embeddings, hidden], and num_image_embeddings needs to match the number of non-negative
          indices in image_patch_input_indices for that batch element.
      image_patch_input_indices (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
          Tensor of indices of the image patches in the input_ids tensor.
docstr_tok: ["This","function","places","the","continuous_embeddings","into","the","word_embeddings","at","the","locations","indicated","by","image_patch_input_indices",".","Different","batch","elements","can","have","different","numbers","of","continuous","embeddings",".","Args",":","word_embeddings","(","`","torch.FloatTensor","`","of","shape","`","(","batch_size",",","sequence_length",",","hidden_size",")","`",")",":","Tensor","of","word","embeddings",".","continuous_embeddings","(","`","torch.FloatTensor","`","of","shape","`","(","batch_size",",","num_patches",",","hidden_size",")","`",")",":","Tensor","of","continuous","embeddings",".","The","length","of","the","list","is","the","batch","size",".","Each","entry","is","shape","[","num_image_embeddings",",","hidden","]",",","and","num_image_embeddings","needs","to","match","the","number","of","non-negative","indices","in","image_patch_input_indices","for","that","batch","element",".","image_patch_input_indices","(","`","torch.LongTensor","`","of","shape","`","(","batch_size",",","sequence_length",")","`",")",":","Tensor","of","indices","of","the","image","patches","in","the","input_ids","tensor","."]
code: def gather_continuous_embeddings(
      self,
      word_embeddings: torch.Tensor,
      continuous_embeddings: List[torch.Tensor],
      image_patch_input_indices: torch.Tensor,
  ) -> torch.Tensor:
      """This function places the continuous_embeddings into the word_embeddings at the locations
      indicated by image_patch_input_indices. Different batch elements can have different numbers of continuous
      embeddings.
  
      Args:
          word_embeddings (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):
              Tensor of word embeddings.
          continuous_embeddings (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`):
              Tensor of continuous embeddings. The length of the list is the batch size. Each entry is shape
              [num_image_embeddings, hidden], and num_image_embeddings needs to match the number of non-negative
              indices in image_patch_input_indices for that batch element.
          image_patch_input_indices (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
              Tensor of indices of the image patches in the input_ids tensor.
      """
      if not (word_embeddings.shape[0] == len(continuous_embeddings)):
          raise ValueError(
              f"Batch sizes must match! Got {len(continuous_embeddings)=} and {word_embeddings.shape[0]=}"
          )
  
      output_embeddings = word_embeddings.clone()
      for batch_idx in range(word_embeddings.shape[0]):
          # First, find the positions of all the non-negative values in image_patch_input_indices, those are the
          # positions in word_embeddings that we want to replace with content from continuous_embeddings.
          dst_indices = torch.nonzero(
              image_patch_input_indices[batch_idx] >= 0, as_tuple=True
          )[0]
          # Next look up those indices in image_patch_input_indices to find the indices in continuous_embeddings that we
          # want to use to replace the values in word_embeddings.
          src_indices = image_patch_input_indices[batch_idx][
              dst_indices
          ]
          # Check if we have more indices than embeddings. Note that we could have fewer indices if images got truncated.
          if (
              src_indices.shape[0]
              > continuous_embeddings[batch_idx].shape[0]
          ):
              raise ValueError(
                  f"Number of continuous embeddings {continuous_embeddings[batch_idx].shape=} does not match "
                  f"number of continuous token ids {src_indices.shape=} in batch element {batch_idx}."
              )
          output_embeddings[
              batch_idx, dst_indices
          ] = continuous_embeddings[batch_idx][src_indices]
      return output_embeddings
  
file_path: transformers/src/transformers/models/fuyu/modeling_fuyu.py
imports: from typing import List, Optional, Tuple, Union
  import torch
  import torch.utils.checkpoint
  from torch import nn
  from ...modeling_outputs import CausalLMOutputWithPast
  from ...modeling_utils import PreTrainedModel
  from ...models.auto.modeling_auto import AutoModelForCausalLM
  from ...utils import add_start_docstrings, add_start_docstrings_to_model_forward, logging, replace_return_docstrings
  from .configuration_fuyu import FuyuConfig
label_desc: Use image node_id 4 for calling the FuyuForCausalLM obj's underlying member method code with example usage: obj.gather_continuous_embeddings(word_embeddings, continuous_embeddings, image_patch_input_indices) and returns: output_embeddings