Kernel k-meansのコードを整理した

Mathieu Blondel氏によるKernel k-meansのPythonコードがあった。

上記のコードはPython 2系で書かれていたので、Python 3系で動くように整理した。

簡単なデモンストレーションを行うnotebookは以下の通り。 当該のコードをkernel_kmeans.pyとして保存して動かしたときのもの。

gist.github.com

拡散モデルの勉強に役立つかもしれないリンク集

拡散モデルに関する備忘録として。

大量に関連リンクを集めてもそれだけで満足してしまいがちなので、この記事では少なめで。

書籍

解説論文

解説記事

解説動画

その他

実装

PyODにコミットしたKernel PCAのコードのバグを修正した

PyODにおけるKernel PCAのコードは最近私がコミットしたものである。

ところで最近、PyODに以下のIssueが上がっていた。

github.com

SUODでインスタンスを複製して使うときに、すべての引数がNoneとして与えられる現象が起きているようだ。 引数がNoneになる状況は想定していなかったが、クラスのattributeを増やしてうまく対応できた。

github.com

PyOD本家にプルリクを送った。

github.com

うまくマージされることを祈る。

AIミュージックバトル!『弁財天』スターターキットのPyTorch版Google Colabノートブックを作った話

はじめに

AIミュージックバトル!『弁財天』が配布しているスターターキットについて、PyTorch版を作成した記事を以前書いたことがあった。

tam5917.hatenablog.com

その記事の段階では、Google Colabのノートブックを用意していなかったので、今回作ってみたということである。

ノートブックの場所

以下のURLに置いてある。

各自のGoogle Driveにコピーして使うのがよいだろう。

colab.research.google.com

動かし方

  1. Google Driveのマイドライブ直下にbenzaitenフォルダを作成
  2. 以下のURLからyamlファイルをダウンロードして、上記benzaitenフォルダに置く https://gist.github.com/tam17aki/3ea977954d9ab7e152bf907c140a22b3
  3. 「ランタイム」→「ランタイムのタイプを変更」から、ハードウェアアクセラレータとして「GPU」を選択(最初はNoneが選択されている)
  4. 「ランタイム」→「すべてのセルを実行」

おわりに

AIミュージックバトル!『弁財天』 の成功を祈る。Let's ad-lib!

Pythonによる並列処理の書き方(joblib および concurrent.futures)

joblibとconcurrent.futuresを使った並列処理の実現方法についてそれぞれメモを残しておく。Pythonによる並列処理の関連記事はいくらでも見つかるのだが、個人的な備忘録ということで。

想定している状況:処理対象となるファイル数が多いので、直列で処理を動かすと時間がかかる。それを並列処理させることで、トータルでの実行時間の削減を目指す。例えば音声データ群(よくあるのは数百から数千ファイル)からの特徴量抽出を考えると、通常は音声ファイルごとに独立して抽出を行うので、並列処理に向いているというわけである。

サンプルコードの仕様:

  • 並列させたい処理: 関数 your_function にて定義
  • 処理対象となるファイル群: リスト変数 file_list で保持しておく

joblibを使う方法

joblibをpipでインストールしたのち、Parallelクラスおよびdelayedモジュールをインポートして使う。

from joblib import Parallel, delayed

def your_function(file_name):
    """並列処理実行
        
    Args:
         file_name (str): 並列処理の対象となるファイル
    """
    # 何らかの処理

Parallel(n_jobs=4)( # job数はお好みで
    delayed(your_function)(_file) for _file in file_list
)

delayedに関数を与えて、続いてその関数の引数を与える形である。

concurrent.futuresを使う方法

concurrent.futuresからProcessPoolExecutorクラスをインポートして使う。

from concurrent.futures import ProcessPoolExecutor

def your_function(file_name):
    """並列処理実行
        
    Args:
         file_name (str): 並列処理の対象となるファイル
    """
    # 何らかの処理

with ProcessPoolExecutor(max_workers=4) as executor: # max_workersがjob数に対応
    futures = [executor.submit(your_function, _file) for _file in file_list]
    for future in futures:
        future.result()

