徒然電脳

日々のプログラミング(とその他)忘備録 このサイトは独自研究のみに基づきます マサカリ歓迎しますというかよろしくお願いします

【エクセルファイル出力】ノスタルジアスコアツール

ノスタルジアという音ゲー

近頃熱心に取り組んでいるのは「ノスタルジア」という音ゲーです。
ピアノを引いた気分になれます。
楽しい。

f:id:TempProg:20171028005156j:plain

スコアデータを自由に使えない

ノスタルジアはeAMUSEMENTというサービスを通して自分のスコアを確認できます(有料)。しかしこれ、正直言って自由度が低いです。レベルでフィルタかけることもできない。不便。

f:id:TempProg:20171028004620j:plain

楽曲名とスコアソートのみ

つくるか

つくった。
(一応誰かが作ってるスコアツールがあるのですが、楽曲データが更新されない等の不具合が存在しています。
そちらがバージョンアップしてくれればそちらのほうが有能なのですが)

f:id:TempProg:20171028004732j:plain

こんなんから~ログインして~ボタンを押すと~


f:id:TempProg:20171028004521j:plain

xlsxがはいできあがり。

ダウンロード

適当なバグいっぱいあると思うけど、欲しい人はどうぞ。


.NET 4.6.1

11/15 追記
Ver 1.1
・xlsxファイル名を日時にし、上書きされないよう変更
・演奏回数の情報を追加

12/14 追記
Ver 1.2
・グレード合計値を算出
・xlsxファイルをエクセルで開かず、エクスプローラーで開くよう変更
OpenOfficeなど、Excel以外のxlsxを開けるソフトウェアでスコアを確認できるようになりました!
https://1drv.ms/u/s!Aut57LjFohtLyGroXHCC148o3U06

ディープラーニング2 ~ニューラルネットワークへ

目次

ディープラーニング1
ディープラーニング2 ←イマココ

パーセプトロンニューラルネットワークへ発展

ニューラルネットワークは入力層、中間層(隠れ層)、出力層の3つから構成されます。

f:id:TempProg:20171021004332p:plain 図1

例えば、図1の例では左側の2つのニューロンが入力層、真ん中の3つのニューロンが中間層(隠れ層)、右が出力層ということになります。 ニューラルネットワークは、ニューロンのつながり方はパーセプトロンと変わりませんが、その中身が少し異なります。次から中身を少し見てみましょう。

 ニューロンの中身

さて、ニューラルネットワークにおけるニューロンの中身を見てみます。 前回、パーセプトロンにおける入力と出力の関係は式1で表現できるとしました。

式1

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x_1w_1 + x_2w_2 \leq θ) \\
         1\qquad(x_1w_1 + x_2w_2 > θ)
        \end{array}
      \right.
    \end{eqnarray}
  }

そして、閾値[θ]をバイアス[b]として書き換えたのが式2です。

