Keras または TensorFlow?プログラマーはディープラーニングフレームワークをどのように選択すべきでしょうか?

Keras または TensorFlow?プログラマーはディープラーニングフレームワークをどのように選択すべきでしょうか?

ディープラーニングは急速に発展していますが、過去 2 年間に登場した多くのディープラーニング フレームワークは初心者を困惑させています。 Google の TensorFlow、Amazon の MXNet、Facebook がサポートする PyTorch、Theano、Caffe、CNTK、Chainer、Baidu の PaddlePaddle、DSSTNE、DyNet、BigDL、Neon など。

その中でも、TensorFlow はディープラーニングの本番環境向けの最も有名なフレームワークであり、非常に強力なエコシステムサポートを備えています。ただし、他のフレームワークと比較すると、TensorFlow には速度が遅い、使いにくいなどの欠点もあります。 TensorFlow 上に構築された Keras は、シンプルで使いやすい API インターフェースを提供するため、初心者に最適です。

2017 年 1 月、Keras の作者である Google AI 研究者 Francois Chollet からのメッセージの発表により、Keras は TensorFlow コアに追加された最初の高レベル フレームワークとなり、それ以来 Keras は Tensorflow のデフォルト API になりました。

「それで、私のプロジェクトには Keras と TensorFlow のどちらを使うべきでしょうか? Keras と TensorFlow のどちらが良いでしょうか? TensorFlow と Keras のどちらを勉強するべきでしょうか?」

『Deep Learning for Computer Vision with Python』の著者である Adrian Rosebrock 氏は、ディープラーニングの研究者、実践者、エンジニアとの会話の中で、彼らの困惑を耳にしました。

Keras と TensorFlow に関しては、開発者は Keras が実際に完全に採用され、TensorFlow に統合されたときに何ができるかにもっと重点を置くべきだと Rosebrock 氏は考えています。

  1. Keras の使いやすいインターフェースを使用してモデルを定義します。
  2. TensorFlow の特定の機能が必要な場合、または Keras ではサポートされていないが TensorFlow ではサポートされるカスタム機能を実装する必要がある場合は、TensorFlow を呼び出します。

彼のアドバイスは、まず Keras を使用し、次に TensorFlow をダウンロードして、必要な特定の機能を取得することです。この記事では、Rosebrock が、Keras を使用してニューラル ネットワークをトレーニングする方法と、TensorFlow ライブラリに直接組み込まれた Keras + TensorFlow 統合 (カスタム関数付き) を使用してモデルをトレーニングする方法を示します。

テキストは以下から始まります:

▌KerasとTensorFlowを比較しても意味がない

過去数年間、ディープラーニングの分野で働く研究者、開発者、エンジニアは、次のような選択を迫られることがよくありました。

  1. 使いやすいがカスタマイズが難しい Keras ライブラリを選択すべきでしょうか?
  2. それとも、より難しい TensorFlow API を使用して、大量のコードを記述するべきでしょうか? (言うまでもなく、API の使いやすさはそれほど高くありません。)

「Keras と TensorFlow のどちらを使うべきか」という疑問に悩んでいる場合は、一歩引いて考えてみると、どちらも使用できるため、これは実際には間違った質問であることに気づくでしょう。

標準の keras モジュールと TensorFlow に基づく tf.keras モジュールを使用して、畳み込みニューラル ネットワーク (CNN) を実装します。次に、サンプル データセットでこれらの CNN をトレーニングし、結果を調べると、Keras と TensorFlow が調和して動作できることがわかります。

TensorFlow は 1 年以上前に Keras が TensorFlow の正式リリースに組み込まれることを発表しましたが、多くのディープラーニング開発者が tf.keras サブモジュールを通じて Keras を呼び出すことができることにまだ気付いていないことに驚いています。さらに重要なのは、Keras と TensorFlow がシームレスに接続されているため、TensorFlow ソース コードを Keras モデルに直接書き込むことができることです。

Keras と TensorFlow を組み合わせると、双方にメリットがあります。

  1. Keras が提供するシンプルなネイティブ API を使用して、独自のモデルを作成できます。
  2. Keras の API は scikit-learn の API に似ており、どちらも機械学習用の高品質な API と言えます。
  3. Keras の API はモジュール式で、Python ベースであり、非常に使いやすいです。
  4. カスタム レイヤーまたはより複雑な損失関数を実装する必要がある場合は、TensorFlow にアクセスして、コードを Keras モデルと自動的に組み合わせることができます。

