Tensorflow を使用した分類のためのニューラル ネットワーク

ソースノード: 1570297

この記事は、の一部として公開されました データサイエンスブログソン

この記事では、TensorFlow を使用してニューラル ネットワーク モデルを構築し、分類の問題を解決します。 Tensorflow で分類問題にどのようにアプローチできるかを一緒に探りましょう。 しかし、まず、次の質問に答えられるようにしたいと思います。

ネットワークとは何ですか?

ニューラル ネットワークの主な目的は、データ セット内の特徴間の関係を見つけようとすることであり、人間の脳の働きを模倣する一連のアルゴリズムで構成されています。 ニューラル ネットワークの「ニューロン」は、特定のアーキテクチャに従って情報を収集および分類する数学関数です。

分類とは

分類問題には、何かが XNUMX つのクラスに属するかどうかを予測することが含まれます。 言い換えれば、それをしている間、私たちは何かが何らかのものであることを見ようとします.

分類の種類

  • 人が糖尿病にかかっているかどうかを予測したいとします。 このような状況に直面した場合、XNUMX つの可能性がありますよね? と呼ばれる バイナリ分類。
  • 写真がおもちゃなのか、人なのか、猫なのかを識別したいとします。 これは呼ばれます マルチクラス分類 XNUMX つ以上のオプションがあるためです。
  • 記事に割り当てるカテゴリを決定したいとします。 もしそうなら、それは呼ばれます マルチラベル分類、XNUMX つの記事に複数のカテゴリが割り当てられる可能性があるためです。 この記事を通して説明を見てみましょう。 この記事には、「ディープ ラーニング、TensorFlow、分類」などのカテゴリを割り当てる場合があります。

取り組んでいる問題について共通の理解があるので、今、私たちは前進することができます。 それでは、コーディングの時間です。 より良くなり、間違いを減らす唯一の方法は、より多くのコードを書くことなので、それらを書き留めていただければ幸いです。

使用するライブラリをインポートすることから始めます。

numpy を np としてインポート pandas を pd としてインポート matplotlib.pyplot を plt としてインポート tensorflow を tf print(tf.__version__) としてインポート

データセットの作成

作業するデータセットを作成する時が来ました:

from sklearn.datasets import make_circles samples = 1000 X, y = make_circles(samples, noise = 0.03, random_state = 42)

いくつかのデータを作成しました。それについてさらに情報を取得しましょう。

