DJL [ディープラーニング]を正しく開く方法

DJL [ディープラーニング]を正しく開く方法

[[350239]]

この記事はWeChatの公開アカウント「小明野菜市場」から転載したもので、著者は小明野菜市場です。記事を転載する場合は小明野菜市場の公式アカウントまでご連絡ください。

序文

Java は長い間、豊富なフレームワークと完全なエコシステムを備えた非常に人気のあるエンタープライズ プログラミング言語でした。 Java には巨大な開発者コミュニティがあります。ディープラーニング アプリケーションは進歩と進化を続けていますが、Java 向けの関連するディープラーニング フレームワークは非常に不足しています。現在、主要なモデルは Python でコンパイルおよびトレーニングされています。Java 開発者がディープラーニングを学習したい場合は、新しい言語の洗礼を受ける必要があります。 Java 開発者のディープラーニングのコストを削減するために、AWS は、Java 開発者向けにカスタマイズされたオープンソースのディープラーニングフレームワークである Deep Java Library (DJL) を構築しました。これは、開発者が主流のディープラーニングフレームワークに接続するためのインターフェイスを提供します。

ディープラーニングとは

始める前に、まず機械学習とディープラーニングの基本的な概念を理解してください。機械学習は、統計的知識を使用してコンピューターにデータを入力し、特定のターゲットタスクをトレーニングして完了させるプロセスです。この帰納的学習方法により、コンピューターは特定の機能を学習し、写真内のオブジェクトの識別など、一連の複雑なタスクを実行できます。ディープラーニングは、人間の脳がどのように学習し目標を達成するかを研究して得られた計算ロジックのセットである人工ニューラルネットワークの開発に重点を置いた機械学習の分野です。人間の脳神経間の情報伝達プロセスをシミュレートすることで、さまざまな複雑なタスクを実現できます。ディープラーニングの深さは、人工ニューラルネットワークの多くの層のコンパイルと構築から生まれ、より深いレベルでデータ情報を伝達できます。

MNIST手書き数字認識のトレーニング

プロジェクト構成

gradle 設定を使用して依存パッケージを導入し、DJL の api パッケージと basicdataset パッケージを使用してニューラルネットワークとデータセットを構築します。この場合、ディープラーニングエンジンとして MXNet を使用するため、mxnet-engine と mxnet-native-auto パッケージが導入されます。依存関係は次のとおりです。

  1. プラグイン {
  2. id 'java'  
  3. }
  4. リポジトリ {
  5. jcenter()
  6. }
  7. 依存関係 {
  8. 実装プラットフォーム( "ai.djl:bom:0.8.0" )
  9. 実装"ai.djl:api"  
  10. 実装"ai.djl:basicdataset"  
  11. // MXネット
  12. ランタイムのみ"ai.djl.mxnet:mxnet-engine"  
  13. ランタイムのみ"ai.djl.mxnet:mxnet-native-auto"  
  14. }

NDArry と NDManager

NDArray は、データ構造と数学演算を格納するための DJL の基本構造です。NDArray は固定長の多次元配列を表します。NDArray の使用方法は、Python の numpy.ndarry に似ています。 NDManager は NDAry のマネージャーであり、NDAry の生成とリサイクルを管理する役割を担い、Java メモリの最適化に役立ちます。各 NDAry は NDManager によって作成され、NDManager が閉じられると、それらも一緒に閉じられます。

モデル

DJL では、トレーニングと推論の両方が Model クラスから構築されます。ここでは、主にトレーニング プロセスの構築方法に焦点を当てます。次に、Model の新しいターゲットを作成します。Model も AutoClosable 構造を継承するため、try ブロックで実装されます。

  1. (モデルモデル = Model.newInstance()) を試してください {
  2. ...
  3. // 本体トレーニングコード
  4. ...
  5. }

データを準備する

MNIST データベースには、通常、画像処理システムのトレーニングに使用される手書き数字の画像が多数含まれています。DJL は、基本データセット データに MNIST データを収集しました。各 MNIST 画像のサイズは 28 * 28 です。独自のデータセットがある場合は、同じ方法でデータを収集することもできます。

データセットのインポートチュートリアル http://docs.djl.ai/docs/development/how_to_use_dataset.html#how-to-create-your-own-dataset

  1. int batchSize = 32; // バッチサイズ
  2. Mnist トレーニングデータセット = Mnist.builder()
  3. .optUsage(Usage.TRAIN) // トレーニング セット
  4. .setSampling(バッチサイズ、 true )
  5. 。建てる();
  6. Mnist 検証データセット = Mnist.builder()
  7. .optUsage(Usage.TEST) // 検証セット
  8. .setSampling(バッチサイズ、 true )
  9. 。建てる();

このコードは、それぞれトレーニング セットと検証セットを作成します。また、トレーニングを向上させるために、データ セットをランダムに配置します。これらの構成に加えて、画像のサイズや正規化の設定など、画像に関するその他の設定を行うこともできます。

