十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
本篇內(nèi)容介紹了“怎么使用Logistic回歸”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),青海網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:青海等地區(qū)。青海做網(wǎng)站價(jià)格咨詢:18980820575
語(yǔ)音數(shù)字(Spoken digits)數(shù)據(jù)集是Tensorflow語(yǔ)音數(shù)據(jù)集的一個(gè)子集,它包括數(shù)字0-9之外的其他錄音。在這里,我們只關(guān)注識(shí)別口語(yǔ)數(shù)字。
數(shù)據(jù)集可以按如下方式下載。
data = download_url("http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz", "/content/") with tarfile.open('/content/speech_commands_v0.01.tar.gz', 'r:gz') as tar: tar.extractall(path='./data')
Downloading http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz to /content/speech_commands_v0.01.tar.gz HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))
digit = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] for x in digit: print(x, ": ", len(os.listdir('/content/data/'+x))) #平衡
zero : 2376 one : 2370 two : 2373 three : 2356 four : 2372 five : 2357 six : 2369 seven : 2377 eight : 2352 nine : 2364
數(shù)字相當(dāng)平衡,每個(gè)類有大約2300個(gè)樣本。因此,準(zhǔn)確度是評(píng)估模型性能的一個(gè)很好的指標(biāo)。準(zhǔn)確度是正確預(yù)測(cè)數(shù)與總預(yù)測(cè)數(shù)的比較。
對(duì)于不平衡的數(shù)據(jù)集,這不是一個(gè)很好的性能度量,因?yàn)樯贁?shù)類可能會(huì)黯然失色。
在訓(xùn)練一個(gè)模型時(shí),學(xué)習(xí)率逐漸降低,以對(duì)訓(xùn)練進(jìn)行微調(diào)。為了提高學(xué)習(xí)效率,可以采用循環(huán)學(xué)習(xí)率。在這里,學(xué)習(xí)率在不同時(shí)期的最小值和最大值之間波動(dòng),而不是單調(diào)下降。
初始訓(xùn)練率對(duì)模型的性能至關(guān)重要,低訓(xùn)練率可防止在訓(xùn)練開(kāi)始時(shí)被卡住,隨后的波動(dòng)抑制了局部極小值的情況。
該項(xiàng)目有三種分類方法:
使用五個(gè)提取的特征進(jìn)行Logistic回歸分析,準(zhǔn)確率為76.19%。
僅使用MFCCs的Logistic回歸-準(zhǔn)確率為95.56%。
CNN使用Mel譜圖-準(zhǔn)確率為95.81%。
通過(guò)改變epoch和訓(xùn)練率對(duì)模型進(jìn)行反復(fù)訓(xùn)練。隱藏層的數(shù)量和每個(gè)層中的節(jié)點(diǎn)也各不相同。這里描述了每種方法的最佳架構(gòu)和超參數(shù)。由于訓(xùn)練和驗(yàn)證集劃分的隨機(jī)性,再訓(xùn)練的精確度可能略有不同。
有五個(gè).ipynb文件:
特征提取-提取三種方法所需的CSV文件和特征。
特征可視化-在每個(gè)類中繪制特征圖。
Spokendigit五個(gè)特征-使用五個(gè)提取的特征實(shí)現(xiàn)邏輯回歸。
Spokendigit MFFC-使用MFCC實(shí)現(xiàn)邏輯回歸。
Spokendigit CNN-使用Mel譜圖實(shí)現(xiàn)CNN。
提取的特征包括:
Mel Frequency Cepstral Coefficients (MFCCs)-根據(jù)人類聽(tīng)覺(jué)系統(tǒng)的響應(yīng)(Mel尺度)間隔的頻帶組成聲音的頻譜表示的系數(shù)。
Chroma-與12個(gè)不同的音高等級(jí)有關(guān)。
Mel spectrogram的平均值-基于Mel標(biāo)度的Mel譜圖。
Spectral Contrast-表示譜的質(zhì)心。
Tonnetz-代表音調(diào)空間。
這些特征是大小為(20,)(12,)(128,)(7,)和(6,)的NumPy數(shù)組。這些連接起來(lái)形成一個(gè)大小為(173,)的特征數(shù)組。標(biāo)簽被附加到數(shù)組的頭部,并寫(xiě)入每個(gè)記錄的CSV文件中。
def extract_features(files): data, sr = librosa.load('/content/data/'+files.File) mfccs = np.mean(librosa.feature.mfcc(y = data, sr=sr).T, axis = 0) stft = np.abs(librosa.stft(data)) chroma = np.mean(librosa.feature.chroma_stft(S = stft, sr = sr).T, axis = 0) mel = np.mean(librosa.feature.melspectrogram(data, sr).T, axis = 0) contrast = np.mean(librosa.feature.spectral_contrast(S = stft, sr = sr).T, axis = 0) tonnetz = np.mean(librosa.feature.tonnetz(y = librosa.effects.harmonic(data), sr = sr).T, axis = 0) #print(mfccs.shape, stft.shape, chroma.shape, mel.shape, contrast.shape, tonnetz.shape) row = np.concatenate((mfccs, chroma, mel, contrast, tonnetz), axis = 0).astype('float32') csvwriter.writerow(np.concatenate(([digit.index(files.Label)], row)))
線性回歸模型共有1個(gè)輸入層、2個(gè)隱藏層和1個(gè)帶ReLu激活的輸出層。
class SpokenDigitModel(nn.Module): def __init__(self): super().__init__() self.l1 = nn.Linear(173, 1024) self.l2 = nn.Linear(1024, 512) self.l3 = nn.Linear(512, 64) self.l4 = nn.Linear(64, 10) def forward(self, x): x = F.relu(self.l1(x)) x = F.relu(self.l2(x)) x = F.relu(self.l3(x)) x = self.l4(x) return x def training_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) return loss def validation_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) _, pred = torch.max(outputs, 1) accuracy = torch.tensor(torch.sum(pred==labels).item()/len(pred)) return [loss.detach(), accuracy.detach()]
model = to_device(SpokenDigitModel(), device) history = [] evaluate(model, val_dl)
{'accuracy': 0.10285229980945587, 'loss': 3.1926627159118652}
history.append(fit(model, train_dl, val_dl, 64, 0.01))
r = evaluate(model, val_dl) yp, yt = predict_dl(model, val_dl) print("Loss: ", r['loss'], "\nAccuracy: ", r['accuracy'], "\nF-score: ", f1_score(yt, yp, average='micro'))
Loss: 2.0203850269317627 Accuracy: 0.7619398832321167 F-score: 0.7586644125105664
該模型在CPU上訓(xùn)練約3分鐘,準(zhǔn)確率為76.19%。
plot(losses, 'Losses')
從最小值開(kāi)始,最終驗(yàn)證損失慢慢變大。
plot(accuracies, 'Accuracy')
以上為準(zhǔn)確率曲線
plot(last_lr, 'Last Learning Rate')
以上為每一epoch的學(xué)習(xí)率曲線
該模型僅使用Mel頻率倒譜系數(shù)(MFCCs)。這個(gè)特征是一個(gè)大小為(20,)的NumPy數(shù)組。它從包含上述所有特征的CSV文件中檢索。
線性回歸模型共有1個(gè)輸入層、2個(gè)隱藏層和1個(gè)帶ReLu激活的輸出層。
class SpokenDigitModel(nn.Module): def __init__(self): super().__init__() self.l1 = nn.Linear(20, 1024) self.l2 = nn.Linear(1024, 512) self.l3 = nn.Linear(512, 64) self.l4 = nn.Linear(64, 10) def forward(self, x): x = F.relu(self.l1(x)) x = F.relu(self.l2(x)) x = F.relu(self.l3(x)) x = self.l4(x) return x def training_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) return loss def validation_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) _, pred = torch.max(outputs, 1) accuracy = torch.tensor(torch.sum(pred==labels).item()/len(pred)) return [loss.detach(), accuracy.detach()]
model = to_device(SpokenDigitModel(), device) history = [] evaluate(model, val_dl)
{'accuracy': 0.08834186941385269, 'loss': 8.290132522583008}
history.append(fit(model, train_dl, val_dl, 128, 0.001))
r = evaluate(model, val_dl) yp, yt = predict_dl(model, val_dl) print("Loss: ", r['loss'], "\nAccuracy: ", r['accuracy'], "\nF-score: ", f1_score(yt, yp, average='micro'))
Loss: 0.29120033979415894 Accuracy: 0.9556179642677307 F-score: 0.9556213017751479
該模型在CPU上訓(xùn)練約10分鐘,準(zhǔn)確率為95.56%。
mfcc是基于Mel尺度的,在Mel尺度中,頻率是根據(jù)人的聽(tīng)覺(jué)反應(yīng)而不是線性尺度來(lái)分組的。人耳是一個(gè)經(jīng)過(guò)考驗(yàn)的語(yǔ)音識(shí)別系統(tǒng),因此Mel尺度給出了很好的結(jié)果。
另一方面,mfcc容易受到背景噪聲的影響,因此在處理干凈的語(yǔ)音數(shù)據(jù)(無(wú)噪聲或最小噪聲)時(shí)效果最好。
plot(losses, 'Losses')
以上是驗(yàn)證集損失曲線
plot(accuracies, 'Accuracy')
以上是驗(yàn)證集準(zhǔn)確率曲線
plot(last_lr, 'Last Learning Rate')
以上是每個(gè)epoch最后學(xué)習(xí)率的曲線
該模型使用了Mel譜圖。Mel譜圖是將頻率轉(zhuǎn)換為Mel標(biāo)度的譜圖。這些特征從錄音中提取并存儲(chǔ)在驅(qū)動(dòng)器中。這花了4.5個(gè)多小時(shí)。
def extract_mel(f, label): data, sr = librosa.load('/content/data/'+label+'/'+f) fig = plt.figure(figsize=[1,1]) ax = fig.add_subplot(111) ax.axes.get_xaxis().set_visible(False) ax.axes.get_yaxis().set_visible(False) ax.set_frame_on(False) S = librosa.feature.melspectrogram(y=data, sr=sr) librosa.display.specshow(librosa.power_to_db(S, ref=np.max), x_axis='time', y_axis='mel', fmin=50, fmax=280) file = '/content/drive/My Drive/Dataset/spokendigit/'+label+'/' + str(f[:-4]) + '.jpg' plt.savefig(file, dpi=500, bbox_inches='tight',pad_inches=0) plt.close()
class SpokenDigitModel(nn.Module): def __init__(self): super().__init__() self.network = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(256, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 10), nn.Sigmoid() ) def forward(self, x): return self.network(x) def training_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) return loss def validation_step(self, batch): inputs, labels = batch outputs = self(inputs) loss = F.cross_entropy(outputs, labels) _, pred = torch.max(outputs, 1) accuracy = torch.tensor(torch.sum(pred==labels).item()/len(pred)) return [loss.detach(), accuracy.detach()]
model = to_device(SpokenDigitModel(), device) history = [] evaluate(model, val_dl)
{'accuracy': 0.09851787239313126, 'loss': 2.3029427528381348}
history.append(fit(model, train_dl, val_dl, 128, 0.001))
r = evaluate(model, val_dl) yp, yt = predict_dl(model, val_dl) print("Loss: ", r['loss'], "\nAccuracy: ", r['accuracy'], "\nF-score: ", f1_score(yt, yp, average='micro'))
Loss: 1.492598056793213 Accuracy: 0.9581243991851807 F-score: 0.9573119188503804
該模型在Colab GPU上訓(xùn)練約5小時(shí),準(zhǔn)確率為95.81%。
高準(zhǔn)確率可以再次歸因于Mel標(biāo)度。
plot(losses, 'Losses')
以上是驗(yàn)證集損失曲線
plot(accuracies, 'Accuracy')
以上是驗(yàn)證集準(zhǔn)確度曲線
plot(last_lr, 'Last Learning Rate')
以上是每個(gè)epoch最后學(xué)習(xí)率的曲線
“怎么使用Logistic回歸”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!