speechbrain.nnet.RNN 模块

实现循环神经网络的库。

Authors
  • 阿德尔·穆门 2023

  • Mirco Ravanelli 2020

  • 周珏洁 2020

  • 钟建元 2020

  • 洛伦·卢戈斯奇 2020

摘要

类:

AttentionalRNNDecoder

此函数实现了带有注意力的RNN解码器模型。

GRU

此函数实现了一个基本的GRU。

GRUCell

这个类实现了一个基本的GRU单元,用于处理单个时间步的输入,而GRU()则接受整个序列作为输入。

LSTM

此函数实现了一个基本的LSTM。

LSTMCell

该类实现了一个基本的LSTM单元,用于处理单个时间步的输入,而LSTM()则接受整个序列作为输入。

LiGRU

此函数实现了轻量级GRU(Li-GRU)。

LiGRU_Layer

该类实现了轻量门控循环单元(Li-GRU)层。

QuasiRNN

这是Quasi-RNN的一个实现。

QuasiRNNLayer

将单层准循环神经网络(QRNN)应用于输入序列。

RNN

此函数实现了一个普通的RNN。

RNNCell

该类实现了一个基本的RNN单元,用于处理单个时间步的输入,而RNN()则将整个序列作为输入。

SLiGRU

该类实现了一个稳定的轻量级GRU(SLi-GRU)。

SLiGRU_Layer

该类实现了一个稳定的轻门控循环单元(SLi-GRU)层。

函数:

pack_padded_sequence

返回打包的speechbrain格式张量。

pad_packed_sequence

从打包的序列中返回speechbrain格式的张量。

rnn_init

此函数用于初始化RNN权重。

参考

speechbrain.nnet.RNN.pack_padded_sequence(inputs, lengths)[source]

返回打包的speechbrain格式的张量。

Parameters:
  • inputs (torch.Tensor) – 要打包的序列。

  • lengths (torch.Tensor) – 每个序列的长度。

Return type:

打包的序列。

speechbrain.nnet.RNN.pad_packed_sequence(inputs)[source]

从打包的序列中返回speechbrain格式的张量。

Parameters:

inputs (torch.nn.utils.rnn.PackedSequence) – 一组要转换为张量的输入序列。

Returns:

outputs – 填充后的序列。

Return type:

torch.Tensor

class speechbrain.nnet.RNN.RNN(hidden_size, input_shape=None, input_size=None, nonlinearity='relu', num_layers=1, bias=True, dropout=0.0, re_init=True, bidirectional=False)[source]

基础:Module

此函数实现了一个普通的RNN。

