読者です 読者をやめる 読者になる 読者になる

TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

dlibをWindowsにインストールする

前々回の日記で、Bash on Windowsにdlibをインストールする方法を書いたが、Anaconda 4.1(64-bit)でインストールしたPython 3.5にもインストールできたので、その方法を示す。 ※2016/9/27追記:この方法でインストールしてもJPEGライブラリが有効にならない…

dlibでマンガの顔認識をやってみた

昨日の日記でBash on Windowsを使ってdlibで顔検出を行うことができたので、自分で用意した画像を使って、顔検出ができるか試してみた。↓この記事のようにアニメの画像での顔認識を試した例はいくつかありましたが、マンガでの例がなかったので試してみまし…

Bash on Windowsでdlibを使って顔検出する

最近、物体検出に興味がありネットの記事を調べていたら、こちらの記事で使われていたdlibによるHOG特徴量+SVGが検出精度が高いらしい。bohemia.hatenablog.comdlibはC++の総合的な機械学習のライブラリで、Python用のインターフェースも用意されている。自…

VSTプラグイン(vst_pitch)を更新

VSTプラグイン(vst_pitch)を更新しました。更新内容は、解析精度の改善と、オクターブ表示を440Hz=A3にするオプションの追加です。 オプションは要望を頂いたので対応しました。個人的には自分自身で一番使っているプログラムですが、Windows専用でDAWソフト…

自己相関関数と窓関数

以前の日記で、自己相関関数はウィーナー=ヒンチンの定理でFFTを使って高速に計算できることを書いた。自己相関関数は、同じ波形データ同士をずらしながら掛け合わせた値の合計であることを説明したが、その定義通り計算する場合は窓関数は特に必要ない。 …

ボーカル音程モニター(Vocal Pitch Monitor)をアップデートその2

前回の日記で、ボーカル音程モニター(Vocal Pitch Monitor)のアップデートについて書きましたが、解析精度に少し問題があったので、再度アップデートしました。どうやら母音が「う」の場合に、倍音を誤検知しやすくなっていました。 アップデートで倍音構成…

ボーカル音程モニター(Vocal Pitch Monitor)をアップデート

Androidアプリのボーカル音程モニター(Vocal Pitch Monitor)をアップデートしました。 マイクから入力した音声のピッチをリアルタイムで表示するアプリです。今回のアップデートで、C2以下の音程の解析精度を改善しました。 歌声やギターなどの弦楽器の音声…

FFTと窓関数に関する考察

前回の日記で、ピークの周波数の周辺のパワースペクトルの和がエネルギー(全周波数のパワースペクトルの総和)に占める割合について書いたろころ、Chachayさんからスペクトル漏れについてご指摘を頂いた。chachay.hatenablog.comFFTについてのはじめの日記を…

FFTとエネルギーについての考察(続き2)

前回の続きです。ピークの周波数の周辺のパワースペクトルの和がエネルギー(全周波数のパワースペクトルの総和)に占める割合を、400Hzから500Hzの範囲で0.1Hzおきに調べてみた。 fset = np.linspace(400, 500, 1001) range = [1, 3, 5] for r in range: peak…

FFTとエネルギーについての考察(続き)

前回の続きです。周辺のパワースペクトルの和を測ることで、周波数分解能の整数倍とのずれの影響をどれだけ抑えることができるか調べた。周辺3つのパワースペクトルの和をとった場合のピークの値を、400Hzから500Hzの間を0.1Hz間隔で調べた結果、以下のよう…

FFTとエネルギーについての考察

前回の日記で、FFTのピークの値は周波数分解能の整数倍とのずれによって値が変わるため単純には比較できないことを説明した。ここでは、周波数全体のエネルギーについては、周波数分解能の整数倍とのずれによらず一定となることについて考察する。エネルギー…

自己相関関数を使用した基本周波数の測定

昨日の日記で、FFTのピークは、周波数分解能によって決まる基底関数の最小周波数の整数倍とのずれによって値が変わることを説明した。ここでは、自己相関関数を使用すると周波数分解能によらず安定して基本周波数を測定できることを示す。 まず、FFTで倍音を…

FFTのピークでは基本周波数を測れないわけ

