---
# System prepended metadata

title: '[和弦辨識 AICUP-2020](https://aidea-web.tw/topic/43d9cc47-b70e-4751-80d3-a2d7333eb77b)'

---

# [和弦辨識 AICUP-2020](https://aidea-web.tw/topic/43d9cc47-b70e-4751-80d3-a2d7333eb77b)

## 問題
從頭訓練深度學習模型，進行和弦辨識
- 比較 RNN, GRU 和 LSTM
- 選用不同的超參數, 如模型的 hidden_size, num_layers, bidirectional
<!-- - ~~預測時考慮 Chord Progressions~~ -->

## 評估標準
<!-- Chord Symbol Recall -->
$CSR = \frac{total\ duration\ of\ segments\ where\ annotation\ equals\ estimation}{total\ duration\ of\ annotated\ segments}$
$WCSR = \frac{\sum_{i}(length\ of\ i^{th}\ song×CSR_i)}{\sum length\ of\ each\ song}$

**計算分數用 script 待補**

## [資料集 CE500](https://drive.google.com/drive/folders/1PW5h97_8ETvtMfD8JL4oFWw7zJwogwq9)
500 首歌曲的 youtube 連結(有些已失效)，以及和弦標籤

和弦標注格式: [start_time, end_time, label]
範例: ["0.000000", "10.959615", "N"], ["10.959615", "12.021958", "D:maj"], ["12.021958", "13.709604", "B:min"]

(Hint: [Youtube 音樂下載教學](https://hackmd.io/@brad84622/Hk_71R7-v))

## 和弦辨識 pipeline
![](https://i.imgur.com/n8F29dd.png)

1. 特徵擷取: 模型輸入為 waveform 或頻率類特徵？(可參考 [librosa.feature](https://librosa.org/doc/main/feature.html#spectral-features))
2. 前處理: 模型會無法處理過長序列，要如何分割輸入為模型訓練資料？原始標籤為區間，如何與的預測對齊?
3. 模型: 模型輸出不只有一種格式，如何編碼和弦標記? (是否對和弦標記進行拆解)
4. 後處理: 對模型輸出解碼，直接取機率最大者，或是對和弦序列機率建模(HMM, CRF...)?

直接預測和弦種類的模型
![](https://i.imgur.com/6DA21bn.png =500x500)

分開預測和弦的 root 跟 quality 再組合的模型
![](https://i.imgur.com/kmtfpUg.png =500x)

## 報告
### 要點:
1. 紀錄訓練配置與結果
3. 畫出 loss, WCSR 曲線
2. 比較不同的特徵擷取方式
5. 判斷訓練的狀況

### 可紀錄的內容
- 特徵擷取方法
- 模型架構
- 訓練參數(learning rate, weight decay...)
- optimizer
- learning rate scheduer
- eraly stopping
- train loss, validation loss
- train WCSR, validation WCSR
- 訓練時長
- 任何其他實驗配置或結果

(Hint: 可以寫程式，自動儲存每一次的實驗配置與結果，或使用 tensorboard, wandb 等現成套件紀錄)

## 延伸討論
1. 除了 RNN 類模型可使用，還有哪些模型? 
2. 還有哪些方法可以編碼和弦標記?
3. 後處理直接取最大機率的預測通常表現最不好，還有哪些後處理方式?


## 培養能力
1. 運用深度學習知識，從頭實現出和弦辨識
2. 養成紀錄實驗的習慣，分析模型效能的能力