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

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

ブログ    
ブログ    

推薦する

ビジネスプロセスを改善し簡素化する優れた人工知能ソフトウェア10選

プログラムのコンピュータ化、プログラミング、その他の目的で市場で人工知能ソフトウェアを使用することが...

パドルパドル中国ツアーは、中小企業のソフトウェアおよびハードウェア製品の革新の需要に応えるために深センに上陸しました

AI応用の時代において、人工知能技術は研究室から産業化へと移行しています。人工知能が徐々に製品応用市...

美容業界に参入しよう! AIはフェイスリフト手術も可能

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

...

求職者の履歴書はどうすればAIやロボットによる審査に合格できるのでしょうか?

今日では、求人ウェブサイトに提出された多くの求職者の履歴書は、新しい仕事の面接を受ける前に人工知能ツ...

8年が経ちました。Googleが中国に戻るという噂は本当でしょうか?

[51CTO.com オリジナル記事] Google の中国復帰について新たな声が上がっている。最...

...

インターネットと自動車の大手企業が「自動運転」に賭けているのはなぜでしょうか?

米国現地時間の水曜日、マスク氏はソーシャルメディア上で、同社が今週、一部の選ばれた顧客に対して初の「...

...

ストーリーを伝えれば、動画が編集されます。AI による動画編集の自動化により、パンダの目を持つ編集者が解放されます。

ビデオ編集は、編集者が適切なフレームを見つけてつなぎ合わせる必要がある、時間と労力を要する作業です。...

海底撈のIPOは1000億元規模:将来、厨房に必要なのはエンジニア2人だけ

[[245580]] 2018年9月26日、海底撈国際ホールディングス株式会社(06862.HK)が...

ビッグデータの発展は、ソフトウェアエンジニアの漸進的な衰退とアルゴリズムエンジニアの台頭を伴うことになる。

[[190402]]ビッグデータは人類の歴史のどの時代にも存在していましたが、テクノロジーが一定の...

TS と AI が出会うと何が起こるでしょうか?

人工知能は日々進歩しており、大規模な言語モデルはますます強力になっています。仕事に役立つ AI ツー...

製造業における人工知能の8つの応用シナリオ

人工知能の概念は、60年以上前の1950年代に初めて提案されました。しかし、モノのインターネット、ビ...

ロボット工学が環境に優しい建物にどのように役立つか

建設業界は、他の多くの業界と同様に、より環境に優しくなる瀬戸際にあります。環境に優しいプロジェクトに...