speechbrain.nnet.CNN 模块

实现卷积神经网络的库。

Authors
  • Mirco Ravanelli 2020

  • 钟建元 2020

  • Cem Subakan 2021

  • 达维德·博拉 2021

  • 安德烈亚斯·诺奇 2022

  • Sarthak Yadav 2022

摘要

类:

Conv1d

此函数实现一维卷积。

Conv2d

此函数实现了二维卷积。

ConvTranspose1d

该类使用speechbrain实现一维转置卷积。

DepthwiseSeparableConv1d

该类实现了深度可分离的一维卷积。

DepthwiseSeparableConv2d

该类实现了深度可分离的2D卷积。

GaborConv1d

这个类实现了1D Gabor卷积

SincConv

此函数实现了SincConv(SincNet)。

函数:

get_padding_elem

此函数计算要添加的元素数量以进行零填充。

get_padding_elem_transposed

此函数计算转置卷积所需的填充大小

参考

class speechbrain.nnet.CNN.SincConv(out_channels, kernel_size, input_shape=None, in_channels=None, stride=1, dilation=1, padding='same', padding_mode='reflect', sample_rate=16000, min_low_hz=50, min_band_hz=50)[source]

基础:Module

此函数实现了SincConv(SincNet)。

M. Ravanelli, Y. Bengio, “从原始波形进行说话人识别的SincNet”,发表于 SLT 2018 会议 (https://arxiv.org/abs/1808.00158)

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • input_shape (tuple) – 输入的形状。也可以使用 in_channels

  • in_channels (int) – 输入通道的数量。或者使用 input_shape

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的降采样。

  • dilation (int) – 卷积滤波器的膨胀因子。

  • padding (str) – (same, valid, causal). 如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。 “causal”会导致因果(扩张)卷积。

  • padding_mode (str) – 此标志指定填充的类型。有关更多信息,请参阅 torch.nn 文档。

  • sample_rate (int) – 输入信号的采样率。仅用于sinc_conv。

  • min_low_hz (float) – 滤波器的最低可能频率(以Hz为单位)。仅用于sinc_conv。

  • min_band_hz (float) – 滤波器带宽的最低可能值(以Hz为单位)。

Example

>>> inp_tensor = torch.rand([10, 16000])
>>> conv = SincConv(input_shape=inp_tensor.shape, out_channels=25, kernel_size=11)
>>> out_tensor = conv(inp_tensor)
>>> out_tensor.shape
torch.Size([10, 16000, 25])
forward(x)[source]

返回卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是2d或4d张量。

Returns:

wx – 卷积后的输出。

Return type:

torch.Tensor

class speechbrain.nnet.CNN.Conv1d(out_channels, kernel_size, input_shape=None, in_channels=None, stride=1, dilation=1, padding='same', groups=1, bias=True, padding_mode='reflect', skip_transpose=False, weight_norm=False, conv_init=None, default_padding=0)[source]

基础:Module

此函数实现一维卷积。

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • input_shape (tuple) – 输入的形状。也可以使用 in_channels

  • in_channels (int) – 输入通道的数量。或者使用 input_shape

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的降采样。

  • dilation (int) – 卷积滤波器的扩张因子。

  • padding (str) – (same, valid, causal). 如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。 “causal”会导致因果(扩张)卷积。

  • groups (int) – 从输入通道到输出通道的阻塞连接数。

  • bias (bool) – 是否在卷积操作中添加偏置项。

  • padding_mode (str) – 此标志指定填充的类型。有关更多信息,请参阅 torch.nn 文档。

  • skip_transpose (bool) – 如果为False,使用speechbrain的批次 x 时间 x 通道约定。 如果为True,使用批次 x 通道 x 时间约定。

  • weight_norm (bool) – 如果为True,使用权重归一化, 在推理时通过self.remove_weight_norm()移除

  • conv_init (str) – 卷积网络的权重初始化

  • default_padding (strint) – 这将设置由pytorch Conv1d后端使用的默认填充模式。

Example

>>> inp_tensor = torch.rand([10, 40, 16])
>>> cnn_1d = Conv1d(
...     input_shape=inp_tensor.shape, out_channels=8, kernel_size=5
... )
>>> out_tensor = cnn_1d(inp_tensor)
>>> out_tensor.shape
torch.Size([10, 40, 8])
forward(x)[source]

返回卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是2d或4d张量。

Returns:

wx – 卷积后的输出。

Return type:

torch.Tensor

remove_weight_norm()[source]

如果在训练期间使用了权重归一化,则在推理时移除权重归一化。

class speechbrain.nnet.CNN.Conv2d(out_channels, kernel_size, input_shape=None, in_channels=None, stride=(1, 1), dilation=(1, 1), padding='same', groups=1, bias=True, padding_mode='reflect', max_norm=None, swap=False, skip_transpose=False, weight_norm=False, conv_init=None)[source]

基础:Module

此函数实现了二维卷积。

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (tuple) – 2d卷积滤波器在时间和频率轴上的核大小。

  • input_shape (tuple) – 输入的形状。也可以使用 in_channels

  • in_channels (int) – 输入通道的数量。或者使用 input_shape

  • stride (int) – 2D卷积滤波器在时间和频率轴上的步长因子。

  • dilation (int) – 2D卷积滤波器在时间和频率轴上的扩张因子。

  • padding (str) – (same, valid, causal). 如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。 如果为“causal”,则插入适当的填充以模拟第一个空间维度上的因果卷积。 (对于skip_transpose=False和skip_transpose=True,空间维度1都是维度3)

  • groups (int) – 此选项指定卷积组。有关更多信息,请参阅 torch.nn 文档。

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

  • padding_mode (str) – 此标志指定填充的类型。有关更多信息,请参阅 torch.nn 文档。

  • max_norm (float) – 核的最大范数。

  • swap (bool) – 如果为True,卷积将以(B, C, W, H)格式进行。 如果为False,卷积将以(B, H, W, C)格式进行。 仅在skip_transpose为False时有效。

  • skip_transpose (bool) – 如果为False,使用speechbrain的batch x spatial.dim2 x spatial.dim1 x channel约定。 如果为True,使用batch x channel x spatial.dim1 x spatial.dim2约定。

  • weight_norm (bool) – 如果为True,使用权重归一化, 在推理时通过self.remove_weight_norm()移除

  • conv_init (str) – 卷积网络的权重初始化

Example

>>> inp_tensor = torch.rand([10, 40, 16, 8])
>>> cnn_2d = Conv2d(
...     input_shape=inp_tensor.shape, out_channels=5, kernel_size=(7, 3)
... )
>>> out_tensor = cnn_2d(inp_tensor)
>>> out_tensor.shape
torch.Size([10, 40, 16, 5])
forward(x)[source]

返回卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是2d或4d张量。

Returns:

x – 卷积的输出。

Return type:

torch.Tensor

remove_weight_norm()[source]

如果在训练期间使用了权重归一化,则在推理时移除权重归一化。

class speechbrain.nnet.CNN.ConvTranspose1d(out_channels, kernel_size, input_shape=None, in_channels=None, stride=1, dilation=1, padding=0, output_padding=0, groups=1, bias=True, skip_transpose=False, weight_norm=False)[source]

基础:Module

该类使用speechbrain实现了一维转置卷积。 转置卷积通常用于执行上采样。

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • input_shape (tuple) – 输入的形状。也可以使用 in_channels

  • in_channels (int) – 输入通道的数量。或者使用 input_shape

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的上采样。

  • dilation (int) – 卷积滤波器的扩张因子。

  • padding (strint) – 为了在输出中获得目标维度,我们建议适当调整内核大小和填充。我们还支持以下函数来控制填充和相应的输出维度。 如果为“valid”,则不应用填充 如果为“same”,则推断填充量以使输出大小尽可能接近输入大小。请注意,对于某些kernel_size / stride组合,无法获得完全相同的大小,但我们会返回最接近的可能大小。 如果为“factor”,则推断填充量以使输出大小最接近inputsize*stride。请注意,对于某些kernel_size / stride组合,无法获得确切的大小,但我们会返回最接近的可能大小。 如果输入整数值,则使用自定义填充。

  • output_padding (int,) – 添加到输出形状一侧的额外大小

  • groups (int) – 从输入通道到输出通道的阻塞连接数。 默认值:1

  • bias (bool) – 如果为True,向输出添加一个可学习的偏置

  • skip_transpose (bool) – 如果为False,使用speechbrain的批次 x 时间 x 通道约定。 如果为True,使用批次 x 通道 x 时间约定。

  • weight_norm (bool) – 如果为True,使用权重归一化, 在推理时通过self.remove_weight_norm()移除

Example

>>> from speechbrain.nnet.CNN import Conv1d, ConvTranspose1d
>>> inp_tensor = torch.rand([10, 12, 40]) #[batch, time, fea]
>>> convtranspose_1d = ConvTranspose1d(
...     input_shape=inp_tensor.shape, out_channels=8, kernel_size=3, stride=2
... )
>>> out_tensor = convtranspose_1d(inp_tensor)
>>> out_tensor.shape
torch.Size([10, 25, 8])
>>> # Combination of Conv1d and ConvTranspose1d
>>> from speechbrain.nnet.CNN import Conv1d, ConvTranspose1d
>>> signal = torch.tensor([1,100])
>>> signal = torch.rand([1,100]) #[batch, time]
>>> conv1d = Conv1d(input_shape=signal.shape, out_channels=1, kernel_size=3, stride=2)
>>> conv_out = conv1d(signal)
>>> conv_t = ConvTranspose1d(input_shape=conv_out.shape, out_channels=1, kernel_size=3, stride=2, padding=1)
>>> signal_rec = conv_t(conv_out, output_size=[100])
>>> signal_rec.shape
torch.Size([1, 100])
>>> signal = torch.rand([1,115]) #[batch, time]
>>> conv_t = ConvTranspose1d(input_shape=signal.shape, out_channels=1, kernel_size=3, stride=2, padding='same')
>>> signal_rec = conv_t(signal)
>>> signal_rec.shape
torch.Size([1, 115])
>>> signal = torch.rand([1,115]) #[batch, time]
>>> conv_t = ConvTranspose1d(input_shape=signal.shape, out_channels=1, kernel_size=7, stride=2, padding='valid')
>>> signal_rec = conv_t(signal)
>>> signal_rec.shape
torch.Size([1, 235])
>>> signal = torch.rand([1,115]) #[batch, time]
>>> conv_t = ConvTranspose1d(input_shape=signal.shape, out_channels=1, kernel_size=7, stride=2, padding='factor')
>>> signal_rec = conv_t(signal)
>>> signal_rec.shape
torch.Size([1, 231])
>>> signal = torch.rand([1,115]) #[batch, time]
>>> conv_t = ConvTranspose1d(input_shape=signal.shape, out_channels=1, kernel_size=3, stride=2, padding=10)
>>> signal_rec = conv_t(signal)
>>> signal_rec.shape
torch.Size([1, 211])
forward(x, output_size=None)[source]

返回卷积的输出。

Parameters:
  • x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是2d或4d张量。

  • output_size (int) – 输出的大小

Returns:

x – 卷积输出

Return type:

torch.Tensor

remove_weight_norm()[source]

如果在训练期间使用了权重归一化,则在推理时移除权重归一化。

class speechbrain.nnet.CNN.DepthwiseSeparableConv1d(out_channels, kernel_size, input_shape, stride=1, dilation=1, padding='same', bias=True)[source]

基础:Module

该类实现了深度可分离的一维卷积。

首先,对输入应用通道卷积 然后,使用点卷积将输入投影到输出

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • input_shape (tuple) – 输入的预期形状。

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的降采样。

  • dilation (int) – 卷积滤波器的扩张因子。

  • padding (str) – (same, valid, causal). 如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。 “causal”会导致因果(扩张)卷积。

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

Example

>>> inp = torch.randn([8, 120, 40])
>>> conv = DepthwiseSeparableConv1d(256, 3, input_shape=inp.shape)
>>> out = conv(inp)
>>> out.shape
torch.Size([8, 120, 256])
forward(x)[source]

返回卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是3D张量。

Return type:

卷积输出。

class speechbrain.nnet.CNN.DepthwiseSeparableConv2d(out_channels, kernel_size, input_shape, stride=(1, 1), dilation=(1, 1), padding='same', bias=True)[source]

基础:Module

该类实现了深度可分离的2D卷积。

首先,对输入应用通道卷积 然后,使用点卷积将输入投影到输出

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • input_shape (tuple) – 输入张量的预期形状。

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的降采样。

  • dilation (int) – 卷积滤波器的扩张因子。

  • padding (str) – (same, valid, causal). 如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。 “causal”会导致因果(扩张)卷积。

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

Example

>>> inp = torch.randn([8, 120, 40, 1])
>>> conv = DepthwiseSeparableConv2d(256, (3, 3), input_shape=inp.shape)
>>> out = conv(inp)
>>> out.shape
torch.Size([8, 120, 40, 256])
forward(x)[source]

返回卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。期望是3D张量。

Returns:

out – 卷积后的输出。

Return type:

torch.Tensor

class speechbrain.nnet.CNN.GaborConv1d(out_channels, kernel_size, stride, input_shape=None, in_channels=None, padding='same', padding_mode='constant', sample_rate=16000, min_freq=60.0, max_freq=None, n_fft=512, normalize_energy=False, bias=False, sort_filters=False, use_legacy_complex=False, skip_transpose=False)[source]

基础:Module

该类实现了来自

Neil Zeghidour, Olivier Teboul, F{‘e}lix de Chaumont Quitry & Marco Tagliasacchi, “LEAF: 一个可学习的音频分类前端”, 在ICLR 2021的会议论文中 (https://arxiv.org/abs/2101.08596)

Parameters:
  • out_channels (int) – 这是输出通道的数量。

  • kernel_size (int) – 卷积滤波器的核大小。

  • stride (int) – 卷积滤波器的步长因子。当步长因子大于1时,会进行时间上的降采样。

  • input_shape (tuple) – 输入的预期形状。

  • in_channels (int) – 输入中预期的通道数。

  • padding (str) – (same, valid)。如果为“valid”,则不进行填充。 如果为“same”且步幅为1,输出形状与输入形状相同。

  • padding_mode (str) – 此标志指定填充的类型。有关更多信息,请参阅 torch.nn 文档。

  • sample_rate (int,) – 输入信号的采样率。它仅用于sinc_conv。

  • min_freq (float) – 滤波器的最低可能频率(以Hz为单位)

  • max_freq (float) – 过滤器的最高可能频率(以Hz为单位)

  • n_fft (int) – 用于初始化的FFT bin数量

  • normalize_energy (bool) – 是否在初始化时归一化能量。默认值为 False

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

  • sort_filters (bool) – 是否按中心频率对过滤器进行排序。默认值为 False

  • use_legacy_complex (bool) – 如果为False,则使用torch.complex64数据类型进行Gabor脉冲响应 如果为True,则在两个实值张量上进行计算

  • skip_transpose (bool) – 如果为False,使用speechbrain的批次 x 时间 x 通道约定。 如果为True,使用批次 x 通道 x 时间约定。

Example

>>> inp_tensor = torch.rand([10, 8000])
>>> # 401 corresponds to a window of 25 ms at 16000 kHz
>>> gabor_conv = GaborConv1d(
...     40, kernel_size=401, stride=1, in_channels=1
... )
>>> #
>>> out_tensor = gabor_conv(inp_tensor)
>>> out_tensor.shape
torch.Size([10, 8000, 40])
forward(x)[source]

返回Gabor卷积的输出。

Parameters:

x (torch.Tensor (batch, time, channel)) – 输入进行卷积。

Returns:

x – Gabor卷积的输出

Return type:

torch.Tensor

speechbrain.nnet.CNN.get_padding_elem(L_in: int, stride: int, kernel_size: int, dilation: int)[source]

此函数计算用于零填充的元素数量。

Parameters:
Returns:

padding – 要添加的填充大小

Return type:

int

speechbrain.nnet.CNN.get_padding_elem_transposed(L_out: int, L_in: int, stride: int, kernel_size: int, dilation: int, output_padding: int)[source]

此函数计算转置卷积所需的填充大小

Parameters:
  • L_out (int)

  • L_in (int)

  • 步幅 (int)

  • kernel_size (int)

  • dilation (int)

  • output_padding (int)

Returns:

padding – 要应用的填充大小

Return type:

int