executor.submitの第1引数が並列処理対象の関数で、以降は関数の引数を与える形である。当然、関数の引数は複数個与えてもOK。

マルチスレッド用のThreadPoolExecutorもあるが、本記事では省略。

参考

github.com

tech.morikatron.ai

異常音検知関連の情報まとめ

異常音検知に関して、まとめてリストしておく。備忘録。

解説論文・スライド

スライド

論文

  • 深層学習を用いた異常検知技術(解説論文) Link
  • 環境音分析の研究動向(解説論文) Link
  • 環境音分析・異常音検知の研究動向(解説論文)Link
  • DCASE 2021のまとめ論文 Link
  • DCASE 2022のまとめ論文 Link

ソフトウェア

  • 異常検知/外れ値検知ライブラリ PyOD https://github.com/yzhao062/pyod
  • DCASE2020 Challenge Task 2 baseline system Link
  • DCASE2021 Challenge Task 2 baseline system (AutoEncoder) Link
  • DCASE2021 Challenge Task 2 baseline system (MobileNetV2) Link
  • DCASE2022 Challenge Task 2 baseline system (AutoEncoder) Link
  • DCASE2022 Challenge Task 2 baseline system (MobileNetV2) Link

データセット

書籍

コンペティション

  • DCASE2020 Challenge Task2 Link

  • DCASE2021 Challenge Task2 Link

  • DCASE2022 Challenge Task2 Link

微分可能な複素正弦波オシレータを用いて日本語5母音を近似させてみた

はじめに

SNSにて、しゃをみん氏が興味深い記事をツイートされていた。

上記の記事で紹介されている論文は、いわゆる複素正弦波オシレータが微分可能な形で定式化されることを示していた。 この「微分可能」なオシレータでは、元の波形を複素正弦波の重ね合わせで近似的に表現する。 そして各サンプル点において計算される波形の近似誤差に基づき、勾配降下法を利用してその誤差が小さくなるようにパラメータ全体を更新(訓練)できる。 ここでオシレータのパラメータとは、すなわち各複素正弦波の周波数、振幅、位相である。 特にPyTorchをはじめとする自動微分が得意な深層学習フレームワークの力を借りて訓練することで、 近似波形とそれにかかるパラメータたちを高速かつ容易に手に入れることができるというわけである。

そこで本記事では、日本語5母音に対して実際に近似を行ってみたので、その結果を紹介する。

実装

しゃをみん氏の記事で紹介されていたサンプルコードをもとに、簡単なクラスを定義して訓練を実施するスクリプトを書いた。

上記のスクリプトで読み込まれる、実験条件が書かれたconfigファイルは以下の通りである。

実験

実験条件

訓練データは下記サイトにて提供されている5母音のファイルを利用した(a_1.wav からo_1.wav)。 wsignal.sakura.ne.jp

音声の分析条件を示す。上記5母音は44100Hzだが、16000Hzにリサンプリングして利用した。

項目 設定
基本周波数 (Hz) 16000
フレーム長 1024
ホップ長 80

実際の訓練に使用したのは、パワーが最大となるフレーム(区間)の音声のみである。 上記の分析条件により、各母音ごとに1024点のデータ系列を使用した。

今回は128個の複素正弦波の和によって各母音を近似する。つまり128個の複素正弦波に対応するパラメータ(周波数、振幅、位相)を訓練対象とした。

なおオプティマイザはAdam、学習率は0.0001、エポック数は50,000とした。

計算機環境を示す。

計算機環境 バージョンなど
OS Ubuntu 22.04
CPU Intel i9-9900K
GPU RTX2070
Python 3.10.6
PyTorch 1.13

実験結果

各母音について、元の波形と近似波形をそれぞれ示す。

図1: /a/の波形

図2: /i/の波形

図3: /u/の波形

図4: /e/の波形

図5: /o/の波形

今回は128個の正弦波なので、ところどころで誤差は目立つが、概ね近似できているといえるだろう。

おわりに

複素正弦波オシレータ を使ってみた、という記事であった。まだまだ可能性を秘めていると思われるので、読者各位も色々とアイディアを試してみると良いだろう。