モデルを作りブロックを作成する

データ セットの準備ができたら、ニューラル ネットワークを構築できます。DJL では、ニューラル ネットワークはブロック コード ブロックで構成されます。ブロックは、複数のニューラル ネットワーク特性を持つ構造です。これらは、動作中のニューラル ネットワークの一部、または完全なニューラル ネットワークを表すことができます。その後、ブロックは順次または並列に実行できます。同時に、ブロック自体にもパラメータとサブブロックを含めることができます。このネストされた構造は、保守可能なニューラル ネットワークを迅速に更新するのに役立ちます。トレーニング プロセス中、各ブロックに添付されたパラメータはリアルタイムで更新され、そのサブブロックも同時に更新されます。これらのブロックを構築する場合、最も簡単な方法は、ブロックを 1 つずつネストし、用意されている DJL ブロック タイプを直接使用して、さまざまなニューラル ネットワークをすばやく作成することです。

ブロックバリアント

いくつかの基本的なニューラル ネットワークの動作モードに応じて、いくつかのブロック バリアントを提供します。

  1. SequentialBlock は、次のブロックを出力して実行を継続するために使用されます。
  2. Parallelblock は、各サブブロックに入力を並列に供給し、特定のマージ式に従って出力結果をマージするために使用されます。
  3. Lambdablock は、ユーザーがすばやく操作を実行できるようにするブロックです。パラメーターがないため、トレーニング プロセス中に更新される部分はありません。

多層パーセプトロンMLPニューラルネットワークの構築

シンプルな多層パーセプトロンニューラルネットワークを構築します。多層パーセプトロンは、完全に接続された層がいくつかあるシンプルな順方向ニューラルネットワークです。このネットワークを構築するには、sequentialblockを直接使用できます。

  1. int input = 28 * 28; // 入力レイヤーのサイズ
  2. 整数  output = 10; // 出力レイヤーのサイズ
  3. int [] hidden = new int [] {128, 64}; // 隠しレイヤーのサイズ
  4. シーケンシャルブロック シーケンシャルブロック = 新しいシーケンシャルブロック();
  5. sequentialBlock.add (Blocks.batchFlattenBlock(入力));
  6. ( int隠しサイズ: 隠し) {
  7. //完全に接続された層
  8. sequentialBlock.add (Linear.builder().setUnits(hiddenSize).build());
  9. // 活性化関数
  10. sequentialBlock.add (アクティベーション);
  11. }
  12. sequentialBlock. add (Linear.builder().setUnits( output ).build());

提供されているMLPブロックを直接使用することができます

  1. ブロックブロック = 新しいMlp(
  2. Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH、
  3. Mnist.NUM_CLASSES、
  4. 新しいint [] {128, 64});

電車

以下の手順に従ってください。

トレーニング プロセスの初期化を完了します。各ブロックのパラメータを初期化します。各パラメータを初期化する関数は、set 初期化子によって決定されます。順方向伝播: このステップでは、入力データをニューラル ネットワークの層ごとに渡し、出力データを生成します。損失の計算: 特定の損失関数損失に従って、出力とラベル付けされた結果間の偏差を計算します。バックプロパゲーション: このステップでは、損失の逆導関数を使用して各パラメータの勾配が計算されます。重みを更新すると、選択したオプティマイザーに従ってブロック上の各パラメータの値が更新されます。

合理化

DJL は、Trainer 構造を使用してプロセス全体を簡素化します。開発者は、Trainer を作成し、対応する初期化子、損失、および最適化子を指定するだけで済みます。これらのパラメータは、TrainingConfig によって設定されます。パラメータ設定を見てみましょう。 TrainingListener は、トレーニング プロセス中に設定されるリスナーであり、各ステージのトレーニング結果に関するリアルタイムのフィードバックを提供できます。これらの結果は、トレーニング プロセスを記録したり、ニューラル ネットワークのトレーニング中に発生した問題をデバッグするために使用できます。ユーザーは独自のTrainingListenerをカスタマイズしてトレーニングプロセスを監視できます。

  1. DefaultTrainingConfig 設定 = 新しい DefaultTrainingConfig(Loss.softmaxCrossEntropyLoss())
  2. .addEvaluator(新しい精度())
  3. トレーニング リスナーを追加します。
  4. (トレーナーtrainer = model.newTrainer(config))を試してください{
  5. // トレーニングコード
  6. }

トレーニングが生成されたら、入力シェイプを定義し、トレーニング用のgit関数を呼び出すと、結果がローカルディレクトリに保存されます。

  1. /*
  2. * MNIST には 28x28 のグレースケール画像が含まれており、28 * 28 NDArray としてインポートされます。
  3. * 最初の次元はバッチ サイズです。ここでは初期化のためにバッチ サイズを 1 に設定します。
  4. */
  5. シェイプ inputShape = new Shape(1, Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH);
  6. numEpochの値は 5 です。
  7. 文字列 outputDir = "/build/model" ;
  8.  
  9. // 入力でトレーナーを初期化する
  10. トレーナーを初期化します(inputShape);
  11.  
  12. TrainingUtils.fit(トレーナー、numEpoch、トレーニングセット、validateSet、出力ディレクトリ、 「mlp」 );

