Mathieu Blondel氏によるKernel k-meansのPythonコードがあった。
上記のコードはPython 2系で書かれていたので、Python 3系で動くように整理した。
簡単なデモンストレーションを行うnotebookは以下の通り。 当該のコードをkernel_kmeans.pyとして保存して動かしたときのもの。
拡散モデルに関する備忘録として。
大量に関連リンクを集めてもそれだけで満足してしまいがちなので、この記事では少なめで。
GitHub - heejkoo/Awesome-Diffusion-Models: A collection of resources and papers on Diffusion Models ←このリポジトリをブックマークすれば事足りる(かも)
GitHub - YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy: Diffusion model papers, survey, and taxonomy ←論文が網羅的にまとまっている
PyODにおけるKernel PCAのコードは最近私がコミットしたものである。
ところで最近、PyODに以下のIssueが上がっていた。
SUODでインスタンスを複製して使うときに、すべての引数がNoneとして与えられる現象が起きているようだ。 引数がNoneになる状況は想定していなかったが、クラスのattributeを増やしてうまく対応できた。
PyOD本家にプルリクを送った。
うまくマージされることを祈る。
AIミュージックバトル!『弁財天』が配布しているスターターキットについて、PyTorch版を作成した記事を以前書いたことがあった。
その記事の段階では、Google Colabのノートブックを用意していなかったので、今回作ってみたということである。
以下のURLに置いてある。
各自のGoogle Driveにコピーして使うのがよいだろう。
AIミュージックバトル!『弁財天』 の成功を祈る。Let's ad-lib!
joblibとconcurrent.futuresを使った並列処理の実現方法についてそれぞれメモを残しておく。Pythonによる並列処理の関連記事はいくらでも見つかるのだが、個人的な備忘録ということで。
想定している状況:処理対象となるファイル数が多いので、直列で処理を動かすと時間がかかる。それを並列処理させることで、トータルでの実行時間の削減を目指す。例えば音声データ群(よくあるのは数百から数千ファイル)からの特徴量抽出を考えると、通常は音声ファイルごとに独立して抽出を行うので、並列処理に向いているというわけである。
サンプルコードの仕様:
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
から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
もあるが、本記事では省略。
異常音検知に関して、まとめてリストしておく。備忘録。
ToyADMOS
MIMII
SNSにて、しゃをみん氏が興味深い記事をツイートされていた。
昨日書きました。
— しゃをみん (@syao_ming) November 13, 2022
「コンピューターは遂に「音の高低」を理解した」と言えるほどの大きな進歩です。
【注目論文】Sinusoidal Frequency Estimation by Gradient Descent https://t.co/SbbNlZkdAW #Qiita @syao_mingより
上記の記事で紹介されている論文は、いわゆる複素正弦波オシレータが微分可能な形で定式化されることを示していた。 この「微分可能」なオシレータでは、元の波形を複素正弦波の重ね合わせで近似的に表現する。 そして各サンプル点において計算される波形の近似誤差に基づき、勾配降下法を利用してその誤差が小さくなるようにパラメータ全体を更新(訓練)できる。 ここでオシレータのパラメータとは、すなわち各複素正弦波の周波数、振幅、位相である。 特に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 |
各母音について、元の波形と近似波形をそれぞれ示す。
今回は128個の正弦波なので、ところどころで誤差は目立つが、概ね近似できているといえるだろう。
複素正弦波オシレータ を使ってみた、という記事であった。まだまだ可能性を秘めていると思われるので、読者各位も色々とアイディアを試してみると良いだろう。