【问题标题】:Getting embeddings from wav2vec2 models in HuggingFace从 HuggingFace 中的 wav2vec2 模型中获取嵌入
【发布时间】:2021-11-14 20:41:42
【问题描述】:

我正在尝试使用我自己的数据集从预训练的 wav2vec2 模型(例如,来自 jonatasgrosman/wav2vec2-large-xlsr-53-german)中获取嵌入。

我的目标是将这些功能用于下游任务(不是专门的语音识别)。也就是说,由于数据集相对较小,我将使用这些嵌入训练一个 SVM 以进行最终分类。

到目前为止,我已经尝试过:

model_name = "facebook/wav2vec2-large-xlsr-53-german"
feature_extractor = Wav2Vec2Processor.from_pretrained(model_name)
model = Wav2Vec2Model.from_pretrained(model_name)

input_values = feature_extractor(train_dataset[:10]["speech"], return_tensors="pt", padding=True, 
                                 feature_size=1, sampling_rate=16000 ).input_values 

那么,我不确定这里的embeddings是否对应last_hidden_​​states的序列:

hidden_states = model(input_values).last_hidden_state

或模型最后一个卷积层的特征序列:

features_last_cnn_layer = model(input_values).extract_features

另外,这是从预训练模型中提取特征的正确方法吗?

如何从特定层获得嵌入?

PD:在 HuggingFace 的论坛上发帖似乎不太活跃。

【问题讨论】:

    标签: python huggingface-transformers pre-trained-model


    【解决方案1】:

    只需检查documentation

    last_hidden_​​state (torch.FloatTensor 的形状 (batch_size, sequence_length, hidden_​​size)) – 隐藏状态序列 模型最后一层的输出。

    extract_features (torch.FloatTensor 的形状 (batch_size, sequence_length, conv_dim[-1])) – 提取特征的序列 模型最后一个卷积层的向量。

    • last_hidden_​​state 向量表示所谓的contextualized embeddings(即每个特征(CNN 输出)都有一个向量表示,该向量表示在某种程度上受序列中其他标记的影响)。
    • extract_features 向量表示输入的嵌入(在 CNN 之后)。 .

    另外,这是从预先训练的模型中提取特征的正确方法吗? 型号?
    是的。

    如何从特定层获得嵌入? 设置output_hidden_states=True

    o = model(input_values,output_hidden_states=True)
    o.keys()
    

    输出:

    odict_keys(['last_hidden_state', 'extract_features', 'hidden_states'])
    

    hidden_states 值包含每个注意力层的嵌入和上下文化嵌入。

    P.S.:jonatasgrosman/wav2vec2-large-xlsr-53-german 模型是使用 feat_extract_norm==layer 训练的。这意味着,您还应该将注意力掩码传递给模型:

    model_name = "facebook/wav2vec2-large-xlsr-53-german"
    feature_extractor = Wav2Vec2Processor.from_pretrained(model_name)
    model = Wav2Vec2Model.from_pretrained(model_name)
    
    i= feature_extractor(train_dataset[:10]["speech"], return_tensors="pt", padding=True, 
                                     feature_size=1, sampling_rate=16000 )
    model(**i)
    

    【讨论】:

    • 谢谢!我想这取决于具体情况,但是,什么嵌入会是更好的选择? last_hidden_​​states 的那些还是来自最后一个 CNN 层的那些?关于将注意力传递给模型的最后一部分,那么获取嵌入的方法是:“ outs = model(**input_values); embs = outs.extract_features”?
    • 这取决于用例。对于我现在能想到的大多数情况,我会使用上下文化嵌入(即 last_hidden_​​states)。 outs 是一个包含 extract_featureslast_hidden_states 的对象。您可以通过outs.extract_featuresouts["extract_features"] 访问其成员。
    • 好的。还有一个关于 wav2vec2 的问题。所以在文档中有 wav2vec2Model、wav2vec2ForCTC、wav2vec2ForSequenceClassification 和 wav2vec2ForPreTraining。我无法完全理解它们之间的差异。我的疑问是,如果我使用“[any_of_them].from_ptretrained”,生成的嵌入是否会有很大不同?
    • 使用wav2vec2Model,它是您用例的正确类。 wav2vec2ForCTC 用于CTC(即转录)。 wav2vec2ForSequenceClassification 用于对音频序列进行分类(例如音乐流派)。 wav2vec2ForPreTraining 用于训练新模型。 @jvel07
    猜你喜欢
    • 2021-12-12
    • 2022-10-15
    • 2020-12-21
    • 2020-10-07
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多