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

ブログ    

推薦する

よりスマートに:人工知能とエネルギー産業の革命

人工知能は私たちの生活、仕事、遊び方に革命をもたらそうとしているが、Amazon の Alexa や...

このスタートアップは、アイドル状態のGPUを分散ネットワークに接続することで、AIモデルのトレーニングコストを90%削減できると主張している。

モンスターAPIは、採掘機器などのGPUコンピューティングパワーを使用してAIモデルをトレーニングし...

機械学習実践体験: データプラットフォームの設計と構築

近年人気の技術である機械学習は、数多くの「人工知能」製品でよく知られているだけでなく、従来のインター...

これを携帯電話の代わりにしたいですか?ネットで人気急上昇のAIハードウェアが衝撃を受ける:Google Glass + ポケベル

たったこれだけで、携帯電話を交換したいですか?最近話題になっている新しいAIデバイス「AI Pin」...

AIとブロックチェーン:この2つの人気技術の衝突はどのような火花を散らすのでしょうか?

編集者注: ブロックチェーンと AI は、今日最もホットな 2 つの技術方向であると言えます。一般の...

ダンジョンズ&ドラゴンズ: ビッグモデルへの道 テキストゲーム

著者 | 崔昊レビュー | Chonglouまとめこの記事の著者は、海外のブロガーに触発され、大規模...

GPU の在庫は 600,000 に達します!ザッカーバーグ氏、新たな目標を確認:汎用人工知能の創出

1 月 19 日、テクノロジー業界が超人的、神レベルの知能を達成する道を歩んでいるという確固たる信念...

人工知能、自動化、そして仕事の未来: 答えが必要な 10 の質問!

[[264418]]職場で機械が人間の労働に取って代わるようになるにつれ、私たち全員が機械から利益...

442人の著者による100ページの論文! Googleは2年かけて大規模モデル向けの新しいベンチマーク「BIG-Bench」をリリースした。

1 件の AI 論文、442 人の著者。著者の貢献のために特別な章も設けられています。 100ペー...

自動運転のためのニューラルネットワークとディープラーニング

先進運転支援システム (ADAS) は、道路の安全性と旅行体験に対するドライバーと乗客のより高い要求...

...

人工知能が人間の脳を再現できるかどうかは論争を巻き起こしている。米メディア「AIにはまだ限界がある」

[[239590]] 8月6日、自動運転車、ロボット医師、10億人を超える中国国民を対象とした社会...

一貫性のあるハッシュは難しいですか?これを読んで全て理解できました

[51CTO.com からのオリジナル記事] この記事では、コンシステント ハッシュとは何か、そして...

GPT-3オープンソースのPutianバージョン:事前学習済みモデルGPT Neoと同等の再現

[[389187]] GPT-3 はオープンソースですか? Eleuther AI のオープンソース...

量子人工知能研究における課題と機会

量子コンピューティングと人工知能の融合により、大きな期待と可能性を秘めた研究の最前線である量子人工知...