首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将语言检测的语言概率向量添加到Keras序列模型?

如何将语言检测的语言概率向量添加到Keras序列模型?
EN

Stack Overflow用户
提问于 2022-11-17 19:46:16
回答 1查看 49关注 0票数 1

我目前正在研究歌唱语言识别问题(以及机器学习的基础知识)。我在互联网上发现了很多关于这方面的工作,但其中一些没有提供任何代码(甚至是伪代码),这就是为什么我试图使用机器学习模型描述来再现它们的原因。

一个很好的例子是蔡根宇( Keunwoo )和王玉轩(音)写的LISTEN, READ, AND IDENTIFY: MULTIMODAL SINGING LANGUAGE IDENTIFICATION OF MUSIC

总之,它们连接着两个层次:音频层(以谱图的形式),文本层(语言概率向量使用语言检测元数据,56维向量)。

The text branch is a 3-layer MLP where each layer consists of a 128-unit fully-connected layer, a batch normalization layer, and a ReLU activation [22].

对于文本模型,我得到了如下内容:

代码语言:javascript
运行
复制
text_model = Sequential()
text_model.add(Input((56,), name='input'))
text_model.add(BatchNormalization())
text_model.add(Dense(128, activation='relu'))

langdetect.detect_langs(metadata)返回[de:0.8571399874707945, en:0.14285867860989504]

我不确定我是否正确地描述了我的模型,我无法理解如何正确地将它(lang检测概率向量)放到keras模型中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 20:49:32

首先,需要将langdetect输出转换为常量长度的向量。库中有55种语言,因此我们需要创建长度为55的向量,其中第一个元素表示来自第一语言的文本的概率。你可以这样做:

代码语言:javascript
运行
复制
import tensorflow as tf

import numpy as np
import langdetect

langdetect.detector_factory.init_factory()
LANGUAGES_LIST = langdetect.detector_factory._factory.langlist

def get_probabilities_vector(text):
    
    predictions = langdetect.detect_langs(text)
    output = np.zeros(len(LANGUAGES_LIST))
    
    for p in predictions:
        output[LANGUAGES_LIST.index(p.lang)] = p.prob
        
    return tf.constant(output)

然后您需要创建一个具有多个输入的模型。这可以使用功能API来完成,例如:(根据用例更改输入):

代码语言:javascript
运行
复制
def create_model():
    
    audio_input = tf.keras.Input(shape=(256,))
    langdetect_input = tf.keras.Input(shape=(55,))
    
    x = tf.keras.layers.concatenate([audio_input, langdetect_input])
    x = tf.keras.layers.Dense(128, activation='relu')(x)
    output = tf.keras.layers.Dense(55)(x)
    
    model = tf.keras.Model(
        inputs={
            'audio': audio_input,
            'text': langdetect_input
        },
        outputs=output)
        
    return model

在一些输入上测试模型:

代码语言:javascript
运行
复制
model = create_model()

audio_input = tf.constant(np.random.rand(256))
langdetect_input = get_probabilities_vector('This is just a test input')

model({
    'audio': tf.expand_dims(audio_input, 0),
    'text': tf.expand_dims(langdetect_input, 0)
})

>>> <tf.Tensor: shape=(1, 55), dtype=float32, numpy=
array([[ 0.23361185,  0.19011918, -0.45230836, -0.0602392 , -0.20067683,
         0.9698535 , -1.0724173 ,  0.08978442,  0.052798  , -0.16554174,
         0.9238764 ,  1.0331644 ,  0.4508734 , -0.2450786 , -1.0605856 ,
         0.3239496 , -1.0073977 , -0.2129285 , -0.6817296 ,  0.05288622,
         0.9089616 , -0.11521344,  0.25696573, -0.07688305, -0.36123943,
        -0.0317415 , -0.18303779,  0.13786468,  0.88620317,  0.11393422,
        -0.5215691 , -0.28585738,  0.54988045, -0.02300271, -0.4347821 ,
        -0.57744324,  0.14031887,  0.8255624 , -0.13157232, -1.1060234 ,
        -0.24097277,  0.12950295,  0.4586677 ,  0.37702668,  0.7558856 ,
        -0.05933011,  0.53903174,  0.27433476, -0.18464057,  1.0673125 ,
        -0.05723387, -0.03429477,  0.4431308 , -0.14510366, -0.28087378]],
      dtype=float32)>

我使用迪姆斯函数扩展输入的维度,以便输入具有形状(1, 256)(1, 55) (这与模型在培训期间期望的输入(batch_size, 256)(batch_size, 55)相似)。

这只是一个草案,但这大概是你的问题可以解决的方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74481279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档