You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将多维度多类型音频embedding转一维列表用于SVM分类

解决Towhee音频编码特征展平及SVM分类数据构建问题

一、特征展平实现

你的每个音频编码结果是嵌套的list/tuple/numpy.ndarray结构,维度为(1,1,1,99,1024),最终需要展平为一维数组。以下是通用处理方案:

1. 单个样本展平函数

用递归方式逐层提取最内层numpy数组,再展平为一维:

import numpy as np
import pandas as pd

def flatten_embedding(emb):
    def extract_inner_array(obj):
        # 递归解开嵌套的list/tuple,直到拿到numpy数组
        if isinstance(obj, (list, tuple)):
            return extract_inner_array(obj[0])
        elif isinstance(obj, np.ndarray):
            return obj
        else:
            raise ValueError("嵌套结构中出现未知数据类型")
    
    inner_arr = extract_inner_array(emb)
    # 展平为一维数组,返回numpy数组(要列表则加.tolist())
    return inner_arr.flatten()

2. 批量处理并构建目标表格

假设编码结果存在Pandas Seriesembeddings_series,标签数据存在labels列表/Series中:

# 对整个Series应用展平函数
flattened_embs = embeddings_series.apply(flatten_embedding)

# 构建符合需求的DataFrame
df = pd.DataFrame({
    'embeddings': flattened_embs.tolist(),
    'output': labels
})

3. 适配SVM训练的高效格式

Scikit-learn的SVM直接支持二维numpy数组输入,无需转成列表:

# 转成(样本数, 特征数)的二维数组
X = np.vstack(flattened_embs.values)
y = np.array(labels)

# SVM训练示例
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
svm_model = SVC(kernel='rbf')  # 根据任务选择合适核函数
svm_model.fit(X_train, y_train)

二、替代方案建议

1. 特征降维优化

10万+维特征可能导致SVM训练缓慢,用PCA降维保留核心信息:

from sklearn.decomposition import PCA

# 保留200维(可根据方差解释率调整)
pca = PCA(n_components=200)
X_reduced = pca.fit_transform(X)

# 用降维后的数据训练SVM
svm_model.fit(X_reduced[X_train_idx], y_train)

2. Towhee流程内直接处理

在Towhee特征提取 pipeline 中加入展平步骤,避免后续二次处理:

import towhee

pipeline = (
    towhee.glob('your/audio/path/*')
          .audio_decode()
          .audio_embedding.timm(model_name='your_model')  # 替换为你使用的模型
          .lambda_map(func=lambda x: x.flatten())
          .to_list()
)
# 提取结果直接是展平后的特征数组
flattened_embs = pipeline.run()

注意事项

  • 若递归函数报错,打印单个样本的嵌套结构(如print(type(emb[0]), type(emb[0][0]))),调整递归逻辑适配实际结构;
  • 确保特征数据类型为float32/float64,避免类型错误;
  • 标签若为字符串,Scikit-learn会自动处理为分类目标,无需手动编码。

内容的提问来源于stack exchange,提问作者Aun Zaidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:10:52