【问题标题】:Suport Vector Machine training :Is sklearn SGDClassifier.partial_fit able to train an SVM incrementally?支持向量机训练:sklearn SGDClassifier.partial_fit 是否能够增量训练 SVM?
【发布时间】:2020-10-26 21:33:37
【问题描述】:

我正在尝试通过 sklearn 训练一个 SVM 模型,以将其用作二进制分类器以获取音频的理想二进制掩码(IBM),该模型是在我为毕业论文开发的神经网络之后应用的,如图所示 !this graph,精度永远不会收敛。无论使用多少音频,平均准确率始终约为 50%,考虑到我们只有两个选择,这是随机的。

#SVM instance
from sklearn.linear_model import SGDClassifier   
SVM = SGDClassifier(loss='hinge',penalty='l2',warm_start = True,shuffle=True) 

#Start training
CLEAN_DATA_PATH = r"D:\clean_trainset_56spk_wav/"
NOISY_DATA_PATH = r"D:\noisy_trainset_56spk_wav/"

audio_files = os.listdir(CLEAN_DATA_PATH)
shuffle(audio_files)
count = 0    

for filename in audio_files:
    
    if count == 1000:
        break
    
    start = time.time()
    count += 1
    Clean, Sr = sf.read(CLEAN_DATA_PATH + filename,dtype='float32')
    Noisy, Sr = sf.read(NOISY_DATA_PATH + filename,dtype='float32')
    
    print("Áudio " + filename )
    
    Features, ibm = Extract_Features(Clean, Sr,Noisy)    
    y = ibm.reshape(-1,1)
    y = np.ravel(y)    
    Features = sc.fit_transform(Features) # Scale    
    SVM.partial_fit(Features,y,classes=np.unique(y))    
    end = time.time()
    
    print("Files training duration: "+str(round(end-start,2))+ " seconds")
    print("Done: "+str(round((contador/len(audio_files))*100,2))+"%")

据我所知,SGDClassifier.partial_fit 是小批量更改权重,什么可以让我们将不同的文件作为批次使用(因为每个音频都包含数千个用于分类的样本。对吗?

非常感谢!

【问题讨论】:

    标签: python machine-learning scikit-learn classification svm


    【解决方案1】:

    至少您的一个问题是,在每次迭代中,样本的规模都不同,因为您将 sc 拟合到每个新批次。

    for filename in audio_files:
        ...
        Features = sc.fit_transform(Features)
    

    sc 应该在循环之外定义,并按如下方式使用:

    Features = sc.transform(Features)
    

    【讨论】:

    • 哦,非常感谢。我已经可以将准确率提高到大约 70% 仅使用不同的方法来获取 IBM,但我没有意识到在 sc 上
    猜你喜欢
    • 2017-09-19
    • 2016-12-02
    • 1970-01-01
    • 2013-07-14
    • 2013-04-20
    • 2017-08-08
    • 2015-10-27
    • 2012-11-03
    • 2021-04-10
    相关资源
    最近更新 更多