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リアルタイムステルス技術、ステルスの超能力を手に入れるために快手へ

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

機械学習によって IoT アプリケーションのセキュリティはどのように向上するのでしょうか?

モノのインターネットの世界は手の届くところにありますが、それには良い面と悪い面の両方が伴います。機械...

6144個のTPU、5400億個のパラメータ、バグ修正、ジョーク解釈など、GoogleはPathwaysを使用して大規模なモデルをトレーニングしました

Google の次世代アーキテクチャ Pathways は、大規模なモデルのトレーニングに使用されて...

キング・オブ・グローリーのプレイからサッカーのプレイまで、テンセントのAIが再び進化

テンセントは12月30日、同社の人工知能チームが第1回Google Football Kaggleコ...

岐路に立つ交通:自動運転の未来はどうなるのか?

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

2つのセッションが終了しました!自動運転に関する15の提案

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

人工知能は緊急に「倫理的転換」を必要としている

現在の人工知能の発展は、主にディープラーニングに代表される機械学習技術の恩恵を受けています。ディープ...

IBMは5億行のコードデータセットをオープンソース化したが、最も人気のあるプログラミング言語はPythonではない

Google サービスには 20 億行のコードが含まれており、自動車システムには 1 億行のコードが...

90 年代以降の技術オタクと彼の代替検索エンジン Magi

最近、Magiという検索エンジンが注目を集めています。この検索エンジンは、私たちが持っている一般的な...

自動運転車を壁に衝突させ、他人の顔を使って代金を支払う:最新のAIの抜け穴が私たちの目を覚まさせる

かつて専門家が懸念していたAIアルゴリズムの抜け穴は起こり得るし、予想もしなかった抜け穴さえも起こり...

人工知能は第五の変革をもたらします。あなたはこのチャンスをつかむことができますか?

人工知能の急速な発展は、新しい小売業者に力を与え、小売業界の「人、商品、場所」の要素を効果的に再構築...

AIRankingsが世界の大学AIランキングを発表

今年も大学入試シーズンがやってきました。私が大学受験をしていた頃には、この言葉が流行っていたのを覚え...

AIテキスト翻訳システムの品質が44%向上し、500億以上のパラメータを使用して200の言語を翻訳

Meta Platforms は本日、Meta が社内開発した、200 言語のテキストを翻訳できる人...

馬化騰と李延紅の対談:基礎技術は巨大産業の変革の基盤

11月8日、烏鎮で開催された世界インターネット大会で、馬化騰氏と李ロビン氏が首脳対談を行った。2人の...

AI を使って体内最大の臓器を管理すれば、本当にもっと美しくなれるのでしょうか?

皮膚は人体の中で最も大きな器官であるため、写真を撮るときには必ず皮膚の再生というプロセスを経る必要が...