Suport向量机训练:sklearn SGDClassifier.partial_fit是否能够逐步训练SVM?

时间:2020-07-06 17:36:14

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

我正在尝试通过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可以小批量更改权重,这将使我们能够批量使用不同的文件(因为每个音频都包含成千上万个用于分类的样本。对吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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

sc应该在循环之外定义,并这样使用:

Features = sc.transform(Features)
相关问题