出力結果グラフ

  1. [INFO] - libmxnet.dylib をダウンロードしています...
  2. [INFO] - トレーニング対象: cpu()。
  3. [INFO] - MXNet エンジン バージョン 1.7.0 を0.131 ミリ秒読み込みます
  4. トレーニング: 100% |████████████████████████████████████████████| 精度: 0.93、SoftmaxCrossEntropyLoss: 0.24、速度: 1235.20 項目/秒
  5. 検証中: 100% |███████████████████████████████████████████████|
  6. [INFO] - エポック 1 が終了しました。
  7. [INFO] - トレーニング: 精度: 0.93、SoftmaxCrossEntropyLoss: 0.24
  8. [INFO] - 検証: 精度: 0.95、SoftmaxCrossEntropyLoss: 0.14
  9. トレーニング: 100% |███████████████████████████████████████████| 精度: 0.97、SoftmaxCrossEntropyLoss: 0.10、速度: 2851.06 項目/秒
  10. 検証中: 100% |███████████████████████████████████████████████|
  11. [INFO ] - エポック 2 終了。NG [1 分 41 秒]
  12. [INFO] - トレーニング: 精度: 0.97、SoftmaxCrossEntropyLoss: 0.10
  13. [INFO] - 検証: 精度: 0.97、SoftmaxCrossEntropyLoss: 0.09
  14. [INFO] - 列車 P50: 12.756 ミリ秒、P90: 21.044 ミリ秒
  15. [INFO] -前方P50: 0.375 ms、P90: 0.607 ms
  16. [情報] - トレーニングメトリクス P50: 0.021 ms、P90: 0.034 ms
  17. [INFO] - 後方 P50: 0.608 ms、P90: 0.973 ms
  18. [INFO] - ステップ P50: 0.543 ms、P90: 0.869 ms
  19. [情報] - エポック P50: 35.989 秒、P90: 35.989 秒

トレーニングが完了すると、モデルを認識して使用できるようになります。

著者について

私は二級都市で生まれ、一級都市に住んでいるシャオシャオです。このエピソードはこれで終わりです。また次回お会いしましょう。

<<:  旅行を恥ずかしがる必要はありません。国内の観光地がAIを導入し、スマートな旅行の新たなシナリオを実現

>>:  業界初のAIリアルタイムステルス技術、ステルスの超能力を手に入れるために快手へ

ブログ    
ブログ    
ブログ    

推薦する

テクノロジー大手はAIの研究開発に数十億ドルを費やしているが、かつて人間に勝ったAIが売却されようとしているという自慢が疑問視されている

グーグルやフェイスブックなどのテクノロジー大手は長年にわたり、人工知能(AI)に数十億ドルを投資し、...

Python 自然言語処理 (NLP) を使用して要約を作成する方法

たくさんのレポートを読まなければならないときに、それぞれのレポートを簡単に要約したいという状況に遭遇...

WOT2018 Xian Yunsen: O2O検索にはアルゴリズムがあふれている

[51CTO.com からのオリジナル記事] 7 年間の努力と見事な変貌。 2012年以降、6年連続...

ケンブリッジ 2020 人工知能パノラマレポート、将来予測される 8 つの AI トレンド

ケンブリッジ大学の「AIパノラマレポート」2020年版がこのほど正式に発表された。ケンブリッジ大学の...

オンライン学習の次の波: 現代の学習システムにおける人工知能

[[375015]]世界的な流行により、ほぼすべての大学が授業をオンライン学習プラットフォームに移行...

顔認識技術の開発と実用的なソリューションの設計

顔認識技術は、Google、Facebook、Alibaba、Tencent、Baiduなどの国内外...

動きながら描くと、2次元の人物になります:リアルタイムインタラクティブビデオスタイル化

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

機械学習にはどのような数学的基礎が必要ですか?

[[184240]]ここ数か月間、データサイエンスの世界にチャレンジして、機械学習の技術を使って統...

毎日のアルゴリズム: バランスのとれた二分木

[[426529]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

...

スーパー暗号解読:自動運転はこうして実現される

[[336217]]多くの新製品と同様に、自動運転に対する人々の態度は、過度の信頼から過少な信頼まで...

科学的人工知能と疑似科学的人工知能を区別する方法

人工知能が進歩し続けるにつれて、研究者たちはその能力を向上させ、さまざまな分野で倫理的かつ責任を持っ...

行列分解はディープラーニングに勝る! MIT が時系列データベース tspDB をリリース: 機械学習に SQL を使用

人類が歴史から学んだ唯一の教訓は、人類は歴史から何も学べないということだ。 「しかし、機械は学習でき...

OpenAIのチップ製造計画が明らかに!独自のAIチップを開発する計画があり、買収対象を検討中

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...