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,
)
| 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 |
nothing calls this directly
no test coverage detected