我正在阅读Wav2Vec 2.0论文并试图理解模型的体系结构,但我很难理解可变长度的音频原始输入是如何通过模型提供的,特别是从卷积特性编码器到变压器上下文网络。
在微调期间(据我所读),尽管批处理中的音频原始输入将被填充到批处理中最长输入的长度,但输入的长度可能因批处理而异。因此,这意味着从卷积特征编码器的输出将有不同的长度在不同的批。
然而,变压器上下文网络有一个固定的输入维;基本的Wav2Vec 2.0模型使用模型维度768的转换器。这意味着,从卷积特征编码器的输出必须以某种方式“操纵”成为维度768,以便输入变压器。
这种“操纵”是怎么做到的?HuggingFace的Wav2Vec模型(见下文)显示,在卷积特性编码器(即.k.a.,Wav2Vec2FeatureExtractor)和互感器上下文网络(即.k.a.,Wav2Vec2Encoder)之间存在一个Wav2Vec2FeatureProjection层。Wav2Vec2FeatureProjection包含一个线性层,它接受维度512和输出维度768的输入。输入维512是如何确定原始输入可以在不同批次之间具有不同长度的?
Wav2Vec2ForCTC(
(wav2vec2): Wav2Vec2Model(
(feature_extractor): Wav2Vec2FeatureExtractor(
(conv_layers): ModuleList(
...
(6): Wav2Vec2NoLayerNormConvLayer(
(conv): Conv1d(512, 512, kernel_size=(2,), stride=(2,), bias=False)
)
)
)
(feature_projection): Wav2Vec2FeatureProjection(
(layer_norm): LayerNorm((512,), eps=1e-05, elementwise_affine=True)
(projection): Linear(in_features=512, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(encoder): Wav2Vec2Encoder(
(pos_conv_embed): Wav2Vec2PositionalConvEmbedding(
(conv): Conv1d(768, 768, kernel_size=(128,), stride=(1,), padding=(64,), groups=16)
(padding): Wav2Vec2SamePadLayer()
)
...发布于 2021-04-16 00:42:47
它们的关键是变压器的768维矢量是单个输入的大小。让我解释一下。
可以想象,实际上您也需要向转换器传递一个掩码,这样它就知道批处理中不同输入的变量T是什么。
https://datascience.stackexchange.com/questions/93036
复制相似问题