囲碁ばかりだったので久しぶり音ネタについて書きます。AndroidとiOSでリリースしている「Vocal Pitch Monitor」では、基本周波数(ピッチ)の測定に自己相関関数を使用している。基本周波数はFFTのピークで測れるのではないかと思われがちだが、FFTのピークで…

SL policy networkの囲碁プログラムへの適用

以前に学習したSL policy networkを囲碁プログラムに適用してみた。特徴を4つに絞って、学習を160万局面で行ったものなので、棋譜との一致度は30%くらいの状態だが、そこそこ効果はあるのではないかと思って試してみた。 学習している棋譜は19路盤なので、19…

rollout policyの学習(やり直し)

以前にrollout/tree policyをAdaGradで学習させたが、学習データとは別のテストデータを使った評価を行っていなかったので、学習をやり直した。学習に使用させてもらっていた棋譜サイトが閉鎖してしまったので、今回からGoGoDという有料の棋譜を購入して使用…

Bash on Windowsのホームディレクトリ変更

Windows 10 Anniversary Updateが公開されたので、さっそくBash on Windowsを使ってみました。といっても、今のところMinGW/MSYS2で間に合っているので特段利用したい用途はありませんが。 本当は、Bash on WindowsからGPUが使えたら、TensorFlowを使ってみ…

cuDNNでAlphaGoのSL policy networkの順伝播を実装する

Chainerを使って学習したAlphaGoのSL policy networkのモデルを使用して、C++のプログラムからcuDNNを使用して順伝播を実装してみた。SL policy networkを囲碁のプログラムに組み込んで使おうとすると、PythonとChainerが必要になるのでは実行環境の敷居が高…

コンパイラによるFFTの速度比較(再測定)

以前の日記で、コンパイラごとのFFTの実行速度を比較した結果を記載しましたが、この記事を見て、gccがVisual C++に比べて速いという内容が以前の私の測定と違っていたので再測定を行いました。この記事で使用しているgccは、MSYS2のものを使用しているよう…

CaffeでSL policy networkを学習

前回の日記で定義した、AlphaGoのSL policy networkをCaffeで学習してみた。以前にChainerを使って学習した結果と速度、精度を比較するため、条件を合わせている。 インターネットから入手したプロの棋譜を使用 特徴はAlphaGoの論文のExtended Data Table 2…

CaffeでAlphaGoのSL policy networkを定義する

以前にChainerを使って、AlphaGoのSL policy networkを定義しましたが、Caffeでも定義してみました。Caffeでのモデル定義は、prototxt形式で記述します。SL policy networkは以下のように定義できます。 sl_policy_network.prototxt name: "SLPolicyNetwork"…

Caffeを使ってC++で3層パーセプトロンを学習する

前回の日記でCaffeをC++から使うことができたので、3層パーセプトロンを学習させてみた。Caffeではモデルをprototxt形式で記述する。 学習方法を記述したsolver.prototxtとネットワークを記述したnet.prototxtの2つのファイルを作成する。 ファイル名は別の…

WindowsでビルドしたCaffeをC++から使う

前回の日記でWindowsでビルドしたCaffeをC++から使うことができたので方法を書いておきます。Windows版caffeをビルドしたVisual Studio 2013のソリューションにプロジェクトを追加する形でプロジェクトを作成します。 はじめソリューションを新規作成して、…

WindowsでCaffeをビルドしてGPUで実行する

※2017/3/15追記 Windows版のリポジトリでビルド済みのバイナリが配布されています。自分でビルドしないでもそちらのバイナリを使用することをお勧めします。 ビルド済みのバイナリのインストール方法とサンプルの実行方法はこちらの日記を参照ください。Wind…

ChainerのモデルをC++で読み込む

以前の日記でAlphaGoのSL policy networkをChainerで学習した結果をC++の囲碁プログラムで使用したいと考えている。 その際、C++からPythonを実行するのでは、オーバーヘッドが大きく、実行環境のハードルが上がりポータビリティが下がってしまう。 そこで、…

Visual Studio 2015 Communityの日本語インストーラ

ゴールデンウィークにCPUとマザーボードを変えたので、Windows 10を再インストールした。その後、Visual Studio 2015 Communityをインストールしたら、日本語パックをインストールしても、一部英語のままで完全に日本語にならず困っていた。最悪なのは、アプ…

WindowsでcuDNNを使用して畳み込みを行う(活性化関数追加)

