序文
機械学習では、畳み込みニューラルネットワークは、画像認識に正常に適用されている深いフィードフォワードの人工ニューラルネットワークです。現在、多くのナンバープレート数の認識、顔認識などは、畳み込みニューラルネットワークを使用しています。畳み込みニューラルネットワークは、画像認識で大きな成功を収めていると言えます。 Caffe、Tensorflow、Torchなどの多くのオープンソースの深い学習フレームワークがあります。これらの深い学習フレームワークには、完全な畳み込みニューラルネットワークの実装が含まれます。それでは、なぜ私たちはまだ畳み込みニューラルネットワークを自分で書かなければならないのでしょうか?これらのオープンソースディープラーニングフレームワークを直接使用する方が良いでしょう。これは、迅速で対処しやすく、パフォーマンスが良く、バグが少ないことです。はい、畳み込みニューラルネットワークを使用していくつかのアプリケーションを実行し、その動作の原則を気にしない場合、畳み込みニューラルネットワークを書くために一生懸命働く必要はありません。しかし、畳み込みニューラルネットワークの実用的な原則を完全に習得したい場合、古代人は次のように述べています。したがって、それについての理解を深めるために、畳み込みニューラルネットワークを自分で実装することが非常に必要です。
cupcnnとは何ですか
Cupcnnは、Javaで書かれた畳み込みニューラルネットワークです。仕事に加えて、畳み込みニューラルネットワークの理解を深めるためにそれを実現しました。それは十分にシンプルで、うまく機能しているため、初心者が参照するのに非常に適しています。そのソースコードは、github:cupcnnからダウンロードできます
そのプロトコルなどの制限について心配する必要はありません。それを使用して何でもして任意に変更できます。それがあなたを助けることができれば、私はそれがあなたに星を与えることができることを願っています! ! !
^ - ^^ - ^^ - ^^ - ^
デザインのアイデア
初心者が学ぶのに役立つほどシンプルなニューラルネットワークであることを願っています。そのため、コードの導入性を保証する同時の加速を実装しませんでした。設計するとき、畳み込みニューラルネットワークを4つのモジュールに分割しました:ネットワーク(レイヤーブロブ損失がアクティブ)。これはパッケージ名から見ることができます。レイヤー、損失、およびアクティブにはすべて基本クラスがあり、ニューラルネットワーク全体のプログラミングは基本クラスに向けられています。ネットワークは、これらの4つのモジュールを統合し、リソースを調整し、ディスパッチするセンターです。各レイヤーにはネットワークのインスタンスがあるため、各レイヤーの出力、diffなどの取得など、ネットワークを介してさまざまなデータを簡単に取得できます。
設計ブロック図は次のとおりです。
パラメーターの保存は、Javaにとって非常に簡単です。シリアル化可能なインターフェイスを実装することで、パラメーターのシリアル化と敏aserializationをすばやく実装できます。 CUPCNNは、データディレクトリ内のBLOBおよびBLOBPARAMSのシリアル化可能なインターフェイスのみを実装し、これら2つによってすべてのパラメーターが実装されます。
現在のパフォーマンス
完全に接続されたニューラルネットワーク
現在、MNISTデータセットでは、完全に接続されたニューラルネットワーク(完全な接続(100) +フル接続(30) +フル接続(10) +ソフトマックス)が30のEPOでトレーニングされ、精度率は96.76のトレーニングが行われます。
畳み込みニューラルネットワーク
畳み込みニューラルネットワーク(6機能) +最大プーリング +畳み込み(6機能) +フル接続(512) +フル接続(30) +フル接続(10) +ソフトマックス)、学習レートが0.2の場合、30 EPOEがトレーニングされている場合、精度は97.79です。さらにパラメーターチューニングの後、十分なトレーニングの下で精度が高くなる可能性があると思います。
畳み込みニューラルネットワークのトレーニングスナップショットは次のとおりです。
電車を始めます
EPOE:0損失値:2.3019369891560455 LR:0.2精度は0.13です
EPOE:0損失値:2.0722489482105195 LR:0.2精度は0.44です
EPOE:0損失値:1.2423286194012682 LR:0.2精度は0.72です
EPOE:0損失値:0.7860529560675255 LR:0.2精度は0.79です
EPOE:0損失値:0.6272194196176664 LR:0.2精度は0.87です
EPOE:0損失値:0.5240051326725808 LR:0.2精度は0.84です
EPOE:0損失値:0.27637563581928026 LR:0.2精度は0.95です
EPOE:0 LOSSVALUE:0.35585388987055083 LR:0.2精度は0.92です
EPOE:0損失値:0.441971528417802 LR:0.2精度は0.92です
EPOE:0損失値:0.2563710325999674 LR:0.2精度は0.95です
EPOE:0損失値:0.39872273532502 LR:0.2精度は0.9です
EPOE:1 LOSSVALUE:0.264085484522027 LR:0.1600000000000000003精度は0.91です
EPOE:1 LOSSVALUE:0.22754066024803088 LR:0.1600000000000000003精度は0.96です
EPOE:1 LOSSVALUE:0.3025642097577103 LR:0.1600000000000000003精度は0.96です
EPOE:1 LOSSVALUE:0.18149648622985948 LR:0.16000000000000000003精度は0.99です
EPOE:1 LOSSVALUE:0.17723938748327 LR:0.1600000000000000003精度は0.96です
EPOE:1 LOSSVALUE:0.15041993009777443 LR:0.1600000000000000003精度は0.98です
EPOE:1 LossValue:0.10759545752665524 LR:0.1600000000000000000003精度は1.0です
cupcnnの使用
現在、CUPCNNはMNISTデータセットでテストを実装しています。 SRC/テストでは、MnistTestはメイン関数の入り口であり、特定のニューラルネットワークはMnistnetworkクラスに組み込まれています。 mnistnetworkクラスでは、それぞれ畳み込みニューラルネットワークの構築と完全に接続されたニューラルネットワークの構築を実装しているBuildConvnetworkとBuildFcNetworkを実装します。 Javaの優れたクロスプラットフォームプロパティのおかげで、CUPCNNのソースコードをダウンロードした後、Eclipseを使用してプロジェクトを開き、それを直接実行すると、MNISTデータセットでのトレーニングとテストを開始できるはずです。
ニューラルネットワークの構築
public void buildnetwork(){//最初にニューラルネットワークオブジェクトを構築し、パラメーターネットワーク= new Network()を設定します。 network.setBatch(100); network.setloss(new LoglikeHoodLoss()); //network.setLoss(New Crossentropyloss()); Optimizer = new SgDoptimizer(0.2); network.setoptimizer(optimizer); // buildfcnetwork(); BuildConvnetwork(); network.prepare(); } setBatch()関数は、バッチにある写真の数を設定します。
setLoss()は、使用する損失関数を設定します。 CUPCNNは、交差エントロピー損失関数と対数尤度損失関数を実装します。
setoptimizer()を使用して、オプティマイザーを設定する必要があります。 CUPCNNは、SGDオプティマイザーのみを実装します。より良いオプティマイザーを実装し、CUPCNNにそれを提出することをいとわない場合は、私はそれを深く歓迎したいと思います。
完全に接続されたニューラルネットワークを構築します
private void buildfcnetwork(){//ネットワークレイヤーをネットワークinputlayer layer1 = new inputlayer(network、new blobparams(network.getBatch()、1,28,28)); network.addlayer(layer1); FullConnectionLayer layer2 = new FullConnectionLayer(Network、new Blobparams(network.getBatch()、784,1,1)); layer2.setactivationfunc(new ReluactivationFunc()); network.addlayer(layer2); FullConnectionLayer layer3 = new FullConnectionLayer(Network、new Blobparams(network.getBatch()、100,1,1)); layer3.setactivationfunc(new ReluactivationFunc()); network.addlayer(layer3); FullConnectionLayer layer4 = new FullConnectionLayer(Network、new Blobparams(network.getBatch()、30,1,1)); layer4.setactivationfunc(new SigmodactivationFunc()); network.addlayer(layer4); FullConnectionLayer Layer5 = new FullConnectionLayer(Network、new Blobparams(network.getBatch()、10,1,1)); layer5.setactivationFunc(new ReluactivationFunc()); network.addlayer(layer5); softmaxlayer sflayer = new SoftMaxlayer(Network、new Blobparams(network.getBatch()、10,1,1)); network.addlayer(sflayer); }上記のコードに示すように、各レイヤーにはネットワークが必要です。これはネットワークのインスタンスです。ネットワークは、グローバル管理者であり、リソースのディスパッチャーです。ネットワークを参照すると、各レイヤーの出力データ、出力エラーなどを簡単に取得できます。さらに、各レイヤーには、現在のレイヤーの出力データブロックのサイズを指定するパラメーターが必要です。これにより、出力に必要なデータの量が特定のレイヤーに表示されます。たとえば、ニューラルネットワークの最後の層はSoftMaxlayerで、その数は出力する必要があります。この数値は、番号7などの長さ10のベクトルで表されるため、ソフトマックスレイヤーは8番目の要素の値を1に、他の要素の値を0に出力する必要があります。畳み込み層では、畳み込みカーネルと呼ばれます。畳み込み層の各方向のストライドは1であり、これはまだ改善の余地があります。プーリングレイヤーの場合、プーリングコアのパラメーターを渡すことに加えて、必要な水平および垂直のステップを通過する必要もあります。
トレーニングとテスト
ニューラルネットワークを構築した後、各レイヤーのデータパラメーターに基づいて出力データブロックとエラーデータブロックを作成するNetwork.prepare()メソッドを呼び出す必要があります。したがって、この方法への呼び出しが必要です。
public void Train(list <digitimage> imglist、int epoes){system.out.println( "Begin Train"); int batch = network.getBatch(); double loclalr = optimizer.getlr(); for(int e = 0; e <epoes; e ++){collections.shuffle(imglist); for(int i = 0; i <imglist.size() - batch; i+= batch){list <blob> inputAndLabel = buildblobbyimagelist(imglist、i、batch、1,28,28); double lossvalue = network.train(inputandlabel.get(0)、inputandlabel.get(1)); if(i> batch && i/batch%50 == 0){system.out.print( "epoe:"+e+"lossvalue:"+lossValue+""+"lr:"+optimizer.getlr()+""); Testinner(inputandlabel.get(0)、inputandlabel.get(1)); }} if(loclalr> 0.001){loclalr*= 0.8; optimizer.setlr(loclalr); }}} public void test(list <digitimage> imglist){system.out.println( "begin test"); int batch = network.getBatch(); int recordcount = 0; int i = 0; for(i = 0; i <imglist.size() - batch; i+= batch){list <blob> inputAndLabel = buildblobbyimageList(imglist、i、batch、1,28,28); blob output = network.predict(inputandlabel.get(0)); int [] caloutLabels = getBatchOutputLabel(output.getData()); int [] realLabels = getBatchOutputLabel(inputAndLabel.get(1).getData()); for(int kk = 0; kk <caloutlabels.length; kk ++){if(caloutlabels [kk] == reallabels [kk]){recordcount ++; }}} double surcocy = recordcount/(1.0*i+batch); System.out.println( "テスト精度は"+精度+"recordcount"+recordcount); }上記のように、ネットワークのトレインに電話してトレーニングでき、ネットワークの予測方法を呼び出すことでテストできます。
パラメーターを保存およびロードします
public void savemodel(string name){network.savemodel(name); } public void loadmodel(string name){network = new Network(); network.loadModel(name); network.prepare(); }ネットワークのSaveModelとLoadModelを呼び出すことは、それぞれパラメーターを保存およびロードすることができます。ファイル名を渡すだけです。保存されたパラメーターを介してニューラルネットワークを作成するときは、最初に新しいAネットワークを新しいA Networkを新しい[ネットワークのロードモデルを呼び出して保存されたパラメーターをロードする必要があります。その後、各レイヤーの出力データブロックとエラーデータブロックを作成する準備方法を呼び出すことを忘れないでください。
現在の完了ステータスと将来の計画
現在、実装されているレイヤーには、完全な接続、畳み込み、最大プーリング層、平均プーリング層、ソフトマックス層が含まれます。実装されたアクティベーション関数は、Sigmod、Tanh、Reluです。
実装された損失関数は、クロスエントロピー、log-likelihoodです。実装された最適化は次のとおりです。SGD。パラメーターはすでに保存およびロードできます。次に、ドロップアウト層が追加され、CIFAR-10の例が追加されます。
さらに、初心者による参照のためにCUPCNNを書くプロセス中に、私の考えや質問をレビューするためにいくつかの記事を書きます。迂回してください。興味のある人は注目を集め続けることができます。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。