▌Kerasはtf.kerasモジュールを介してTensorFlowに組み込まれています

ご覧のとおり、Python シェルで TensorFlow (tf) をインポートして tf.keras を呼び出すことで、Keras が実際には TensorFlow の一部であることを示しました。

tf.keras の Keras を使用すると、標準の Keras パッケージを使用して、次のような単純なフィードフォワード ニューラル ネットワークを取得できます。

次に、TensorFlow の一部である tf.keras サブモジュールに基づいて同じネットワークを実装します。

しかし、これは tf.keras を使用する必要があることを意味しますか?では、標準の Keras パッケージの使用をあきらめるべきでしょうか?もちろん違います!

Keras は TensorFlow とは独立して動作するライブラリであるため、将来的にこの 2 つが分離される可能性はまだありますが、Google が Keras と TensorFlow の両方を公式にサポートしていることがわかっているため、分離される可能性は極めて低いと思われます。

しかし、ポイントは次の通りです。

Keras のみでプログラミングしたい場合は、そのまま続けてください。しかし、TensorFlow ユーザーの場合は、次の理由から Keras API を検討する必要があります

  1. TensorFlowをベースにしている
  2. 使いやすい
  3. 純粋な TensorFlow で特定のパフォーマンスや機能を実現する必要がある場合は、Keras で直接使用できます。

▌データセットの例

[[246049]]

CIFAR-10 データセットには 10 個のクラスがあり、この記事ではこのデータセットを使用してアイデアを説明します。

簡単にするために、CIFAR-10 データセットで 2 つの個別の畳み込みニューラル ネットワーク (CNN) を次のようにトレーニングします。

方法 1: TensorFlow をバックエンドとして Keras モデルを使用する

方法2: tf.kerasのKerasサブモジュールを使用する

途中で、Keras モデルにカスタム TensorFlow コードを記述する方法も紹介します。

CIFAR-10 データセットは、10 個の個別のクラス、50,000 枚のトレーニング画像、および 10,000 枚のテスト画像で構成されています。

プロジェクト構造

ターミナルで tree コマンドを使用してプロジェクトの構造を表示できます。

pyimagesearch モジュールは、Web エントリに関連付けられたダウンロードに含まれています。 pip 経由ではインストールできませんが、「ダウンロード」後の結果に含まれます。まず、このモジュール内の 2 つの重要な Python ファイルを確認しましょう。

  • minivggnetkeras.py: このファイルは、VGGNet に基づくディープラーニング モデルである MiniVGGNet ネットワークを実装するための Keras に基づいています。
  • minivggnettf.py: このファイルは、TensorFlow + Keras (tf.keras など) に基づいて実装された MiniVGGNet ネットワークです。

このプロジェクトのルート ディレクトリには、次の 2 つの Python ファイルが含まれています。

  • train_network_keras.py: Keras で実装されたトレーニング スクリプト。
  • train_network_tf.py: TensorFlow + Keras 実装に必要なトレーニング スクリプトは基本的に前のものと同じですが、それでも説明し、違いをマークします。

各スクリプトは独自のトレーニング精度と損失曲線を生成します。

  • プロット_keras.png
  • プロット_tf.png

次に、KerasとTensorFlow + Keras(tf.keras)をベースに実装されたMiniVGGNetネットワークとそのトレーニングプロセスを紹介します。

▌Kerasでニューラルネットワークをトレーニングする

Keras で実装された miniVGGNet 畳み込みニューラル ネットワーク構造

ネットワークをトレーニングする最初のステップは、Keras でネットワークのアーキテクチャを構築することです。

Keras を使用したニューラル ネットワークのトレーニングの基本をすでに理解している場合は、始めましょう (これに慣れていない場合は、関連する入門記事を参照してください)。

関連リンク: https://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python/

まず、minivggnetkeras.py ファイルを開き、次のコードを挿入します。

モデルの構築は、一連の必要な Keras ライブラリをインポートすることから始まります。

次に、MiniVGGNetKeras クラスを定義します。

[[246050]]

12 行目に build メソッドを定義し、inputShape と input パラメータを定義します。 順序はチャネルが最後であると想定しているため、inputShape パラメータの最後の値は深度値に対応している必要があります。

畳み込みニューラル ネットワークの主な構造の定義を始めましょう。