前回の日記で実装した畳み込みのコードに活性化関数を追加しました。活性化関数は、cudnnCreateActivationDescriptorでハンドルを作成し、cudnnSetActivationDescriptorでどの関数を使用するか選択し、cudnnActivationForwardで実行できます。活性化関数とし…

WindowsでcuDNNを使用して畳み込みを行う(bias追加)

前回の日記でcuDNNで実装した畳み込みにbiasを追加した。畳み込みのバイアスは、フィルターごとに加算する。バイアスは、[1][フィルター数][1][1]の4次元配列となる。cudnnCreateTensorDescriptorで、[1][フィルター数][1][1]の4次元配列を定義する。畳み込…

WindowsでcuDNNを使用して畳み込みを行う

前回の日記で書いた方法でChainerのコードを調べつつ、WindowsでcuDNNを使用して畳み込みを行うことができたので、方法を示しておく。 使用バージョン Windows 10 CUDA7.5 cuDNN v5 Visual Studio 2015 cuDNN v5を使用するには、CUDA7.5が必要になる。 CUDA7…

Chainerをデバッグする

WindowsでVisual C++で作成したC++のプログラムからDCNNを実行したいが、C++に対応したライブラリを動かすのに苦労している。 Caffeを試しているがビルドはできて、CPUでは実行できたが、GPUで実行すると謎の check failed: error == cudasuccess (8 vs. 0) …

CUDAを使ってみた

SL policy networkをChainerを使って学習した結果を、囲碁プログラムに組み込む際、C++のプログラムからDCNNの実行のためにpythonプログラムを呼ぶとオーバーヘッドが大きい。 できれば、DCNNをC++から実行したい。 順伝播のみであれば、ディープラーニング…

【Androidアプリ】ボーカル音程モニター バージョンアップ 1.2.2

バグの指摘を頂いたので修正しました。マイナースケールの6度の線が表示されないというバグです。 リリース前にちゃんとテストしないとだめですね。 iOS版も同じバグがあるので直す予定です。play.google.com

学習アルゴリズム変更

前回の日記で、SGDでSL policy networkを学習し、学習が成功していることが確かめられた。学習アルゴリズムをSGDにしたのは、AlphaGoの論文で採用されていたからだ。収束に非常に時間がかかるので、別の方法だともっと収束が早くならないか試してみた。 また…

SL policy networkの学習

前回の日記でChainerで作成したAlphaGoのSL policy networkをプロの棋譜を使って学習させてみた。棋譜は、以前と同様、インターネットの棋譜サイトから入手したプロの棋譜を使用した。まずは、学習がうまくいくか様子をみるため、特徴はAlphaGoの論文のExten…

Chainerで位置ごとに異なるバイアスを定義する

前回の日記で、AlphaGoのSL policy networkをChainerで定義した際に、layer13の位置ごとに異なるバイアスを、(19*19)次元のベクトルとして、Convolution2Dを1次元にreshapeした後、足し合わせていたが、ミニバッチにした場合うまくいかないことが分かった。V…

ChainerでAlphaGoのSL policy networkを定義

AlphaGoのSL policy networkをとりあえず定義だけ作ってみました。AlphaGoの論文から、SL policy networkは以下のようになると理解しています。 layer1は、5*5のフィルターk枚、ReLU関数 layer2~12は、3*3のフィルターk枚、ReLU関数 layer13は1*1のフィルタ…

【囲碁プログラム】 rollout/tree policyをAdaGradで学習

※学習のやり直しを行った記事はこちらプロの棋譜からrollout/tree policyを学習してもGnuGoに対して勝率が30%程度であまり高くなっていない。学習に確率的勾配降下法(SGD)を固定の学習係数(0.001)とL1正則化係数(0.0000001)を使っていたので、 学習方法を変…

WindowsでChainerをGPUを使って動かす

WindowsでChainerをGPUを使って動かすことができたので、手順をメモっておきます。使用したソフトのバージョンは以下の通りです。 Windows 10 Home 64bit Python 3.5.1(Anaconda 4.0.0 64bit) CUDA 7.5 cuDNN v5 Chainer 1.8.2 使用したGPUは、Geforce GTX 7…

【囲碁プログラム】 tree policyの学習

