TensorFlow を使用してシンプルなロジスティック回帰モデルをゼロから構築する

TensorFlow を使用してシンプルなロジスティック回帰モデルをゼロから構築する
TensorFlow は Python ベースの機械学習フレームワークです。 Coursera でロジスティック回帰のコース内容を勉強した後、Python とフレームワークを学ぶための足がかりとして、MATLAB で実装されている内容を TensorFlow を使用して再実装したいと考えました。

対象者

ロジスティック回帰とは何かを知っており、Pythonを少し知っていて、TensorFlowについて聞いたことがある

データセット

Coursera の Andrew の機械学習コースの ex2data1.txt。2 つのテストのスコアに基づいて学生が入学できるかどうかを決定します。

環境

Python 2.7 - 3.x

パンダ、matplotlib、numpy

TensorFlowをインストールする

TensorFlow フレームワークをコンピューターにインストールします。インストール手順についてはここでは説明しません。CPU バージョンは比較的簡単ですが、GPU バージョンでは CUDA サポートが必要です。必要に応じてインストールできます。

始める

フォルダー (たとえば、tensorflow という名前) を作成し、フォルダー内に Python ファイル main.py を作成し、データセット ファイルをこのフォルダーに配置します。

データ形式:

最初の 2 列は 2 つの試験のスコア (x1、x2) であり、最後の列は学生が入学したかどうか (y) です。1 は入学したことを意味し、0 は入学しなかったことを意味します。

ソース ファイル main.py で、まず必要なパッケージをインポートします。

import pandas as pd # データファイルの読み取りに使用 import tensorflow as tf
import matplotlib.pyplot as plt # 描画用 import numpy as np # 後続の計算用

Pandas は、データ セットを読み取ってさまざまな操作を実行できるデータ処理パッケージです。matplotlib を使用すると、データ セットをグラフにプロットできます。

次に、後続のトレーニングのためにデータセット ファイルをプログラムに読み込みます。

# データファイルを読み込む df = pd.read_csv("ex2data1.txt", header=None)
トレーニングデータ = df.値

pandas 関数 read_csv は、csv (カンマ区切り値) ファイル内のデータを df 変数に読み取り、df.values を介して DataFrame を 2 次元配列に変換できます。

データを取得したら、特徴 (x1、x2) とラベル (y) をそれぞれ 2 つの変数に入れて、トレーニング中に式に代入できるようにする必要があります。

# 特徴とラベルを分離し、データの次元を取得します。train_X = train_data[:, :-1]
train_y = 列車データ[:, -1:]
特徴数 = len(train_X[0])
サンプル数 = len(train_X)
print("train_Xのサイズ: {}x{}".format(sample_num, feature_num))
print("train_yのサイズ: {}x{}".format(len(train_y), len(train_y[0])))

[[195335]]

ご覧のとおり、データ セットには 100 個のサンプルがあり、各サンプルの特徴の数は 2 です。

TensorFlow モデル設計

ロジスティック回帰では、使用する予測関数 (仮説) は次のとおりです。

hθ(x)=シグモイド(XW+b)

そのうち、シグモイドは学生が入学する確率を表す活性化関数です。

P(y=1|x,θ)

この関数の形状をBaiduにしてください

W と b は、次の学習目標です。W は重み行列 (Weights) で、b はバイアス (Bias、図では切片とも呼ばれます) です。

使用する損失関数は次のとおりです。

J(θ)=−1m[∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]

データ セットには 2 つの特徴しかないため、過剰適合を心配する必要がなく、損失関数の正規化項は必要ありません。

まず、TensorFlow を使用して、トレーニング データを格納する 2 つの変数を定義します。

# データセット X = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

ここで、X と y は一般的な変数ではなくプレースホルダーです。つまり、モデルのトレーニングを開始するまで、これら 2 つの変数の値は指定されておらず、指定されたデータを変数に割り当てる必要があります。

次に、トレーニングする W と b を定義します。

# トレーニングターゲット W = tf.Variable(tf.zeros([feature_num, 1]))
b = tf.変数([-.9])

ここでそのタイプは変数です。つまり、これら 2 つの変数はトレーニングの反復中に変化し続け、最終的に期待する値を取得します。ご覧のとおり、W の初期値を feature_num 次元の 0 ベクトルに設定し、b の初期値を -0.9 に設定しています (気にしないでください、適当に設定してください 😶)

次に、TensorFlow を使用して損失関数を表現する必要があります。