上記のコードから、畳み込み演算後の空間次元を削減するために、各プーリングの前に一連の畳み込み (conv2D)、ReLU 活性化関数、およびバッチ正規化レイヤーを積み重ねていることがわかります。さらに、モデルの過剰適合を防ぐために、ドロップアウト技術も使用します。

レイヤーの種類と関連する用語の知識については、以前の Keras チュートリアル https://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python/ を参照してください。詳細を学習したい場合は、「Deep Learning for Computer Vision with Python」という本 https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/ をお勧めします。

次に、ネットワーク構造に完全接続層 (FC) を追加します。コードは次のとおりです。

ネットワークに FC レイヤーと Softmax 分類器を追加します。次に、ニューラル ネットワーク モデルを定義し、呼び出し関数に返します。

これで、Keras で CNN モデルの定義を実装できました。次に、モデルをトレーニングするためのプログラム スクリプトを作成します。

train_network_keras.py ファイルを開き、次のコードを挿入します。

まず、コードの 2 行目から 13 行目で、モデルのトレーニングに必要なパッケージをインポートします。

以下の点に注意してください。

  • 3 行目では、トレーニング プロットを画像ファイルとして保存できるように、Matplotlib のバックエンドを Agg に設定します。
  • 6 行目では、MiniVGGNetKeras クラスをインポートします。
  • ワンホットエンコーディングには scikit-learn ライブラリの LabelBinarizer メソッドを使用し、その classified_report メソッドを使用して分類精度の統計を出力します (それぞれ 7 行目と 8 行目に相当)。
  • 10行目でトレーニングに必要なデータベースをインポートします。
カスタム データセットの使用方法については、https://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python/https://www.pyimagesearch.com/2018/04/16/keras-and-convolutional-neural-networks-cnns/ を参照してください。

さらに、16 行目から 19 行目でコマンドライン引数 (--plot パスを出力) を解析します。

次に、CIFAR-10 データセットをロードし、ラベルをエンコードします。コードは次のとおりです。

24 行目と 25 行目では、それぞれトレーニングとテストに必要なデータを読み込んで抽出し、26 行目と 27 行目でデータに対して浮動小数点 + スケール変換を実行します。

30 行目から 36 行目では、ラベルをエンコードし、実際の labelNames を初期化します。

モデルの定義とデータセットのインポート作業が完了しました。これでモデルのトレーニングを開始できます。コードは次のとおりです。

40 行目から 46 行目では、トレーニング プロセスとモデル最適化方法に必要ないくつかのパラメーターを設定します。

次に、47 行目から 50 行目で、MiniVGGNetKeras.build メソッドを使用してモデルを初期化し、コンパイルします。

最後に、モデルのトレーニング手順が 54 行目と 55 行目で開始されます。

次に、ネットワーク モデルを評価し、結果のグラフを生成します。

ここでは、テスト データでモデルを評価し、classification_report を生成します。最後に、評価結果を統合し、結果グラフをエクスポートします。

通常、ここではモデルをシリアル化してエクスポートし、画像やビデオの処理スクリプトで使用できるようにしますが、このチュートリアルではこの部分については説明しません。

上記のスクリプトを実行する場合は、この記事のソースコードを必ずダウンロードしてください。

次に、ターミナルを開いて次のコマンドを実行し、Keras を使用してニューラル ネットワークを実装します。

各トレーニング エポックをコンピューターの CPU で実行するには、わずか 5 分強かかります。トレーニング結果は次のとおりです。

Keras で実装されたニューラル ネットワーク モデル。Matplotlib を使用してトレーニング プロセスの精度/損失曲線をプロットします。

上記の端末出力からわかるように、モデルは 75% の精度を達成しました。これは最先端のモデルではありませんが、ランダムな推測 (1/10) よりもはるかに優れています。

小さなニューラル ネットワークと比較すると、私たちのモデルの結果は実は非常に優れています。

さらに、出力図 6 に示すように、このモデルは過剰適合の問題を抱えていません。

▌Tensorflowとtf.kerasを使用してニューラルネットワークモデルをトレーニングする

tf.keras (TensorFlow に組み込まれたモジュール) を使用して構築された MiniVGGNet CNN アーキテクチャは、Keras を使用して直接構築したモデルと同一です。ここでは、デモンストレーションの目的で活性化関数を変更しましたが、構造の残りの部分は同じです。

上記では、Keras ライブラリを使用してシンプルな CNN モデルを実装およびトレーニングすることができました。次に、次のことを行います。

1. TensorFlowのtf.kerasモジュールを使用して同じネットワークアーキテクチャを実装する方法を学びます