式2

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(b + x_1w_1 + x_2w_2 \leq 0) \\
         1\qquad(b + x_1w_1 + x_2w_2 > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

バイアスで書き換えた事により、図2のような表現ができます。

f:id:TempProg:20171021005442p:plain 図2

このように、bも入力の一部として認識することが可能です。 更に式2に対して新しく関数hを定義し、簡略化します。

式3

{\displaystyle
y = h(b + x_1w_1 + x_2w_2) \\ \\

    h(x) = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x \leq 0) \\
         1\qquad(x > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

ニューラルネットワークにおいて使われる関数hは活性化関数と呼ばれます。 この一連の流れから、パーセプトロンにおける活性化関数は式3のように定義されていると説明できます。 これが階段関数であることは議論の必要性はないと思います。

sigmoid関数

前項で一般的に活性化関数という存在を明かしました。これはいわば、階段関数以外の関数も利用されるということです。

式4

{\displaystyle

    h(x) = \frac{1}{1 + e^{-x}}
  }

式4の関数をsigmoid関数と呼びます。図3はsigmoid関数のグラフです。(pythonのmatplotlibを使用)

f:id:TempProg:20171021011416p:plain図3

sigmoid関数はy = 0とy = 1の直線に漸近します。これは階段関数をより滑らかにした関数といえるかもしれません。

ReLU関数

式5

{\displaystyle
    h(x) = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x \leq 0) \\
         x\qquad(x > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

  }
]

図4は式5のReLU関数のグラフです。

f:id:TempProg:20171021011922p:plain 図4

sigmoid関数とReLU関数、階段関数の違い

どの活性化関数を使うかによってニューラルネットワークの振る舞いは大きく変わるはずです。どうやら、どれを使うかによってどう変わるかについては現在の私には理解不可能のようですが、ReLU関数がベスト?無難?な印象を受けました。

非線形

活性化関数は上記で紹介したもの以外にも多数存在します。 しかし、そのどれもが非線形です。 そこには理由があります。 証明まではしませんが、軽い説明。

仮に活性化関数を式6のような線形関数と定義してみます。

式6 (a, bは定数)

{\displaystyle

    h(x) = ax + b
  }

ニューラルネットワークは何層もありますから、たとえば出力は式7のような状態になります。

式7

{\displaystyle

    y = h(h(h(x)))
  }

これを展開してみましょう。

式8

{\displaystyle
y = a(a(ax + b) + b ) + b \\
y = a(a^{2}x + ab + b) + b \\
y = a^{3}x + a^{2}x + a^{2}b + ab + b \\
y = (a^{3} + a^{2})x + (a^{2}b + ab + b)
  }

このように、3つ重ねても元のax + bの形に戻ってしまいます。 すなわち、線形関数を使って2層以上のニューロンを重ねる行為に意味が無いのです。(1層に落とし込める)

ディープラーニング1 ~パーセプトロン

はじめに

訳あってディープラーニングが必要になってきました。 急遽、オライリー社 斎藤康毅氏の「ゼロから作るDeepLearning Pythonで学ぶディープラーニングの理論と実装」を購入させてもらいました。

www.oreilly.co.jp

こちらの本で得たものを私なりの理解で書き連ねようと考えています。 このエントリーは自身の知識の整理が目的であり、読者への解説が目的ではありません。

ディープラーニングの学習を進めたい方は、別手段を選んでください。

パーセプトロン

パーセプトロンニューラルネットワークの起源であるアルゴリズムです。 ひとつのパーセプトロンはN次の入力を受け取り、0もしくは1の出力を行います。 入力には固有の重みが乗算され、入力すべての総和が閾値を超えると1を出力する、極めて単純な数式で記述できるアルゴリズムです。 下図の○部分はニューロンと呼ばれ、1を出力する時「ニューロンが発火する」という言い回しをするそうです。

f:id:TempProg:20171019002520p:plain

2入力のパーセプトロンは次式によって表されます。

(x1とx2を入力、yを出力、w1, w2を重み、θを閾値とする)

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(x_1w_1 + x_2w_2 \leq θ) \\
         1\qquad(x_1w_1 + x_2w_2 > θ)
        \end{array}
      \right.
    \end{eqnarray}
  }

ここまでくると、何やら論理回路のにおいがしてきます。 どうやらNANDが表現できるようです。

w1:-0.5

w2:-0.5

θ:-0.8

このような重みと閾値を設定してあげることで、NAND回路のような動作をしますね。 もちろん、重みと閾値の組み合わせは無限大にあります。

さて、ここで閾値θについて、-bと置き換えます。 すると次式が得られます。

{\displaystyle 
    y = 
    \begin{eqnarray}
      \left\{
        \begin{array}{l}
         0\qquad(b + x_1w_1 + x_2w_2 \leq 0) \\
         1\qquad(b + x_1w_1 + x_2w_2 > 0)
        \end{array}
      \right.
    \end{eqnarray}
  }

式が表す意味は変わりませんが、閾値の意味が変わりました。 bをバイアスと言います。バイアスはニューロンの発火のしやすさを表します。バイアスが大きければ大きいほど発火しやすいですね。

 多層パーセプトロン

パーセプトンは式から分かる通り線形です。すなわち、x1-x2の直行座標系における直線によってのみ出力の0と1を区切ることができます。 そこで、非線形によって領域を分けることを考えます。 そうです。パーセプトロンを重ねれば良いのです。

先程1つのパーセプトロンでNANDを表現しました。

このことは理論上すべての回路を表現できることを示します。(NAND回路の完全性)

 まとめ

  • パーセプトロンはN入力、1出力
  • 0か1を出力する
  • 重みと閾値(バイアス)を適当に決めてやることで、01出力の関数を設定
  • NANDが表現できる
  • パーセプトロンを重ねることで、より柔軟な表現が可能になる。

ニューラルネットワーク2 ~ニューラルネットワークへ - 徒然電脳

記事、全消ししてた

はてなブログ、1アカウントで複数ブログ管理できるようで。
それを知らず、新しい情報提供の場を設けようとして今までの記事削除してました。
が、複数ブログ管理可能なようで。

うーん、こうなるとこちら側のブログがもったいない。

更新停止していた勉強の記録でもまた始めようかな