db = tf.matmul(X, tf.reshape(W, [-1, 1])) + b
hyp = tf.sigmoid(db)

コスト0 = y * tf.log(hyp)
コスト1 = (1 - y) * tf.log(1 - hyp)
コスト = (コスト0 + コスト1) / -サンプル数
損失 = tf.reduce_sum(コスト)

ご覧のとおり、損失関数は 3 つのステップで表現されます。まず、合計の 2 つの部分を個別に表現し、次にそれらを加算して外部定数 m を使用して計算し、最後にこのベクトルを合計して損失関数の値を取得します。

次に、使用する最適化方法を定義します。

オプティマイザー = tf.train.GradientDescentOptimizer(0.001)
トレーニング = optimizer.minimize(損失)

その中で、最初のステップはオプティマイザーを選択することです。ここでは、勾配降下法を選択します。2 番目のステップはターゲットを最適化することです。関数の名前が示すように、最適化の目標は損失関数の値を最小化することです。

注意: ここでの学習率 (0.001) はできるだけ小さくする必要があります。そうでないと、損失計算で log(0) が表示される問題が発生する可能性があります。

電車

上記の作業が完了したら、モデルのトレーニングを開始できます。

TensorFlow では、まず以前に定義した変数を初期化する必要があります。

初期化 = tf.global_variables_initializer()
sess = tf.Session()
セッションの実行(初期化)

ここでは、tf.Session() が使用されています。これは、名前が示すように、セッション、つまりタスク実行の本体です。上記では、モデルが結果を得るために必要な実行手順とフレームワーク、つまりフローチャートのようなものをいくつか定義しました。フローチャートだけでは不十分で、実際にそれを実行するサブジェクトが必要です。これがセッションの役割です。

----------特別なヒント----------

TensorFlow の GPU バージョンを使用しており、グラフィック カードの使用率が高いとき (ゲームのプレイ中など) にモデルをトレーニングする場合は、セッションの初期化時に固定量のビデオ メモリを割り当てる必要があります。そうしないと、トレーニングの開始時にエラーが発生し、直接終了する可能性があります。

2017-06-27 20:39:21.955486: E c:\tf_jenkins\home\workspace\release-win\m\windows-gpu\py\35\tensorflow\stream_executor\cuda\cuda_blas.cc:365] cublas ハンドルの作成に失敗しました: CUBLAS_STATUS_ALLOC_FAILED
トレースバック(最新の呼び出しが最後):
  ファイル "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py"、行 1139、_do_call 内
    fn(*args) を返す
  ファイル "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py"、行 1121、_run_fn 内
    ステータス、run_metadata)
  ファイル "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\contextlib.py"、66 行目、__exit__ 内
    次(self.gen)
  ファイル "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\errors_impl.py"、行 466、raise_exception_on_not_ok_status 内
    pywrap_tensorflow.TF_GetCode(ステータス))
tensorflow.python.framework.errors_impl.InternalError: Blas GEMV の起動に失敗しました: m=2、n=100
         [[ノード: MatMul = MatMul[T=DT_FLOAT、transpose_a=false、transpose_b=false、_device="/job:localhost/replica:0/task:0/gpu:0"](_arg_Placeholder_0_0/_3、Reshape)]]

この時点で、次のメソッドを使用してセッションを作成する必要があります。