2. Keras に実装されていない TensorFlow アクティベーション関数を Keras モデルに含めます。

さあ、始めましょう。

まず、minivggnettf.py ファイルを開きます。MiniVGGNet モデルの TensorFlow バージョンを実装します。コードは次のとおりです。

この .py ファイルでは、2 行目で必要な tensorflow 依存ライブラリをインポートする必要があることに注意してください。tensorflow には、直接呼び出すことができるすべての Keras 関数を含む tf.keras サブモジュールが付属しています。

モデル定義では、コード内で黄色で強調表示されているLambdaレイヤーを使用します。これを使用して、カスタム活性化関数CRELU(連結ReLU)を挿入できます。

活性化関数 CRELU は、Shang らによる論文「畳み込みニューラル ネットワークの理解と改善」で提案されました。

CRELU 活性化関数は Keras に対応する実装がありませんが、TensorFlow では実装できます。 TensorFlow の tf.keras モジュールの 1 行のコードを使用して、Keras モデルに CRELU 関数を追加できます。

また、CRELU 関数には、正の ReLU と負の ReLU という 2 つの出力があり、これらが接続されていることにも注意することが重要です。 xが正の値の場合、CRELU関数の戻り値は[x, 0]です。xが負の値の場合、CRELU関数の戻り値は[0, x]です。この機能の詳細な紹介については、Shang らによる論文を参照してください。

次に、TensorFlow + Keras を使用して、MiniVGGNetTF モデルをトレーニングするためのプログラムを定義します。 train_network_tf.py を開き、次のコードを挿入します。

2 行目から 12 行目では、トレーニング プロセスに必要な依存関係をインポートします。以前の Keras バージョンのトレーニング スクリプトと比較した唯一の変更点は、Keras を使用する代わりに、MiniVGGNetTF クラスと tensorflow を tf としてインポートしたことです。 15 行目から 18 行目は、コマンド ライン引数の解析部分です。

前回と同様に、モデルのトレーニングに必要なデータを 23 行目にロードします。スクリプトの残りの部分は、トレーニング セット データとテスト セット データを抽出して分離し、ラベルをエンコードするという、以前の Keras バージョンのトレーニング プロセスと同じです。

次に、モデルのトレーニングを始めましょう。コードは次のとおりです。

39 行目から 54 行目は、黄色で強調表示されている Keras バージョンのトレーニング プロセスと異なり、残りは同じです。

58 行目から 73 行目では、テスト データでモデルを評価し、最終結果をプロットします。

ご覧のとおり、使用する方法 (tf.keras を使用) を変更しただけで、ほぼ同じトレーニング プロセスを実装しました。

次に、ターミナルを開き、次のコマンドを実行して、tensorflow + tf.keras を使用してニューラル ネットワーク モデルをトレーニングします。

トレーニングが完了すると、上記のようなトレーニング結果のグラフが得られます。

Tensorflow + tf.keras で実装されたニューラル ネットワーク モデル。Matplotlib を使用してトレーニング プロセスの精度/損失曲線をプロットします。

元の RELU 活性化関数を CRELU に置き換えて、76% の精度が得られたことがわかります。ただし、精度が 1% 向上したのは、ネットワーク内の重みがランダムに初期化されたためである可能性があり、CRELU 活性化関数が実際にモデルの精度を向上できるかどうかをさらに証明するには、クロス検証実験が必要です。もちろん、このセクションの焦点は生の精度ではありません。

逆に、もっと注意を払う必要があるのは、Keras モデル内で標準の Keras 活性化関数を TensorFlow の活性化関数に置き換える方法です。

さらに、カスタムアクティベーション関数、損失/コスト関数、またはレイヤーを使用して、上記と同じ操作を実行することもできます。

結論

本日の記事では、主に Keras と TensorFlow に関する以下の問題について説明しました。

  • プロジェクトには Keras と TensorFlow のどちらを使用すればよいでしょうか?
  • TensorFlow は Keras よりも優れていますか?
  • TensorFlow または Keras の学習に時間を費やすべきでしょうか?

最終的に、Keras と TensorFlow のどちらを選択するかを決めることは、ますます無関係な問題になっていることがわかりました。 Keras ライブラリは、tf.keras モジュールを通じて TensorFlow に直接統合されています。

基本的には、使いやすい Keras API を使用してモデルとトレーニング プロセスをエンコードし、純粋な TensorFlow でカスタム実装を行います。