它接受格式为 (batch, time, fea) 的输入张量。 在像 (batch, time, fea, channel) 这样的4d输入情况下,张量会被展平为 (batch, time, fea*channel)。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。 值(即时间和频率核大小分别)。

  • input_shape (元组) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • 非线性 (str) – 非线性类型(tanh, relu)。

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 对输入连接权重使用Xavier初始化。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会从左到右和从右到左扫描序列。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = RNN(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor, _ = net(inp_tensor)
>>>
torch.Size([4, 10, 5])
forward(x, hx=None, lengths=None)[source]

返回普通RNN的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 初始隐藏状态。

  • lengths (torch.Tensor) – 输入信号的相对长度。

Returns:

  • output (torch.Tensor) – 普通RNN的输出

  • hn (torch.Tensor) – 隐藏状态。

class speechbrain.nnet.RNN.LSTM(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0.0, re_init=True, bidirectional=False)[source]

基础:Module

此函数实现了一个基本的LSTM。

它接受格式为 (batch, time, fea) 的输入张量。 在像 (batch, time, fea, channel) 这样的4d输入情况下,张量会被展平为 (batch, time, fea*channel)。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。 值(即时间和频率核大小分别)。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则使用正交初始化来初始化循环权重。 输入连接权重使用Xavier初始化。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会从左到右和从右到左扫描序列。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = LSTM(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor = net(inp_tensor)
>>>
torch.Size([4, 10, 5])
forward(x, hx=None, lengths=None)[source]

返回LSTM的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 初始隐藏状态。

  • lengths (torch.Tensor) – 输入信号的相对长度。

Returns:

  • output (torch.Tensor) – LSTM的输出。

  • hn (torch.Tensor) – 隐藏状态。

class speechbrain.nnet.RNN.GRU(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0.0, re_init=True, bidirectional=False)[source]

基础:Module

此函数实现了一个基本的GRU。

它接受格式为(batch, time, fea)的输入张量。 在4d输入的情况下,如(batch, time, fea, channel),张量会被展平为(batch, time, fea*channel)。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。 值(即时间和频率核大小分别)。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 对输入连接权重使用Xavier初始化。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会从左到右和从右到左扫描序列。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = GRU(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor, _ = net(inp_tensor)
>>>
torch.Size([4, 10, 5])
forward(x, hx=None, lengths=None)[source]

返回GRU的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 初始隐藏状态。

  • lengths (torch.Tensor) – 输入信号的相对长度。

Returns:

  • output (torch.Tensor) – GRU的输出。

  • hn (torch.Tensor) – 隐藏状态。

class speechbrain.nnet.RNN.RNNCell(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0.0, re_init=True, nonlinearity='tanh')[source]

基础:Module

该类实现了用于输入时间步的基本RNN单元, 而RNN()将整个序列作为输入。

它是为自回归解码器(例如注意力解码器)设计的,每次只接受一个输入。使用torch.nn.RNNCell()而不是torch.nn.RNN()以减少VRAM消耗。

它接受格式为 (batch, fea) 的输入张量。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则使用正交初始化来初始化循环权重。 输入连接权重使用Xavier初始化。

  • 非线性 (str) – 非线性类型(tanh, relu)。

Example

>>> inp_tensor = torch.rand([4, 20])
>>> net = RNNCell(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor, _ = net(inp_tensor)
>>> out_tensor.shape
torch.Size([4, 5])
forward(x, hx=None)[source]

返回RNNCell的输出。

Parameters:
  • x (torch.Tensor) – RNNCell的输入。

  • hx (torch.Tensor) – RNNCell的隐藏状态。

Returns:

  • h (torch.Tensor) – RNNCell的输出。

  • hidden (torch.Tensor) – 隐藏状态。

class speechbrain.nnet.RNN.GRUCell(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0.0, re_init=True)[source]

基础:Module

该类实现了用于输入时间步的基本GRU单元, 而GRU()则将整个序列作为输入。

它是为自回归解码器(例如注意力解码器)设计的,每次只接受一个输入。 使用torch.nn.GRUCell()而不是torch.nn.GRU()以减少VRAM消耗。 它接受格式为(batch, fea)的输入张量。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 在GRU架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则使用正交初始化来初始化循环权重。 输入连接权重使用Xavier初始化。

Example

>>> inp_tensor = torch.rand([4, 20])
>>> net = GRUCell(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor, _ = net(inp_tensor)
>>> out_tensor.shape
torch.Size([4, 5])
forward(x, hx=None)[source]

返回GRUCell的输出。

Parameters:
  • x (torch.Tensor) – GRUCell的输入。

  • hx (torch.Tensor) – GRUCell的隐藏状态。

Returns:

  • h (torch.Tensor) – GRUCell 的输出

  • hidden (torch.Tensor) – 隐藏状态。

class speechbrain.nnet.RNN.LSTMCell(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0.0, re_init=True)[source]

基础:Module

该类实现了用于输入时间步的基本LSTM单元, 而LSTM()则将整个序列作为输入。

它是为自回归解码器(例如注意力解码器)设计的,每次只接受一个输入。 使用torch.nn.LSTMCell()而不是torch.nn.LSTM()以减少VRAM消耗。 它接受格式为(batch, fea)的输入张量。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 在LSTM架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 对输入连接权重使用Xavier初始化。

Example

>>> inp_tensor = torch.rand([4, 20])
>>> net = LSTMCell(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor, _ = net(inp_tensor)
>>> out_tensor.shape
torch.Size([4, 5])
forward(x, hx=None)[source]

返回LSTMCell的输出。

Parameters:
  • x (torch.Tensor) – LSTMCell的输入。

  • hx (torch.Tensor) – LSTMCell的隐藏状态。

Returns:

  • h (torch.Tensor) – 输出

  • 元组 (hidden, cell)

class speechbrain.nnet.RNN.AttentionalRNNDecoder(rnn_type, attn_type, hidden_size, attn_dim, num_layers, enc_dim, input_size, nonlinearity='relu', re_init=True, normalization='batchnorm', scaling=1.0, channels=None, kernel_size=None, bias=True, dropout=0.0)[source]

基础:Module

此函数实现了带有注意力的RNN解码器模型。

此函数实现了不同的RNN模型。它接受格式为(批次,时间,特征)的enc_states张量。在4d输入的情况下,如(批次,时间,特征,通道),张量按以下方式展平:(批次,时间,特征*通道)。

Parameters:
  • rnn_type (str) – 使用的循环神经网络类型(rnn, lstm, gru)。

  • attn_type (str) – 使用的注意力类型(位置,内容)。

  • hidden_size (int) – 神经元的数量。

  • attn_dim (int) – 注意力模块内部和输出神经元的数量。

  • num_layers (int) – 在RNN架构中使用的层数。

  • enc_dim (int) – 编码维度的大小。

  • input_size (int) – 相关输入维度的预期大小。

  • 非线性 (str) – 非线性类型(tanh, relu)。此选项仅对rnn和ligru模型有效。对于lstm和gru,使用tanh。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 输入连接权重使用Xavier初始化。

  • normalization (str) – ligru模型的归一化类型(batchnorm, layernorm)。 任何不同于batchnorm和layernorm的字符串将导致不进行归一化。

  • scaling (float) – 一个用于锐化或平滑注意力分布的缩放因子。

  • channels (int) – 用于位置感知注意力的通道数。

  • kernel_size (int) – 用于位置感知注意力的内核大小。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

Example

>>> batch_size = 4
>>> enc_states = torch.rand([batch_size, 10, 20])
>>> wav_len = torch.ones([batch_size])
>>> inp_tensor = torch.rand([batch_size, 5, 6])
>>> net = AttentionalRNNDecoder(
...     rnn_type="lstm",
...     attn_type="content",
...     hidden_size=7,
...     attn_dim=5,
...     num_layers=1,
...     enc_dim=20,
...     input_size=6,
... )
>>> out_tensor, attn = net(inp_tensor, enc_states, wav_len)
>>> out_tensor.shape
torch.Size([4, 5, 7])
forward_step(inp, hs, c, enc_states, enc_len)[source]

前向传播过程的一步。

Parameters:
  • inp (torch.Tensor) – 当前时间步的输入。

  • hs (torch.Tensortupletorch.Tensor) – RNN的细胞状态。

  • c (torch.Tensor) – 前一个时间步的上下文向量。

  • enc_states (torch.Tensor) – 由编码器生成的张量,用于注意力机制。

  • enc_len (torch.LongTensor) – 编码器状态的实际长度。

Returns:

  • dec_out (torch.Tensor) – 输出张量。

  • hs (torch.Tensor 或 torch.Tensor 的元组) – RNN 的新细胞状态。

  • c (torch.Tensor) – 当前时间步的上下文向量。

  • w (torch.Tensor) – 注意力权重。

forward(inp_tensor, enc_states, wav_len)[source]

该方法实现了注意力RNN解码器的前向传递。

Parameters:
  • inp_tensor (torch.Tensor) – RNN解码器每个时间步的输入张量。

  • enc_states (torch.Tensor) – 解码器要关注的张量。

  • wav_len (torch.Tensor) – 此变量存储波形的相对长度。

Returns:

  • outputs (torch.Tensor) – RNN解码器的输出。

  • attn (torch.Tensor) – 每个时间步的注意力权重。

class speechbrain.nnet.RNN.LiGRU(hidden_size, input_shape, nonlinearity='relu', normalization='batchnorm', num_layers=1, bias=True, dropout=0.0, re_init=True, bidirectional=False)[source]

基础:Module

此函数实现了轻量级GRU(Li-GRU)。

Li-GRU 是基于批归一化 + relu 激活 + 循环丢弃的单门 GRU 模型。更多信息请参见:

“M. Ravanelli, P. Brakel, M. Omologo, Y. Bengio, 用于语音识别的轻量门控循环单元, 发表于 IEEE 计算智能新兴主题汇刊, 2018” (https://arxiv.org/abs/1803.10225)

如果在训练过程中遇到不稳定性,请改用稳定化的Li-GRU(SLi-GRU)。 参见:

  • speechbrain.nnet.RNN.SLiGRU

为了提高模型的速度,建议在使用前使用torch即时编译器(jit),或者您可以使用在https://github.com/Adel-Moumen/fast_ligru上提供的自定义实现(CUDA+PyTorch)。

你可以使用以下代码编译它: compiled_model = torch.jit.script(model)

它接受格式为 (batch, time, fea) 的输入张量。 在像 (batch, time, fea, channel) 这样的4d输入情况下,张量会被展平为 (batch, time, fea*channel)。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。 值(即时间和频率核大小分别)。

  • input_shape (tuple) – 示例输入的形状。

  • 非线性 (str) – 非线性类型(tanh, relu)。

  • normalization (str) – ligru模型的归一化类型(batchnorm, layernorm)。 任何不同于batchnorm和layernorm的字符串将导致不进行归一化。

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 对输入连接权重使用Xavier初始化。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会从左到右和从右到左扫描序列。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = LiGRU(input_shape=inp_tensor.shape, hidden_size=5)
>>> out_tensor, _ = net(inp_tensor)
>>>
torch.Size([4, 10, 5])
forward(x, hx: Tensor | None = None)[source]

返回Li-GRU的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 初始隐藏状态。

Returns:

  • output (torch.Tensor) – LiGRU的输出

  • hh (torch.Tensor) – 隐藏状态

class speechbrain.nnet.RNN.LiGRU_Layer(input_size, hidden_size, num_layers, batch_size, dropout=0.0, nonlinearity='relu', normalization='batchnorm', bias=True, bidirectional=False)[source]

基础:Module

该类实现了光门控循环单元(Li-GRU)层。

Parameters:
  • input_size (int) – 输入张量的特征维度。

  • hidden_size (int) – 输出神经元的数量。

  • num_layers (int) – 层数。

  • batch_size (int) – 输入张量的批量大小。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • 非线性 (str) – 非线性类型(tanh, sin, leaky_relu, relu)。

  • normalization (str) – 归一化类型(batchnorm, layernorm)。 任何不同于batchnorm和layernorm的字符串都将导致层归一化。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会同时从右到左和从左到右扫描序列。

forward(x: Tensor, hx: Tensor | None = None) Tensor[source]

返回liGRU层的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 隐藏状态。

Returns:

h – liGRU 的输出。

Return type:

torch.Tensor

class speechbrain.nnet.RNN.SLiGRU(hidden_size, input_shape, nonlinearity='relu', ff_normalization='batchnorm', recurrent_elementwise_affine=False, num_layers=1, bias=True, dropout=0.0, re_init=True, bidirectional=False)[source]

基础:Module

该类实现了一个稳定的轻量级GRU(SLi-GRU)。

SLi-GRU 是基于批归一化 + relu 激活 + 循环连接上的层归一化 + 循环 dropout 的单门 GRU 模型。

SLi-GRU 与普通的 Li-GRU 在循环权重上有所不同。事实上,Li-GRU 在循环权重上存在梯度爆炸问题,无法在中大型 ASR 数据集上进行训练。为了解决这个问题,我们在循环权重上使用了层归一化,这稳定了模型的训练,并使其能够在大规模 ASR 数据集上顺利训练。

该模型在CommonVoice/LibriSpeech数据集上击败了传统的LSTM/GRU模型(WER和效率)。

更多信息请参见: “Moumen, A., & Parcollet, T. (2023, 6月). 稳定和加速用于自动语音识别的轻量门控循环单元。 在ICASSP 2023-2023 IEEE国际声学、语音和信号处理会议(ICASSP) (pp. 1-5). IEEE.” (https://arxiv.org/abs/2302.10144)

为了提高模型的速度,建议在使用前使用torch即时编译器(jit),或者您可以使用在https://github.com/Adel-Moumen/fast_ligru上提供的自定义实现(CUDA+PyTorch)。

你可以使用以下代码编译它: compiled_model = torch.jit.script(model)

它接受格式为 (batch, time, fea) 的输入张量。 在像 (batch, time, fea, channel) 这样的4d输入情况下,张量会被展平为 (batch, time, fea*channel)。

Parameters:
  • hidden_size (int) – 输出神经元的数量(即输出的维度)。 值(即时间和频率核大小分别)。

  • input_shape (tuple) – 示例输入的形状。

  • 非线性 (str) – 非线性类型(tanh, relu)。

  • ff_normalization (str) – ligru模型的前馈归一化类型(batchnorm, layernorm)。 任何不同于batchnorm和layernorm的字符串将导致 没有归一化。

  • recurrent_elementwise_affine (bool) – 一个布尔值,当设置为True时,将启用可学习的仿射参数。

  • num_layers (int) – 在RNN架构中使用的层数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • re_init (bool) – 如果为True,则对循环权重使用正交初始化。 对输入连接权重使用Xavier初始化。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会从左到右和从右到左扫描序列。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = SLiGRU(input_shape=inp_tensor.shape, hidden_size=5)
>>> out_tensor, _ = net(inp_tensor)
>>>
torch.Size([4, 10, 5])
forward(x, hx: Tensor | None = None)[source]

返回SLi-GRU的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 初始隐藏状态。

Returns:

  • output (torch.Tensor) – SLiGRU的输出

  • hh (torch.Tensor) – 隐藏状态

class speechbrain.nnet.RNN.SLiGRU_Layer(input_size, hidden_size, num_layers, batch_size, dropout=0.0, nonlinearity='relu', ff_normalization='batchnorm', recurrent_elementwise_affine=False, bias=True, bidirectional=False)[source]

基础:Module

该类实现了一个稳定的光门控循环单元(SLi-GRU)层。

Parameters:
  • input_size (int) – 输入张量的特征维度。

  • hidden_size (int) – 输出神经元的数量。

  • num_layers (int) – 层数。

  • batch_size (int) – 输入张量的批量大小。

  • dropout (float) – 这是dropout因子(必须在0和1之间)。

  • 非线性 (str) – 非线性类型(tanh, sin, leaky_relu, relu)。

  • ff_normalization (str) – 归一化类型(batchnorm, layernorm)。 任何不同于batchnorm和layernorm的字符串将导致层归一化。 请注意,这仅适用于前馈仿射变换。 SLi-GRU(与Li-GRU不同)无条件地在循环层中应用层归一化,这不受此参数影响。

  • recurrent_elementwise_affine (bool) – 一个布尔值,当设置为True时,将启用可学习的仿射参数。

  • bias (bool) – 如果为True,则采用加法偏置b。

  • 双向 (bool) – 如果为True,则使用一个双向模型,该模型会同时从右到左和从左到右扫描序列。

forward(x: Tensor, hx: Tensor | None = None) Tensor[source]

返回liGRU层的输出。

Parameters:
  • x (torch.Tensor) – 输入张量。

  • hx (torch.Tensor) – 隐藏状态。

Returns:

h – liGRU的输出。

Return type:

torch.Tensor

class speechbrain.nnet.RNN.QuasiRNNLayer(input_size, hidden_size, bidirectional, zoneout=0.0, output_gate=True)[source]

基础:Module

将单层准循环神经网络(QRNN)应用于输入序列。

Parameters:
  • input_size (int) – 输入x中期望的特征数量。

  • hidden_size (int) – 隐藏状态 h 中的特征数量。如果未指定,则使用输入大小。

  • 双向 (bool) – 是否在正向和反向两个方向上应用RNN。

  • zoneout (float) – 是否对隐藏状态更新应用zoneout(即未能更新隐藏状态中的元素)。默认值:0。

  • output_gate (bool) – 如果为True,执行QRNN-fo(对输出应用输出门)。 如果为False,执行QRNN-f。默认值:True。

Example

>>> import torch
>>> model = QuasiRNNLayer(60, 256, bidirectional=True)
>>> a = torch.rand([10, 120, 60])
>>> b = model(a)
>>> b[0].shape
torch.Size([10, 120, 512])
forgetMult(f: Tensor, x: torch.Tensor, hidden: Tensor | None) torch.Tensor[source]

返回每个时间步的隐藏状态。

Parameters:
  • f (torch.Tensor)

  • x (torch.Tensor) – 输入张量

  • hidden (torch.Tensor) – 如果有的话,第一个隐藏状态。

Return type:

每个步骤的隐藏状态。

split_gate_inputs(y: torch.Tensor) Tuple[torch.Tensor, torch.Tensor, torch.Tensor | None][source]

分割输入门。

forward(x: torch.Tensor, hidden: torch.Tensor | None = None) Tuple[torch.Tensor, torch.Tensor][source]

返回QRNN层的输出。

Parameters:
  • x (torch.Tensor) – 输入以进行线性变换。

  • hidden (torch.Tensor) – 初始隐藏状态,如果有的话。

Returns:

  • h (torch.Tensor)

  • c (torch.Tensor)

class speechbrain.nnet.RNN.QuasiRNN(hidden_size, input_shape=None, input_size=None, num_layers=1, bias=True, dropout=0, bidirectional=False, **kwargs)[source]

基础:Module

这是Quasi-RNN的一个实现。

https://arxiv.org/pdf/1611.01576.pdf

部分代码改编自: https://github.com/salesforce/pytorch-qrnn

Parameters:
  • hidden_size (int) – 隐藏状态 h 中的特征数量。如果未指定,则使用输入大小。

  • input_shape (tuple) – 示例输入的形状。或者,使用 input_size

  • input_size (int) – 输入的大小。或者,使用 input_shape

  • num_layers (int) – 要生成的QRNN层数。

  • bias (bool) – 是否添加偏置项,仅支持True。

  • dropout (float) – 将输出置零的比率。

  • 双向 (bool) – 如果为真,一组参数将向前遍历,另一组参数将从末尾向开始遍历。

  • **kwargs (dict) – 传递给QuasiRNN层的参数。

Example

>>> a = torch.rand([8, 120, 40])
>>> model = QuasiRNN(
...     256, num_layers=4, input_shape=a.shape, bidirectional=True
... )
>>> b, _ = model(a)
>>> b.shape
torch.Size([8, 120, 512])
forward(x, hidden=None)[source]

将QuasiRNN应用于输入张量x。

speechbrain.nnet.RNN.rnn_init(module)[source]

此函数用于初始化RNN权重。 循环连接:正交初始化。

Parameters:

module (torch.nn.Module) – 递归神经网络模块。

Example

>>> inp_tensor = torch.rand([4, 10, 20])
>>> net = RNN(hidden_size=5, input_shape=inp_tensor.shape)
>>> out_tensor = net(inp_tensor)
>>> rnn_init(net)