印刷(x >> [[0.75424625 0.23148074] [-0.75615888 0.15325888] [-0.81539193 0.17328203] ... [-0.13690036 -0.81001183]
print(y) >> [1 1 1 1 0 1 1 1 1 0]

さて、データセットをさらに詳しく見てきましたが、まだ何もわかっていませんよね? そのため、ここで重要なステップの XNUMX つはデータと一体になることであり、視覚化はこれを行うための最良の方法です。

circle = pd.DataFrame({ 'X0' : X[:, 0], 'X1' : X[:, 1], 'label' : y}) circle.head()
Tensorflow データヘッドを使用した分類のためのニューラル ネットワーク

ここで XNUMX つの疑問が生じます。どのような種類のラベルを扱っているのでしょうか?

circle.label.value_counts() >> 1 500 0 500 名前: ラベル、dtype: int64

扱っているようです 二項分類問題、2 つのラベル (0 と 1) があるためです。

plt.scatter(X[:,0], X[:,1], c = y, cmap = plt.cm.RdYlBu)
Tensorflow 散布図による分類のためのニューラル ネットワーク

上で述べたように、データを取得する最善の方法は視覚化です。 プロットは、どのようなモデルを構築する必要があるかを示しています。 青い点と赤い点を区別できるモデルを構築します。

ニューラル ネットワーク モデルを構築する前に、入力および出力機能の形状を確認する必要があります。 それらは同じでなければなりません!

print(X.shape, y.shape) print(len(X), len(y)) >> (1000, 2) (1000,) 1000 1000

各特徴の値の量は同じですが、X の形状は異なりますか? なんで? それをチェックしよう。

X[0], y[0] >> (配列([0.75424625, 0.23148074]), 1)

さて、2 年間で 1 つの X 機能があります。 ということで、何事もなく前に進めます。

Tensorflow を使用した分類のためのニューラル ネットワークのモデル化の手順

TensorFlow では、モデルを作成するための固定ステージがあります。

  • モデルを作成する – Functional API または Sequential API を使用して、ニューラル ネットワークのレイヤーをつなぎ合わせます
  • モデルのコンパイル – モデルのパフォーマンスを測定する方法と、それを改善する方法 (損失関数とオプティマイザ) を定義する
  • モードのフィッティングl – モデルにデータ内のパターンを見つけさせる

Sequential API を使用します。 それでは、始めましょう

tf.random.set_seed(42)
model_1 = tf.keras.Sequential([tf.keras.layers.Dense(1)])

model_1.compile(損失 = tf.keras.losses.BinaryCrossentropy(),

# 2 つのクラスで作業しているため、バイナリを損失関数として使用します

 optimizer = tf.keras.optimizers.SGD(), #SGD は確率的勾配降下メトリック = ['accuracy']) model_1.fit(X, y, epochs = 5) を表します
>> エポック 1/5 32/32 [=============================] - 1 秒 1 ミリ秒/ステップ - 損失: 2.8544 - 精度: 0.4600 エポック 2/5 32/32 [=============================] - 0s 2ms/ステップ - 損失: 0.7131 - 精度: 0.5430 エポック 3/5 32/32 [============================] - 0s 2ms/ステップ- 損失: 0.6973 - 精度: 0.5090 エポック 4/5 32/32 [============================] - 0s 2ms /step - 損失: 0.6950 - 精度: 0.5010 エポック 5/5 32/32 [============================] - 0s 1ms/ステップ - 損失: 0.6942 - 精度: 0.4830

モデルの精度は約 50% です。これは基本的に、モデルが推測しているだけであることを意味します。より長くトレーニングしてみましょう。

model_1.fit(X, y, epochs = 200, verbose = 0) #verbose = 0 を設定してトレーニング手順を削除します ) model_1.evaluate(X, y)
>> 32/32 [============================] - 0s 1ms/ステップ - 損失: 0.6935 - 精度: 0.5000 [0.6934829950332642, 0.5]

200 エポックの後でも、推測のように動作します。次のステップは、レイヤーを追加し、トレーニングをより長く行うことです。

tf.random.set_seed(42)
model_2 = tf.keras.Sequential([ tf.keras.layers.Dense(1), tf.keras.layers.Dense(1) ]) model_2.compile(loss = tf.keras.losses.BinaryCrossentropy(), オプティマイザー = tf.keras.optimizers.SGD(), metrics = ['accuracy']) model_2.fit(X, y, エポック = 100, 詳細 = 0)
 model_2.evaluate(X,y)
>> 32/32 [============================] - 0s 1ms/ステップ - 損失: 0.6933 - 精度: 0.5000 [0.6933314800262451, 0.5]

それでも少しも変わらず、何かがおかしいようです。

Tensorflow を使用した分類モデルのニューラル ネットワークの改善

さまざまな段階でモデルを改善するには、さまざまな方法があります。

  • モデルの作成 – レイヤーを追加、隠れユニット(ニューロン)の数を増やし、各レイヤーの活性化関数を変更
  • モデルのコンパイル – SGD() の代わりに Adam() を使用するなど、さまざまな最適化関数を試してください。
  • モデルのフィッティング – エポックの数を増やすことができます

やってみよう ニューロンを追加する と試す アダム オプティマイザ

tf.random.set_seed(42)
model_3 = tf.keras.Sequential([ tf.keras.layers.Dense(100), # 100 個の高密度ニューロンを追加 tf.keras.layers.Dense(10), # 10 個のニューロンを持つ別のレイヤーを追加 tf.keras.layers.Dense (1) ]) model_3.compile(loss=tf.keras.losses.BinaryCrossentropy(), optimizer=tf.keras.optimizers.Adam(), metrics=['accuracy']) model_3.fit(X, y, エポック=100、冗長=0)
model_3.evaluate(X,y) >> 32/32 [=============================] - 0s 1ms/ステップ- 損失: 0.6980 - 精度: 0.5080 [0.6980254650115967, 0.5080000162124634]

まだまだ良くなりません! データを視覚化して、何が問題なのかを見てみましょう。

ニューラル ネットワーク モデルを視覚化する

モデルの予測を視覚化するために、関数 plot_decision_boundary() を作成します。

  • トレーニング済みのモデル、機能、およびラベルを取り込みます
  • 異なる X 値のメッシュ グリッドを作成します。
  • メッシュグリッド全体で予測を行います。
  • 予測を線でプロットします。

注:  この関数は、次の XNUMX つのリソースから採用されています。

CS231n ML の基本で作成 

def plot_decision_boundary(model, X, y): # プロットの軸境界を定義し、メッシュグリッドを作成します x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1 y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1 xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np .linspace(y_min, y_max, 100)) # X 値を作成します (これらすべてについて予測します) x_in = np.c_[xx.ravel(), yy.ravel()] # トレーニング済みを使用して予測を行いますmodel y_pred = model.predict(x_in) # マルチクラスのチェック
 if len(y_pred[0]) > 1: print("doing multiclass classification...") # プロットの準備を整えるために、予測を再形成する必要があります y_pred = np.argmax(y_pred, axis=1).reshape( xx.shape) else: print("doing binary classifcation...") y_pred = np.round(y_pred).reshape(xx.shape) # 決定境界をプロット plt.contourf(xx, yy, y_pred, cmap=plt. cm.RdYlBu, alpha=0.7) plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.RdYlBu) plt.xlim(xx.min( ), xx.max()) plt.ylim(yy.min(), yy.max()) plot_decision_boundary(モデル_3, X, y)
決定境界

ここにあります! ここでも視覚化により、何が間違っていて何をすべきかがわかります。 私たちのモデルはデータを通して直線を引こうとしていますが、データは直線で分けられません。 私たちの分類問題に欠けているものはありますか? それは何ですか?

これが非線形性です! いくつかの非線形線が必要です。 今は混乱するかもしれませんが、以前はそのような機能を見たことがないと思っているなら、それは間違っています。 それらを視覚的に見てみましょう。 ビジュアライゼーションは常にうまく機能します。

ニューラル ネットワークには、使用できるいくつかのアクティベーション関数があります。 レル, シグモイド. ちょっと作ってみよう おもちゃのテンソル それらの機能を確認します。

ニューラル ネットワークの活性化関数

A = tf.cast(tf.range(-12,12), tf.float32) print(A) >> tf.Tensor( [-12. -11. -10. -9. -8. -7. - 6. -5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.]、形状=(24,)、 dtype=float32)

おもちゃのテンソルがどのように見えるか見てみましょう。

plt.プロット(A)
ニューラル ネットワークの活性化関数

こう見えて、一直線! 

それでは、アクティベーション関数を再作成して、それらがテンソルに対して何をするかを見てみましょう。

シグモイド:

def sigmoid(x): return 1 / (1 + tf.exp(-x)) sigmoid(A) plt.plot(sigmoid(A))
シグモイド関数

一直線じゃない!

ReLu:

それでは、ReLu が何をするのかを確認してみましょう。 Relu はすべての負の値を 0 にし、正の値は同じままにします。

def relu(x): tf.maximum(0,x) plt.plot(relu(A)) を返す
レル

また非直線!

非線形活性化関数を見てきましたが、これらは私たちにとってうまくいくものです。モデルは、線形活性化関数を使用した非線形データセットでは何も学習できません! これを学習したら、データをトレーニング セットとテスト セットに分割し、強力なモデルを構築します。

X_train, y_train = X[:800], y[:800] X_test, y_test = X[800:], y[800:] X_train.shape, X_test.shape >>((800, 2), (200, 2 )))

 

これでトレーニング セットとテスト セットができました。トレーニング データをモデル化し、モデルがテスト セットで学習したことを評価しましょう。

tf.random.set_seed(42)
model_4 = tf.keras.Sequential([ tf.keras.layers.Dense(4, activation = 'relu'), #それを正すかもしれません "tf.keras.activations.relu" も tf.keras.layers.Dense(4 、活性化 = 'relu')、tf.keras.layers.Dense(1、活性化 = 'sigmoid') ]) model_4.compile( loss= tf.keras.losses.binary_crossentropy、optimizer = tf.keras.optimizers.Adam( lr = 0.01)、メトリック = ['accuracy']) model_4.fit(X_train、y_train、epochs = 25、verbose = 0)

モデルを評価する

loss, accuracy = model_4.evaluate(X_test, y_test) print(f' テスト セットでのモデル損失: {loss}') print(f' テスト セットでのモデル精度: {100*accuracy}')
>> 7/7 [=============================] - 0s 2ms/ステップ - 損失: 0.1247 - 精度: 1.0000テスト セットでのモデル損失: 0.1246885135769844 テスト セットでのモデル精度: 100.0

出来上がり! 100% の精度! この結果を視覚的に見てみましょう

plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.title("電車") plot_decision_boundary(model_4, X=X_train, y=y_train) plt.subplot(1, 2, 2) plt.title("テスト") plot_decision_boundary(model_4, X=X_test, y=y_test) plt.show()
Tensorflow による分類のためのバイナリ ニューラル ネットワーク

ほんの少し調整するだけで、モデルは青と赤の円をほぼ完全に予測できるようになりました。

まとめ

この記事で話していることを簡単に見てみましょう。 TensorFlow を使用してニューラル ネットワークで分類タスクにアプローチする方法を一緒に検討しました。 最初に頭に浮かんだ方法で 3 つのモデルを作成し、視覚化の助けを借りてどこが間違っているかを認識し、線形性、非線形性を調査し、最終的に一般化されたモデルを構築することができました。 私がこれらすべてのコードと従った手順で示そうとしたのは、100% 正確または修正されたものはなく、すべてが毎日変化し続けているということでした。 どの種類のデータでどの問題に直面する可能性が高いかを推測し、どの組み合わせがより良い結果につながるかを確認するには、より多くのコードを記述して経験を積むだけで済みます。

この記事が少しでもお役に立てば幸いです。

この記事に示されているメディアはAnalyticsVidhyaが所有しておらず、作成者の裁量で使用されています

出典: https://www.analyticsvidhya.com/blog/2021/11/neural-network-for-classification-with-tensorflow/

タイムスタンプ:

より多くの 分析Vidhya