したがって、ディープラーニングの学習を始めようとしている場合、または次のプロジェクトで Keras と TensorFlow のどちらを使用するかで悩んでいる場合、または次のプロジェクトで Keras と TensorFlow のどちらを使用するかを検討している場合、今こそ答えと動機を見つけるときです。私からのアドバイスは非常にシンプルです。

  1. さっそく始めましょう!
  2. Python プロジェクトで、import keras または import tensorflow as tf (tf.keras にアクセスできるようにする) と入力して、作業を開始します。
  3. TensorFlow はモデルとトレーニング プロセスに直接統合できるため、機能や使いやすさを比較する必要はありません。プロジェクトで TensorFlow または Keras を直接使用できます。

▌読者の質問

この点に関して、一部の読者は鋭い疑問を呈した。

上記と私の理解に基づくと、多くの開発者は依然として Keras と TensorFlow が何であるかという疑問に悩んでいます。私はこのことについてあまり知らないかもしれませんが、それでもいくつかの明確な質問をしたいと思います。まず、2 つのうちの 1 つをコンピューティング エンジン、もう 1 つをツールキットと見なすのは正しいでしょうか。もしそうなら、TensorFlow はツールキットで、Keras は計算バックエンドなのでしょうか?次に、TensorFlow と Caffe の統合についても触れましたが、Caffe は廃止され、代わりに Keras が採用されました。なぜそうなるのか理由を教えていただけますか? Caffe はもう使えないのでしょうか、それとも Keras の方が機能が豊富だからでしょうか?

これに対してエイドリアン・ローズブロック氏は次のように答えた。

はい、Keras 自体は、実際の計算を実行するために TensorFlow、Theano、CNTK などのバックエンドに依存しています。 Caffe はまだ存在しますが、その他の機能は Caffe2 に分割されています。 TensorFlow は Caffe の一部ではありませんでした。特に研究者の間では、今でも Caffe が使われています。しかし、実践者、特に Python 実践者は、TensorFlow、Keras、PyTorch、mxnet などのプログラミングに適したライブラリを好みます。

これに関して何か質問や意見はありますか?メッセージを残すことを歓迎します。

<<:  上場企業上位500社を調査し、人工知能の7つの主要トレンドをまとめました。

>>:  アマゾン、AIが女性の求職者に低い評価を与えたため研究チームを解散に追い込まれる

ブログ    

推薦する

AI導入によるエッジインテリジェンスの強化

エッジに AI を導入すると、強力なリアルタイム分析と処理を実現できる可能性があります。使用例には、...

自動運転の浮き沈み:バブルが消えた後

[51CTO.comよりオリジナル記事] 静かな2019年を経て、自動運転業界は新年を迎え、徐々に活...

...

...

Facebook のインタラクティブ ニューラル ネットワーク可視化システム ActiVis がニューラル ネットワークの「ブラック ボックス」を公開

これまで、多くのメディアがニューラルネットワークの「ブラックボックス」問題について熱く議論してきまし...

AI 主導のビジネス変革を通じてデジタル成熟を達成するにはどうすればよいでしょうか?

[[388979]]デジタル時代においては、情報の流れがあらゆるものの中心となります。すべてが感知...

ニューラルネットワークの問題を解決するための新しいアイデア: OpenAI は線形ネットワークを使用して非線形問題を計算します

[[205570]]深層線形ネットワーク (浮動小数点演算を使用して実装) は実際には線形ではなく、...

AI投資から利益を得るための3つの鍵

人工知能 (AI) の専門家や機械学習 (ML) サービスの利用可能性が高まるにつれて、AI は多く...

多くの場所でAI顔認識の使用が制限されており、監視は技術開発のペースに追いついています

最近、南京、江蘇省、天津などではAI顔認識技術の使用を禁止し始めている。 11月末、南京市のある男性...

Baiduカスタマイズ画像オープンプラットフォームのトレーニングと評価

背景Baiduは昨年11月にカスタマイズされた画像トレーニングサービスを開始しました(https:/...

...

Google 検索は年間 890 回以上改善され、そのコア アルゴリズムは毎日変更されます。

8月21日、Googleの検索事業責任者アミット・シンガル氏はGoogle+に記事を掲載し、過去1...

不動産会社のデジタル変革は差し迫っています。これらの AI イノベーションは試してみる価値があるかもしれません。

不動産会社のデジタル変革は差し迫っています。試してみるべき革新的な方法をいくつかご紹介します。今日の...

...