F#.NET Frameworkのニューラルネットワークライブラリのソースコード

調性分析テキスト生成 、およびHabréの記事で使用されているニューラルネットワークのソースコードに関するリクエストを時々受け取ります。 そのため、かなり粗雑なコードであるにもかかわらず、それらが依存するライブラリとともに、それらをすべてパブリックドメインに投稿することにしました。 この記事では、どこで何ができるか、そしてそれをどのように使用するかについて少し説明します。 ライブラリはF#で記述されていますが、任意の.NET言語から使用できます。



実装

ニューラルネットワークのライブラリは、私がF#言語で記述しています。 なぜf#? 要するに、言語としてのF#はPythonの利点があり、現在人気があり(たとえば、単純な構文、スクリプトをインタラクティブに実行する機能、クロスプラットフォームなど)、プログラムのラピッドプロトタイピングに非常に適しています。 しかし、(私にとって)本質的な違いは静的な強い型付けです。 F#には、自動型推論などの機能があります。 変数の型を明示的に宣言しないコンパイラは、コンパイル時に型を決定できます。 以前はPythonを使用していましたが、個人的にF#に切り替えることで、眠れない夜のデバッグを大幅に節約できると言えます。 Pythonにはもちろん利点がありますが、私にとっては短所を上回っていませんでした。



問題の1つは、現在のPythonニューラルネットワークライブラリですべての好みと色を選択できる場合、F#ではそれほど多くないことです。 そして、開発が始まったとき、状況はさらに悪化しました。たとえば、Encogなどの.NET Frameworkのライブラリがいくつかありましたが、それらに大きな変更を加えなければ新しいアーキテクチャを実装できませんでした。 だから私はゼロから私のものを書きました。 いずれにせよ、これは基本的な原則をより深く理解できるので、トピックに真剣に対処したい人にとって非常に有用な演習です。



特徴

きょう



短所:





私は本当にすべてを適切な形に変えて、最新の美しいドキュメントなどを書き、維持する機会がありません。 もちろん、誰かがこの開発と支援に興味を持ちそうという希望はわずかにあります。



役に立つものは何ですか? 機能を.NETアプリケーションに統合するためのニューラルネットワークの単純なライブラリとして(最近、kerasライブラリの分岐モデルを使用して.NETプロジェクトにエクスポートしました)。 実験用。 F#を使用したい人向け。 教育目的で-すべてのコードはF#にゼロから実装され、他のさまざまなライブラリには何も隠されていません。 ソースコードを私に尋ねたすべての人に。



このツールは、テキストからの用語の抽出、テキストの分類、およびテキストの生成にも適しています(ただし、この例はキットには含まれていませんが、必要なツールはライブラリにあります)。



入手先

https://github.com/Durham/NeuThink



使用を開始するには?

以下は、F#のXOR関数の単純なニューラルネットワーク実装の例です。



open NeuThink.Neuron open NeuThink.NeuronTraining let() = let nn = new GeneralNetwork() nn.AddPerceptronLayer(4,2,[|1|],true,0) nn.AddPerceptronLayer(1,4,[|-1|],false,1) nn.FinalizeNet() let outputs = [|[|-1.0|];[|-1.0|];[|1.0|];[|1.0|]|] let inputs = [|[|1.0;1.0|];[|0.0;0.0|];[|1.0;0.0|];[|0.0;1.0|]|] MomentumSGD 100 nn (new NeuThink.DataSources.SimpleProvider(inputs)) (new NeuThink.DataSources.SimpleProvider(outputs)) 0.2 (Some([|0;0;0;0|])) None nn.SetInput([|1.0;1.0|]) System.Console.WriteLine(nn.Compute().[0])
      
      







ここでは、4つのニューロンの1つの隠れ層と1つのニューロンの1つの出力層で、ニューラルネットワークが作成されています。 実際、XORの場合、隠れ層内の2つのニューロンで十分ですが、トレーニング中に最小ネットワークがローカルミニマムに陥ることがよくあります。 XOR出力には0と1の代わりに-1と1が使用されました。これは、デフォルトですべてのtanhレイヤーのアクティベーション関数で、出力範囲が-1〜1であるためです。



 nn.AddPerceptronLayer(4,2,[|1|],true,0)
      
      





これは、完全に接続された1つのレイヤー(高密度またはMLPレイヤーとも呼ばれます)を追加することを意味します。 4-レイヤー内のニューロンの数、2-入力の数。 [| 1 |]は、このレイヤーが接続されるレイヤー番号の配列です(不便です、はい。ただし、機能し、任意のグラフを定義できます)。 どこにもデータを送信する必要がない場合は、-1を指定する必要があります(空の配列ではないのはなぜですか?歴史的に判明しました...)。 次のパラメーターは、入力がこのレイヤーに送られることを意味し、0はレイヤーの処理順序を示します。



必要なすべてのレイヤーを追加した後、FinalizeNet()メソッドを呼び出す必要があります。このメソッドはいくつかのユーティリティ計算を実行します。



入力データは、float配列の配列として編成され、各内部配列は1つのトレーニング例に対応しています。 出力も整理されます。 アレイからネットワークをトレーニングするには、ニューラルネットワークのデータソースを作成する必要があります。 IInputProviderインターフェイス(出力用)またはIOutputProviderを実装するクラスである必要があります。 データが動的に生成されたり、ディスクから読み取られたりする場合、メモリに収まらないため、これは非常に困難です。 単純な場合、複雑さは必要ありません。組み込みのSimpleProviderクラスを使用して、配列のデータで初期化します。



次に、ニューラルネットワークの学習関数自体が、0.2の初期学習率と100個の反復回数で呼び出されます。 その後、トレーニングされたネットワークを使用して、新しいデータの結果を予測できます。



F#には対話型コンソールがあり、そこから作業できることに注意してください。







要するに、これですべてです。 ご質問やご提案がある場合は、お問い合わせください。



All Articles