TensorFlow 2 入門ガイド。初心者必見です!

TensorFlow 2 入門ガイド。初心者必見です!

Tensorflow とは何ですか?

TensorFlow は Google が立ち上げたディープラーニング フレームワークで、2019 年に第 2 バージョンがリリースされました。 これは世界で最も有名なディープラーニング フレームワークの 1 つであり、業界の専門家や研究者によって広く使用されています。

Tensorflow v1 は Python らしさが欠けていたため、使いにくく理解しにくいものでしたが、Keras を搭載した v2 のリリースにより、Tensorflow.keras と完全に同期され、使いやすく、学習しやすく、理解しやすくなりました。

これはディープラーニングに関する記事ではないので、ディープラーニングの用語とその背後にある基本的な考え方を理解していることを前提としています。

非常に有名なデータセットである IRIS データセットを使用して、ディープラーニングの世界を探索します。

では、早速コードを見てみましょう。

データセットのインポートと理解

  1. sklearn.datasetsからload_irisをインポートする 
  2. アイリス = load_iris()

さて、このアイリスは辞書です。 次のコードを使用してキーの値を表示できます。

  1. >>> iris.keys()  
  2. dict_keys(['データ', 'ターゲット', 'フレーム', 'ターゲット名', 'DESCR', '機能名', 'ファイル名'])

