def combine(self, expert_out, multiply_by_gates=True):
    """Sum together the expert output, multiplied by the corresponding gates.

    Args:
      expert_out: a list of `num_experts` `Tensor`s, each with shape
        `[expert_batch_size_i, <extra_output_dims>]`.
      multiply_by_gates: a boolean.

    Returns:
      a list of num_datashards `Tensor`s with shapes
        `[batch_size[d], <extra_output_dims>]`.
    """
    expert_part_sizes = tf.unstack(
        tf.stack([d.part_sizes for d in self._dispatchers]),
        num=self._ep.n,
        axis=1)
    # list of lists of shape [num_experts][num_datashards]
    expert_output_parts = self._ep(tf.split, expert_out, expert_part_sizes)
    expert_output_parts_t = transpose_list_of_lists(expert_output_parts)
    def my_combine(dispatcher, parts):
      return dispatcher.combine(
          common_layers.convert_gradient_to_tensor(tf.concat(parts, 0)),
          multiply_by_gates=multiply_by_gates)
    return self._dp(my_combine, self._dispatchers, expert_output_parts_t)
def combine ( self , expert_out , multiply_by_gates = True ) : expert_part_sizes = tf . unstack ( tf . stack ( [ d . part_sizes for d in self . _dispatchers ] ) , num = self . _ep . n , axis = 1 ) expert_output_parts = self . _ep ( tf . split , expert_out , expert_part_sizes ) expert_output_parts_t = transpose_list_of_lists ( expert_output_parts ) def my_combine ( dispatcher , parts ) : return dispatcher . combine ( common_layers . convert_gradient_to_tensor ( tf . concat ( parts , 0 ) ) , multiply_by_gates = multiply_by_gates ) return self . _dp ( my_combine , self . _dispatchers , expert_output_parts_t )
Sum together the expert output, multiplied by the corresponding gates.

    Args:
      expert_out: a list of `num_experts` `Tensor`s, each with shape
        `[expert_batch_size_i, <extra_output_dims>]`.
      multiply_by_gates: a boolean.

    Returns:
      a list of num_datashards `Tensor`s with shapes
        `[batch_size[d], <extra_output_dims>]`.