MCPcopy Index your code
hub / github.com/modelscope/FunASR / forward

Method forward

funasr/models/e_branchformer/encoder.py:423–503  ·  view source on GitHub ↗

Calculate forward propagation. Args: xs_pad (torch.Tensor): Input tensor (#batch, L, input_size). ilens (torch.Tensor): Input length (#batch). prev_states (torch.Tensor): Not to be used now. ctc (CTC): Intermediate CTC module. max_

(
        self,
        xs_pad: torch.Tensor,
        ilens: torch.Tensor,
        prev_states: torch.Tensor = None,
        ctc: CTC = None,
        max_layer: int = None,
    )

Source from the content-addressed store, hash-verified

421 return self._output_size
422
423 def forward(
424 self,
425 xs_pad: torch.Tensor,
426 ilens: torch.Tensor,
427 prev_states: torch.Tensor = None,
428 ctc: CTC = None,
429 max_layer: int = None,
430 ) -> Tuple[torch.Tensor, torch.Tensor, Optional[torch.Tensor]]:
431 """Calculate forward propagation.
432
433 Args:
434 xs_pad (torch.Tensor): Input tensor (#batch, L, input_size).
435 ilens (torch.Tensor): Input length (#batch).
436 prev_states (torch.Tensor): Not to be used now.
437 ctc (CTC): Intermediate CTC module.
438 max_layer (int): Layer depth below which InterCTC is applied.
439 Returns:
440 torch.Tensor: Output tensor (#batch, L, output_size).
441 torch.Tensor: Output length (#batch).
442 torch.Tensor: Not to be used now.
443 """
444
445 masks = (~make_pad_mask(ilens)[:, None, :]).to(xs_pad.device)
446
447 if (
448 isinstance(self.embed, Conv2dSubsampling)
449 or isinstance(self.embed, Conv2dSubsampling2)
450 or isinstance(self.embed, Conv2dSubsampling6)
451 or isinstance(self.embed, Conv2dSubsampling8)
452 ):
453 short_status, limit_size = check_short_utt(self.embed, xs_pad.size(1))
454 if short_status:
455 raise TooShortUttError(
456 f"has {xs_pad.size(1)} frames and is too short for subsampling "
457 + f"(it needs more than {limit_size} frames), return empty results",
458 xs_pad.size(1),
459 limit_size,
460 )
461 xs_pad, masks = self.embed(xs_pad, masks)
462 elif self.embed is not None:
463 xs_pad = self.embed(xs_pad)
464
465 intermediate_outs = []
466 if len(self.interctc_layer_idx) == 0:
467 if max_layer is not None and 0 <= max_layer < len(self.encoders):
468 for layer_idx, encoder_layer in enumerate(self.encoders):
469 xs_pad, masks = encoder_layer(xs_pad, masks)
470 if layer_idx >= max_layer:
471 break
472 else:
473 xs_pad, masks = self.encoders(xs_pad, masks)
474 else:
475 for layer_idx, encoder_layer in enumerate(self.encoders):
476 xs_pad, masks = encoder_layer(xs_pad, masks)
477
478 if layer_idx + 1 in self.interctc_layer_idx:
479 encoder_out = xs_pad
480

Callers

nothing calls this directly

Calls 4

make_pad_maskFunction · 0.90
check_short_uttFunction · 0.90
TooShortUttErrorClass · 0.90
softmaxMethod · 0.45

Tested by

no test coverage detected