gpu_options = tf.GPUOptions(プロセスあたりのgpuメモリ割合=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

ここでの 0.333 は、合計ビデオ メモリのシェアです。

----------特別ヒント終了-----------

ここでデータセットを使用してモデルをトレーニングします。

feed_dict = {X: train_X, y: train_y}

範囲(1000000)内のステップの場合:
    sess.run(列車、{X: train_X、y: train_y})
    ステップ % 100 == 0 の場合:
        print(ステップ、sess.run(W).flatten()、sess.run(b).flatten())

まず、渡すデータを変数に保存し、モデルのトレーニング時に sess.run() に渡します。トレーニング実行を 10,000 回実行し、各実行は 100 秒間実行されます。
現在のターゲットパラメータ W、b を 1 回出力します。

この時点で、トレーニング コードは完成しており、独自の Python コマンドを使用して実行できます。上記のコードに厳密に従ってエラーがなければ、コンソールにトレーニング ステータスが継続的に出力されるのを確認できるはずです。

結果のグラフ表示

トレーニングが完了すると、W と b が取得され、データ セットとフィッティング結果をチャートを通じて視覚的に表示できるようになります。

執筆中、上記のコードを使用して結果をトレーニングしました。

コードに直接記述します。つまり、次のようになります。

w = [0.12888144, 0.12310864]
β = -15.47322273

まず、データ セットをグラフに表してみましょう (x1 は水平軸、x2 は垂直軸)。

x1 = トレーニングデータ[:, 0]
x2 = トレーニングデータ[:, 1]
y = トレーニングデータ[:, -1:]

zip(x1, x2, y) 内の x1p、x2p、yp の場合:
    yp == 0 の場合:
        plt.scatter(x1p, x2p, マーカー='x', c='r')
    それ以外:
        plt.scatter(x1p, x2p, マーカー='o', c='g')

その中で、不合格を表す場合は赤い×、合格を表す場合は緑の○を使用します。

次に、トレーニングを通じて得られた決定境界XW + b = 0をグラフにプロットします。

# パラメータに基づいて直線を取得します x = np.linspace(20, 100, 10)
y = []
i が x 内にある場合:
    y.append((i * -w[1] - b) / w[0])
    
plt.plot(x, y)
plt.show()

この時点で、コードが正しければ、もう一度実行すると次の結果が得られます。

ご覧のとおり、トレーニングを通じて取得したパラメーターは、2 つの異なるデータ サンプルを非常に適切に区別する直線を描きます。

この時点で、完全かつシンプルなロジスティック回帰モデルが実装されました。この記事を通じて、TensorFlow での機械学習モデルの実装について予備的な理解を深めていただければ幸いです。私もまだ学習の初期段階です。不適切な点がありましたら、コメント欄で遠慮なくご批判ください。上記のコードを実装する過程で問題が発生した場合は、コメント欄でお気軽にご批判ください。

<<:  推奨システムにおける自然言語処理 (NLP) の応用

>>:  顔認識技術が明らかに、未来はもうすぐ「手の届くところ」に!

ブログ    
ブログ    
ブログ    

推薦する

...

...

清華大学の卒業生は大きな貢献をしました! Google、14のタスクで初の大規模一般医療モデルSOTAをリリース

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

画期的なニューラルネットワークが量子AI研究への道を開く可能性

海外メディアの報道によると、イタリアの研究者らは最近、量子コンピュータ上で特殊なアルゴリズムを実行す...

ビッグデータと機械学習は世界のエネルギー業界をどのように変えるのでしょうか?

機械学習、ビッグデータ、自動化は世界の産業システムに革命をもたらしており、エネルギー業界も例外ではあ...

クラウドAI市場は2028年までに2,700億ドルに達すると予想

デジタル時代の到来により前例のない進歩がもたらされ、人工知能(AI)はさまざまな業界でイノベーション...

次世代の AI 人材をどう育成するか?

AI 人材とプロジェクト パイプラインを構築するには、教育的価値だけでなく技術的価値も必要です。そ...

...

AIは追いつこうと努力しているが、5Gはカーブで追い越しつつある。トランプ氏が不安にならないわけがない。

[[263771]] 5Gの進歩に伴い、コスト面でも速度面でも、中国の5Gなしでは5Gを推進するの...

人工知能を活用するための5つのベストプラクティス

生産性、精度、意思決定能力を向上させるために人工知能 (AI) を導入する手法は、さまざまな業界で広...

ChatGPTが危険にさらされています! 「Attention Formula」の8年前の謎のバグが初めて暴露、Transformerモデルに大きな影響が出る可能性

「注目の式」に8年間存在していたバグが外国人によって発見された?一瞬にして、この話題はインターネット...

Pythonを使用して独自のTwitterボットを構築する方法を学びます

Twitter を使用すると、ユーザーはブログの投稿や記事を世界と共有できます。 Python と ...

GPT のプログラミング バージョンは 30,000 スターに急上昇し、AutoGPT は危険にさらされています。

執筆者 | 王 瑞平AutoGPT に続いて、GPT ファミリーに新しいメンバーである GPT-En...

AGI を理解する: 知能の未来?

病気の診断から交響曲の作曲、車の運転から道徳的な判断に至るまで、人間が行えるあらゆる作業を機械が実行...

人工知能の安全で制御可能な開発について議論するために、AIセキュリティと産業ガバナンスフォーラムが正式に開催されました。

第四次科学技術革命をリードする戦略的技術として、人工知能は社会構築と経済発展に重大かつ広範囲な影響を...