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) の応用

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

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

チューリングテストは死んだ! ChatGPTは人間テストに合格してもカウントされない、スーパーAIが新参者「ロジックパズル」を評価

世界で最も強力な AI - ChatGPT は、さまざまなテストに合格し、真偽を区別するのが難しい回...

...

李開復氏、ペントランド氏と会談:AIはワンマンショーではない、AI冷戦は避けるべき

最近、Sinovation Venturesの会長兼CEOであるKai-Fu Lee博士とAlex ...

最初の生成 AI 安全ガイダンス文書がここにあります。理解できましたか?

10月11日、国家情報セキュリティ標準化技術委員会の公式サイトで「生成型人工知能サービスの基本セキ...

最初の AGI は 2028 年に登場するでしょうか? Google DeepMindは6つのAGI標準を提案し、5つのAGIレベルを定義している

人類は最初の AGI の出現にますます近づいています。最近のインタビューで、DeepMindの共同設...

マイクロソフトは2022年にリモートワーカー向けに3Dワークスペースを提供する予定

Microsoft は、仮想会議用に Mesh for Teams と呼ばれる没入型 3D プラット...

Google と Facebook はなぜ Docker を使用しないのでしょうか?

[[397388]]画像はPexelsより私は2007年に卒業してすぐにGoogleで3年間働きま...

...

エンドツーエンドの自動運転に向けて、Horizo​​n Robotics が Sparse4D アルゴリズムを正式にオープンソース化

Horizo​​n Roboticsは1月22日、純粋な視覚ベースの自動運転アルゴリズムであるSpa...

...

ハードウェアクラッキングに耐えられるハッシュアルゴリズムにはどのようなものがありますか?

[[185577]] 1. はじめにブルートフォース クラッキング ツール hashcat を使用...

海外AI界が騒然! Googleの黒人女性AI倫理研究者が「退職」し騒動を引き起こす

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

...

機械学習アルゴリズムを使用して「実験室地震」を予測するにはどうすればよいでしょうか?

[[186458]]機械学習アルゴリズムが「実験室の地震」を予測できるという事実は、間違いなく画期...

人工知能の到来。会計士は不安になるべきでしょうか?

「人工知能の発達により、労働力は解放されました。工場では、大量の労働者が排除され、高効率で高速なロ...