[Chia sẻ] zaloai-music

classification

#1

Chào mọi người, Nhóm mình ( https://vimentor.com/vi ) cũng may mắn đứng top 2 trong bài toán Music classification trong cuộc thi của Zalo. Cũng mong được chia sẻ chút ít kinh nghiệm mà nhóm đã tích lũy trong thời gian qua và qua cuộc thi lần này. Về cách làm và ý tưởng cũng khá giống với các bạn đã chia sẻ. Cơ bản mình làm 4 bước sau:

Bước 1: Chia tập dữ liệu Để train dữ liệu mình đã chia tập train chứa các file mp3 thành 2 tập: cho validation chiếm 15% và cho training chiếm 85%

Bước 2: Chia file nhạc thành nhiều đoạn nhỏ cà convert chúng thành dạng phổ (melspectrogram) và chỉ dựa vào mỗi đoạn nhạc đó sẽ đoán ra được bài nhạc thuộc lớp nào. Bằng cách này có thể giảm được inbalance trong tập dữ liệu vì mình upsample các nhóm 1,9,10 cao hơn các nhóm khác.

Bước 3: Sử dụng pretrain model resnet18, resnet34. Mình cũng đã viết các models khác nhau trong code nhưng do thiêu thời gian và sức mạnh tính toán nên dùng vậy thôi. Các bạn có thể chọn model khác để train tùy vào time cũng như GPUs mà bạn có.

Bước 4: Sau khi có được khoảng 4 models từ các hyper-parameters khác nhau thì mình kết hợp chúng với nhau qua cách sau:

  • Ở bước training cho mạng deep mình đã upsample và mỗi mp3 có rất nhiều file nhỏ khác nhau, tuy nhiên khi kết hợp các model ở bước này mình chỉ chọn 8 mảnh đầu tiên để inferencing.
  • Mình sử dụng đầu ra của lớp cuối (softmax) của mỗi model làm features
  • Tiến hành inferencing tập validation và tập training thành các file có tên là “features_raw_fea_S_%s_1.csv” đó là các features cho ensamble model của mình. Mình có 4 model nên: Số lượng features cho ensamble model sẽ là 10 * 8 * 5 (number of classes * subsample number * number of models)
  • Tiến hành train và tune ensamble models: randomforest -> GradientBoosting -> XGBoost. Cuối cùng chọn XGboost.
  • Khi tune XGboost mình chọn BayesianOptimization và chỉ dùng tập validation để tune cho nhanh tiết kiệm thời gian và phù hợp với năng lực tính toán của máy mình có.
  • Khi đã có được bộ hyper-parameters tốt nhất cho ensamble model thì mình đã train lại ensamble model với cả tập train và validation.

End: Kết thúc quá trình mình có 4 deep models và một xgboost model để kết hợp chúng lại với nhau.

Còn nhiều điểm mình muốn cải thiện trong các phương pháp của mình.

  • Mình muốn cải thiện kết quả của 4 mạng resnet bằng model khác nếu tốc độ tính toán nhanh hơn.
  • Có thể áp dụng BayesianOptimization để tuning các hyper-parameters cho mạng deep và điều này cũng đòi hỏi tốc độ tính toán nhiều hơn.
  • Mình chỉ dùng melspectrogram, có thể sử dụng loại khác như MFCC. Hoặc thay vì bóc tách phổ (melspectrogram) chúng ta có thể bóc tách chromagram và sử dụng thêm kĩ thuật lọc nhiễu theo beat tuy nhiên cách này mình thấy preprocessing hơi lâu quá nên mình stop nó luôn.
  • Mình còn đang suy nghĩ liệu LSTM có hữu dụng không đôi với chromagram sau khi lọc nhiễu qua beat.

Docker và model/code mình đã up lên gitlab của mình tại: https://gitlab.com/bambootran89/zaloai-music.git. Rất mong nhận được đóng góp của các bạn để giúp mọi người cùng chinh phục được những đỉnh cao hơn trong tương lai.

Thank Bạn Tiep VuHuu đã cung cấp baseline. Mình đã kế thừa một phần code của bạn.