AlphaGoの論文にあるtree policyをプロの棋譜から学習を行った。rollout plicyから追加される特徴は以下の3つ。 Self-atari … 次に取られる手 Last move distance … 直前の2手からのマンハッタン距離 Non-response patter … 12point diamondパターン Last mo…

【囲碁プログラム】 プレイアウトにパターン適用

昨日は第26回世界コンピュータ将棋選手権を中継で観ていました。 コンピュータ将棋はまだまだ進化しているようで熱くなりますね。 チェスのStockfishの技術が将棋にも応用されているみたいです。さて、AlphaGoとイセドルの対局を観てから作り始めた囲碁プロ…

【囲碁プログラム】 rollout policyの学習

インターネット上から入手した5万局くらいのプロの棋譜から、プレイアウトの特徴量を学習させてみた。 勝ったほうの手のみを学習することにしたので、勝敗データがない棋譜は除外した。特徴量は、AlphaGoの論文にあったrollout policyの特徴量とした。 ただ…

ビットボードの高速化

ここの記事に、_BitScanForward64を使う場合、ヒットしたビットを0にするのに、 n &= n - 1; とするとよいと書かれていたので試してみた。現在、ビットを0にするのに、 _bittestandreset64(&n, i); を使用している。記事では、下記のように1をシフトして演算…

【囲碁プログラム】 シチョウの判定

前回のプログラムにシチョウの判定を入れてみた。シチョウを判定するには、アタリを助けた後の呼吸点が2の場合、数手先まで読んで呼吸点が1になるか、3以上になるか確認する必要がある。数手先まで読む際、ボードのコピーを行うと処理時間がかかるので、手を…

【囲碁プログラム】 WindowsでPachiをビルドして動かす

オープンソースで強豪の囲碁プログラムであるPachiをWindowsでビルドして動かすことができたので、備忘録を兼ねて手順を記します。 PachiはWindowsのバイナリが配布されていますが、プログラムを開発する上ではソースコードをステップ実行して調べたいので、…

アタリから逃げる手

前回の囲碁プログラムにノード選択とプレイアウト時にアタリから逃げる手が選ばれやすくなるように修正を行った。ランダムプレイアウトとの対戦とGnuGoとの対戦では勝率が上がったが、自分で対戦してみると簡単にシチョウにはまるので弱くなったと感じる。理…

囲碁プログラムの高速化 その2(root並列化)

前回高速化した囲碁プログラムを並列化してさらに高速化した。並列化の手法は、rootノードとその直下の枝のみ各スレッドで共有して、それから下の枝はそれぞれスレッドごとに別に実行する方法とした。rootノードの直下の枝のプレイアウト回数、勝利数の更新…

囲碁プログラムの高速化

前回作成した囲碁プログラムにパターンを適用すると余りにも遅かったので、以下のようにボードの構成を変更して高速化を行った。 前回 ボードを各目の石の色で構成 高速化版 ボードを連の集合で構成 各連ごとの呼吸点の位置の情報(ビットボード)を保持 各目…

囲碁プログラムのプレイアウトにパターンを適用

前回作った囲碁プログラムのプレイアウトで、プロの棋譜から学習したパターンの確率に応じて手を選択するようにしてみた。はじめ局面全体の合法手について3×3パターンを適用してみたが、まったく強くならない上に、30倍くらい遅くなってしまった。そこで、直…

Chainerで3層パーセプトロンの誤差逆伝播を実装してみた

前回の記事で、numpyを使って行列演算で3層パーセプトロンを実装しましたが、同じことをChainerを使って実装してみます。 import numpy as np import chainer from chainer import Function, Variable, optimizers from chainer import Link, Chain import c…

Pythonで3層パーセプトロンの誤差逆伝播を実装してみる

入力層、隠れ層、出力層で構成される単純なニューラルネットワークで、 誤差逆伝播を計算します。隠れ層の活性化関数はsigmoid、 出力層の活性化関数はsoftmaxとします。誤差関数(損失関数)は、交差エントロピーを使用します。それぞれの式は以下の通りです…

囲碁プログラム

Pythonで作った囲碁プログラムをC++で書き直しました。github.com GTPに対応させたので、GnuGoと対戦させてみましたが、 デフォルトのレベルではまったく勝てませんでしたorzレベルを5まで落としてようやく勝てることがある程度。プレイアウト回数を10000ま…