我正在尝试通过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可以小批量更改权重,这将使我们能够批量使用不同的文件(因为每个音频都包含成千上万个用于分类的样本。对吗?
非常感谢!
答案 0 :(得分:0)
至少有一个问题是,在每次迭代中,样本的规模都不同,因为您将sc
应用于每个新批次。
for filename in audio_files:
...
Features = sc.fit_transform(Features)
sc
应该在循环之外定义,并这样使用:
Features = sc.transform(Features)