つまり、データはデータ キーに、ターゲットはターゲット キーに、というようになります。 このデータセットの詳細を確認するには、iris[['DESCR'] を使用します。

ここで、ニューラル ネットワークの作成に役立つ他の重要なライブラリをインポートする必要があります。

  1. from sklearn.model_selection import train_test_split #データを分割する 
  2. numpyをnpとしてインポートする 
  3. pandasをpdとしてインポートする 
  4. matplotlib.pyplot をpltとしてインポートします。  
  5. テンソルフローをtfとしてインポートする 
  6. tensorflow.keras.layersからDense をインポートします 
  7. tensorflow.keras.modelsからSequential をインポートします

ここでは、Tensorflow から Dense と Sequential という 2 つの主要なものをインポートしました。 tensorflow.keras.layers からインポートされた Dense は、密に接続されたレイヤーの一種です。 密に接続されたレイヤーとは、前のレイヤーのすべてのノードが現在のレイヤーのすべてのノードに接続されていることを意味します。

Sequential は Keras API であり、Sequential API とも呼ばれ、ニューラル ネットワークの構築に使用します。

データをよりよく理解するために、それをデータフレームに変換することができます。 やりましょう。

  1. X = pd.DataFrame(データ = iris.data、列 = iris.feature_names)  
  2. 印刷(X.head())

  1. X.head()

ここでは、column = iris.feature_names を設定していることに注意してください。ここで、feature_names は 4 つの機能名すべてを含むキーです。

ターゲットも同様に、

  1. y = pd.DataFrame(データ = iris.target、列 = ['irisType'])

  1. y.head()

ターゲットセット内のクラスの数を確認するには、次のようにします。

  1. y.irisType.値カウント()

ここでは、それぞれラベル 0、1、2 を持つ 3 つのクラスがあることがわかります。

  1. iris.target_names #iris辞書のキー値です

これらは予測する必要があるクラス名です。

機械学習のためのデータ前処理

現在、機械学習の最初のステップはデータの前処理です。データ前処理の主な手順は次のとおりです。

  • 欠損値を入力する
  • データをトレーニングセットと検証セットに分割する
  • データを標準化する
  • カテゴリデータをワンホットベクトルに変換する

欠損値

欠損値があるかどうかを確認するには、pandas.DataFrame.info() を使用できます。

  1. X.info()

この方法では、(幸運にも)欠損値がなく、すべての機能が float64 形式であることがわかります。

トレーニングセットとテストセットに分割

データセットをトレーニング セットとテスト セットに分割するには、先ほど紹介した sklearn.model_selection の train_test_split 関数を使用できます。

  1. X_train、X_test、y_train、y_test = train_test_split(X、y、test_size=0.1)

ここで、test_size は、データセット全体の 10% をテスト データとして使用するというステートメントです。

データの標準化

一般的に、データの偏差が非常に大きい場合は、データを標準化します。偏差値を確認するには、pandas.DataFrame の var() 関数を使用して、すべての列の偏差値を確認します。

  1. X_train.var()、X_test.var()

ご覧のとおり、X_train と X_test の両方の偏差値は非常に低いため、データを標準化する必要はありません。

カテゴリデータをワンホットベクトルに変換する

出力データは、iris.target_name を使用してすでに確認した 3 つのクラスのいずれかになることがわかっているので、ターゲットをロードすると、すでに 0,1,2 の形式 (0 = クラス 1、1 = クラス 2 など) になっているという朗報があります。

この表現の問題点は、モデルが大きな数値に高い優先順位を与える可能性があり、偏った結果につながる可能性があることです。 したがって、この問題を解決するには、ワンホット表現を使用します。 人気のあるキャリアの詳細については、こちらをご覧ください。 組み込みの KERS TO_CATEGRICAL を使用することも、skLearn の OneHotEncoding を使用することもできます。 to_classical を使用します。

  1. y_train = tf.keras.utils.to_categorical(y_train)  
  2. y_test = tf.keras.utils.to_categorical(y_test)

正しく変換されたかどうかを確認するために、最初の 5 行のみをチェックします。

  1. y_train[:5,:]

はい、独自の表現に変換しました。

最後に

最後に、データを Numpy 配列に変換し直して、後でモデルで役立つ追加の関数を使用できるようにします。 これを行うには、

  1. X_train = X_train.値   
  2. X_test = X_test.値 

最初のトレーニング例の結果を見てみましょう。

  1. X_トレイン[0]

ここでは、最初のトレーニング例の4つの特徴の値を見ることができます。その形状は(4)です。

to_Category を使用する場合、ターゲット ラベルはすでに配列形式になっています。

機械学習モデル

これで、ようやくモデルを作成してトレーニングする準備が整いました。 まず簡単なモデルから始め、次に複雑なモデル構造に移り、Keras のさまざまなトリックとテクニックを紹介します。

基本モデルをコーディングしてみましょう

  1. model1 = Sequential() #シーケンシャルオブジェクト

まず、Sequential オブジェクトを作成する必要があります。 モデルを作成するには、選択に応じてさまざまなタイプのレイヤーを追加するだけです。 過剰適合を観察し、後でさまざまな正規化手法を使用して過剰適合を削減できるように、10 層の高密度レイヤー モデルを作成します。

  1. model1. add ( Dense( 64, activation = 'relu' , input_shape = X_train[0].shape))  
  2. model1. add ( 密度 (128, アクティベーション = 'relu' )  
  3. model1. add ( 密度 (128, アクティベーション = 'relu' )  
  4. model1. add ( 密度 (128, アクティベーション = 'relu' )  
  5. model1. add ( 密度 (128, アクティベーション = 'relu' )  
  6. model1. add ( 密度 (64, アクティベーション = 'relu' )  
  7. model1. add ( 密度 (64, アクティベーション = 'relu' )  
  8. model1. add ( 密度 (64, アクティベーション = 'relu' )  
  9. model1. add ( 密度 (64, アクティベーション = 'relu' )  
  10. model1. add ( 密度 (3, アクティベーション = 'softmax' )

最初のレイヤーでは、追加のパラメータ INPUT_Shape を使用していることに注意してください。 このパラメータは、最初のレイヤーのサイズを指定します。 この場合、トレーニング例の数は気にしません。 代わりに、私たちは機能の数だけを気にします。 したがって、任意のトレーニング例の形状を渡します。この場合、input_Shape 内の (4,) です。

これは多クラス分類問題なので、出力層で Softmax (活性化関数) を使用していることに注意してください。 これがバイナリ分類問題であれば、シグモイド活性化関数を使用します。

シグモイド、線形、tanh など、任意の活性化関数を渡すことができますが、実験により、このタイプのモデルでは relu が最も優れたパフォーマンスを発揮することがわかっています。

モデルの形状を定義したら、次のステップでは損失、オプティマイザー、メトリックを指定します。 これらのパラメータは、keras の Compile メソッドを使用して指定します。

  1. model1.compile(オプティマイザー= 'adam' 、損失= 'categorical_crossentropy' 、メトリック= [ 'acc' ])

ここでは、確率的勾配降下法、RMSProp などの任意の最適化ツールを使用できますが、ここでは Adam を使用します。

ここでは、マルチクラス分類の問題があるために CATEGRICAL_CROSENTROPY を使用します。バイナリ分類の問題がある場合には、BINARY_CROSENTROPY を使用します。

メトリックはモデルを評価する上で重要です。 さまざまな指標に基づいてモデルを評価できます。 分類の問題の場合、最も重要な指標は予測の正確さを示す精度です。

モデルの最後のステップは、それをトレーニング データとトレーニング ラベルに適合させることです。 コーディングしてみましょう。

  1. history = model1.fit(X_train, y_train, batch_size = 40, epochs = 800, validation_split = 0.1

fit はトレーニングのすべての履歴を含むコールバックを返します。これを使用して、プロットなどのさまざまな便利なタスクを実行できます。

履歴コールバックには history という属性があり、これは history.history としてアクセスできます。これは、すべての損失とメトリックの履歴を含む辞書です。つまり、このケースでは、Loss、Acc、val_loses、val_acc の履歴があり、それぞれの履歴には history.history.loss または history.history['val_acc'] などとしてアクセスできます。

指定されたエポック数は 800、バッチ サイズは 40、検証分割は 0.1 です。つまり、トレーニングの分析に使用する検証データが 10% になったことになります。 800 エポックを使用すると、データがオーバーフィットします。つまり、トレーニング データでは非常に良好なパフォーマンスが得られますが、テスト データでは良好なパフォーマンスが得られません。

モデルがトレーニングされると、トレーニング セットと検証セットの両方で損失と精度を確認できます。

ここでは、トレーニング セットの精度が 100%、検証セットの精度が 67% であることがわかります。これは、このようなモデルとしては優れた結果です。次に、画像を描いてみましょう。

  1. plt.plot(履歴.履歴[ 'acc' ])  
  2. plt.plot(履歴.履歴[ 'val_acc' ])  
  3. plt.xlabel( 'エポック' )  
  4. plt.ylabel( 'Acc' )  
  5. plt.legend([ 'トレーニング' , '検証' ], loc= '右上' )

トレーニング セットの精度が検証セットの精度よりもはるかに高いことがはっきりとわかります。

同様に、損失を次のようにプロットします。

  1. plt.plot(history.history[ '損失' ])  
  2. plt.plot(history.history[ 'val_loss' ])  
  3. plt.xlabel( 'エポック' )  
  4. plt.ylabel( '損失' )  
  5. plt.legend([ 'トレーニング' , '検証' ], loc= '左上' )

ここでは、検証セットの損失がトレーニング セットの損失よりもはるかに大きいことがはっきりとわかります。これは、データが過剰適合されているためです。

モデルが適切に機能するかどうかを確認するには、model.evaluate を使用してチェックします。データとラベルを評価関数に入力します。

  1. モデル1.評価(X_テスト、y_テスト)

したがって、モデルの精度は 88% であり、過剰適合モデルとしては非常に良好であることがわかります。

正規化

モデルに正規化を追加して、さらに改善してみましょう。 正規化により、モデルの過剰適合が軽減され、モデルが改善されます。

モデルに L2 正則化を追加します。 L2 正規化の詳細については、ここをクリックしてください。 モデルに L2 正則化を追加するには、正則化を追加するレイヤーを指定し、追加のパラメーター kernel_Regularizer を指定してから、tf.keras.Regularizers.l2() を渡す必要があります。

また、モデルにドロップアウトを実装することで、オーバーフィッティングを減らし、パフォーマンスを向上させることができます。 ドロップアウトの理論と動機について詳しくは、この記事をご覧ください。

このモデルを再定義してみましょう。

  1. model2 = シーケンシャル()  
  2. model2. add (Dense(64, activation = 'relu' , input_shape = X_train[0].shape))  
  3. model2.add ( Dense(128, activation = 'relu' , kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  4. ))  
  5. model2.add (Dense(128、アクティベーション = 'relu' 、kernel_regularizer = tf.keras.regularizers.l2(0.001)  
  6. ))  
  7. model2.add (tf.keras.layers.Dropout(0.5)  
  8. model2.add (Dense(128、アクティベーション = 'relu' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  9. ))  
  10. model2.add (Dense(128、アクティベーション = 'relu' 、kernel_regularizer = tf.keras.regularizers.l2(0.001)  
  11. ))  
  12. model2.add (Dense(64、アクティベーション = 'relu' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  13. ))  
  14. model2.add (Dense(64、アクティベーション = 'relu' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  15. ))  
  16. model2.add (tf.keras.layers.Dropout(0.5)  
  17. model2.add (Dense(64、アクティベーション = 'relu' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  18. ))  
  19. model2.add (Dense(64、アクティベーション = 'relu' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  20. ))  
  21. model2.add (Dense(3、アクティベーション = 'softmax' 、kernel_regularizer=tf.keras.regularizers.l2(0.001)  
  22. ))

よく観察すると、2 つのドロップアウト レイヤーと各密なレイヤーに正規化を追加したことを除いて、すべてのレイヤーとパラメーターは同じであることがわかります。

その他すべて (損失、オプティマイザー、エポックなど) は同じままにします。

  1. model2.compile(オプティマイザー= 'adam' 、損失= 'categorical_crossentropy' 、メトリック=[ 'acc' ])  
  2. history2 = model2.fit(X_train、y_train、エポック=800、validation_split=0.1、batch_size=40)

それではモデルを評価しましょう。

なんと、正規化レイヤーとドロップアウト レイヤーを追加することで、精度が 88% から 94% に向上しました。 BN 層を追加すると、さらに改善されます。

描いてみましょう。

正確さ

  1. plt.plot(history2.history[ 'acc' ])  
  2. plt.plot(history2.history[ 'val_acc' ])  
  3. plt.title( '精度とエポック' )  
  4. plt.ylabel( 'Acc' )  
  5. plt.xlabel( 'エポック' )  
  6. plt.legend([ 'トレーニング' , '検証' ], loc= '右下' )  
  7. plt.show()

  1. plt.plot(history2.history[ '損失' ])  
  2. plt.plot(history2.history[ 'val_loss' ])  
  3. plt.title( '損失とエポック' )  
  4. plt.ylabel( '損失' )  
  5. plt.xlabel( 'エポック' )  
  6. plt.legend([ 'トレーニング' , '検証' ], loc= '右上' )  
  7. plt.show()

洞察

このようにして、モデルのオーバーフィッティングを改善し、モデルの精度を約 6% 向上させることに成功しました。これは、小規模なデータセットにとっては良好な改善です。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式サイトにアクセスして許可を申請してください。

<<:  ついにAI、BI、ビッグデータ、データサイエンスをわかりやすく説明する人が出てきた

>>:  Python コーディング面接の前に解くべき 10 個のアルゴリズム

ブログ    
ブログ    

推薦する

1 行のコードで AI モデルの推論速度が 10 倍に向上します。 Reddit の技術共有は「恥知らずな自己宣伝」として揶揄される

Reddit フォーラムでは、さまざまな AI テクノロジーについて頻繁に議論されています。最近、あ...

...

台北の5G自動運転バスが試乗開始

「台北市信義路バスレーン自動運転バスイノベーション実験プロジェクト」は台北市で長らくテストされており...

チャットボットのアーキテクチャモデルと応答生成メカニズムは何ですか?

チャットボットは、実生活で人工知能を活用するための最も人気があり、広く採用され、敷居の低い方法の 1...

強力な視覚 AI でもこれらの写真を正確に識別できないのはなぜでしょうか?

▲ テーブルの上にいるのはマンホールの蓋でしょうか、それともトンボでしょうか?(写真提供:ダン・ヘ...

2021 年に注目すべき 27 の建設技術トレンド (パート 2)

テクノロジーは建設業界にかつてないほど大きな影響を与えています。クラウドベースのコラボレーションやデ...

...

トップレベルの人工知能チームを構築するにはどうすればよいでしょうか?

市場には優れた AI ソフトウェア ツールが数多く存在しますが、プロジェクトを実装する際には強力なチ...

Mistral と Microsoft が「小さな言語モデル」の波を起こしました。 Mistralのコーディング能力はGPT-4より優れており、コストは2/3に削減されます

最近、「小さな言語モデル」がにわかに話題になっています。今週月曜日、4億1500万ドルの資金調達を完...

7nmプロセス限界を突破した世界初の3DウェーハレベルパッケージングプロセッサIPUがリリース

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

スタンフォード大学の研究者がAIを活用してCOVID-19の治療薬の発見を加速

COVID-19の流行が世界中の人々の生命と日常生活を脅かし続けている中、人々はこの病気の予防と治療...

...

GPT-4が「愚か」になったと誰もが不満を言っていますが、これはアーキテクチャの再設計が原因かもしれません。

OpenAI が GPT-4 を最初にリリースしてから約 4 か月が経ちました。しかし、時間が経つ...

Yirendai - Yiren Hive Fintech AI 実践: Hive Robot

1. 金融テクノロジー金融テクノロジー: これは業界ではフィンテックと呼ばれています。 Wikip...