成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從零開(kāi)始使用TensorFlow建立簡(jiǎn)單的邏輯回歸模型

kohoh_ / 3170人閱讀

摘要:我們使用的損失函數(shù)為由于我們的數(shù)據(jù)集只有兩個(gè)特征,因此不用擔(dān)心過(guò)擬合,所以損失函數(shù)里的正規(guī)化項(xiàng)就不要了。到此,一個(gè)完整的簡(jiǎn)單的邏輯回歸模型就實(shí)現(xiàn)完畢了,希望通過(guò)這篇文章,能讓各位看官對(duì)在中機(jī)器學(xué)習(xí)模型的實(shí)現(xiàn)有一個(gè)初步的了解。

TensorFlow 是一個(gè)基于 python 的機(jī)器學(xué)習(xí)框架。在 Coursera 上學(xué)習(xí)了邏輯回歸的課程內(nèi)容后,想把在 MATLAB 中實(shí)現(xiàn)了的內(nèi)容用 TensorFlow 重新實(shí)現(xiàn)一遍,當(dāng)做學(xué)習(xí) Python 和框架的敲門(mén)磚。

目標(biāo)讀者

知道邏輯回歸是什么,懂一點(diǎn) Python,聽(tīng)說(shuō)過(guò) TensorFlow

數(shù)據(jù)集

來(lái)自 Coursera 上 Andrew 的機(jī)器學(xué)習(xí)課程中的ex2data1.txt,根據(jù)學(xué)生的兩次考試成績(jī)判斷該學(xué)生是否會(huì)被錄取。

環(huán)境

Python 2.7 - 3.x

pandas, matplotlib, numpy

安裝 TensorFlow

在自己的電腦上安裝 TensorFlow 框架,安裝方法過(guò)程不贅述,CPU 版相對(duì)更容易一點(diǎn),GPU 版需要 CUDA 支持,各位看官看情況安裝就好。

開(kāi)始

創(chuàng)建一個(gè)文件夾(比如就叫做tensorflow),在文件夾中創(chuàng)建一個(gè) Python 文件main.py,并將數(shù)據(jù)集文件放到這個(gè)文件夾下:

數(shù)據(jù)形式:

前兩列分別為兩次考試成績(jī)(x1, x2),最后一列為是否被錄取(y),1代表被錄取,0則反之。

在源文件main.py中,我們首先引入需要的包:

import pandas as pd                # 用于讀取數(shù)據(jù)文件
import tensorflow as tf
import matplotlib.pyplot as plt    # 用于畫(huà)圖
import numpy as np                 # 用于后續(xù)計(jì)算

pandas是一個(gè)數(shù)據(jù)處理相關(guān)的包,可以對(duì)數(shù)據(jù)集進(jìn)行讀取和其他各種操作;matplotlib可以用來(lái)把我們的數(shù)據(jù)集繪成圖表展示出來(lái)。

接著我們將數(shù)據(jù)集文件讀入程序,用于后面的訓(xùn)練:

# 讀取數(shù)據(jù)文件
df = pd.read_csv("ex2data1.txt", header=None)
train_data = df.values

pandas函數(shù)read_csv可以將 csv(comma-separated values)文件中的數(shù)據(jù)讀入df變量,通過(guò)df.values將 DataFrame 轉(zhuǎn)化為二維數(shù)組:

有了數(shù)據(jù)之后,我們需要將特征(x1, x2)和標(biāo)簽(y)分別放到兩個(gè)變量中,以便在訓(xùn)練中代入公式:

# 分離特征和標(biāo)簽,并獲取數(shù)據(jù)維數(shù)
train_X = train_data[:, :-1]
train_y = train_data[:, -1:]
feature_num = len(train_X[0])
sample_num = len(train_X)
print("Size of train_X: {}x{}".format(sample_num, feature_num))
print("Size of train_y: {}x{}".format(len(train_y), len(train_y[0])))

可以看到,我們的數(shù)據(jù)集中有100條樣例,每條樣例的特征數(shù)量為2。

TensorFlow 模型設(shè)計(jì)

在邏輯回歸中,我們使用的預(yù)測(cè)函數(shù)(Hypothesis)為:

$$
h_θ(x) = sigmoid(XW + b)
$$

其中,sigmoid是一個(gè)激活函數(shù),在這里表示學(xué)生被錄取的概率:

$$
P(y = 1 | x, heta)
$$

這個(gè)函數(shù)的形狀請(qǐng)自行百度

Wb 是我們接下來(lái)的學(xué)習(xí)目標(biāo),W 為權(quán)值矩陣(Weights),b 為偏置量(Bias,體現(xiàn)在圖像上又叫截距)。

我們使用的損失函數(shù)為:

$$
J(θ) = -frac{1}{m} left[ sum_{i=1}^m y^{(i)}log(h_ heta(x^{(i)})) + (1 - y^{(i)})log(1 - h_ heta(x^{(i)})) ight]
$$

由于我們的數(shù)據(jù)集只有兩個(gè)特征,因此不用擔(dān)心過(guò)擬合,所以損失函數(shù)里的正規(guī)化項(xiàng)就不要了?。

首先我們用 TensorFlow 定義兩個(gè)變量用來(lái)存放我們的訓(xùn)練用數(shù)據(jù):

# 數(shù)據(jù)集
X = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)

這里的X和y不是一般的變量,而是一個(gè) placeholder(占位符),意味著這兩個(gè)變量的值是未指定的,直到你開(kāi)始訓(xùn)練模型時(shí)才需要將給定的數(shù)據(jù)賦值給變量。

接著我們?cè)俣x出我們要訓(xùn)練的 Wb

# 訓(xùn)練目標(biāo)
W = tf.Variable(tf.zeros([feature_num, 1]))
b = tf.Variable([-.9])

這里他們的類(lèi)型為 Variable(變量),意味著這兩個(gè)變量將在訓(xùn)練迭代的過(guò)程中不斷地變化,最終取得我們期望的值??梢钥吹剑覀儗?W 的初始值設(shè)為了 feature_num 維的0向量,將 b 初始值設(shè)為了 -0.9(隨便設(shè)的,不要介意?)

接下來(lái)我們要用 TensorFlow 的方式將損失函數(shù)表達(dá)出來(lái):

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

cost0 = y * tf.log(hyp)
cost1 = (1 - y) * tf.log(1 - hyp)
cost = (cost0 + cost1) / -sample_num
loss = tf.reduce_sum(cost)

可以看到,我表達(dá)損失函數(shù)是分三步進(jìn)行的:先分別將求和內(nèi)的兩部分表示出來(lái),再將它們加和并和外面的常數(shù)m進(jìn)行運(yùn)算,最后對(duì)這個(gè)向量進(jìn)行求和,便得到了損失函數(shù)的值。

接下來(lái),我們要定義使用的優(yōu)化方法:

optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)

其中,第一步是選取優(yōu)化器,這里我們選擇梯度下降方法;第二步是優(yōu)化目標(biāo),從函數(shù)名字顧名思義,我們的優(yōu)化目標(biāo)是使得損失函數(shù)的值最小化。

注意:此處的學(xué)習(xí)率(0.001)應(yīng)當(dāng)盡可能小,否則可能會(huì)出現(xiàn)損失計(jì)算中出現(xiàn) log(0)的問(wèn)題。

訓(xùn)練

上面的工作做完之后,我們就可以開(kāi)始訓(xùn)練我們的模型了。

在 TensorFlow 中,首先要將之前定義的Variable初始化:

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

在這里,我們看到出現(xiàn)了一個(gè)tf.Session(),顧名思義是會(huì)話,即任務(wù)執(zhí)行的主體。我們上面定義了一堆東西,只是一個(gè)模型為了得到結(jié)果而需要的執(zhí)行步驟和框架,一個(gè)類(lèi)似流程圖的東西,光有流程圖還不夠,我們需要一個(gè)主體來(lái)實(shí)際地運(yùn)行它,這就是Session的作用。

----------特別提示----------

如果你是使用 GPU 版 TensorFlow 的話,并且你想在顯卡高占用率的情況下(比如玩游戲)訓(xùn)練模型,那你要注意在初始化 Session 的時(shí)候?yàn)槠浞峙涔潭〝?shù)量的顯存,否則可能會(huì)在開(kāi)始訓(xùn)練的時(shí)候直接報(bào)錯(cuò)退出:

2017-06-27 20:39:21.955486: E c:	f_jenkinshomeworkspace
elease-winmwindows-gpupy35	ensorflowstream_executorcudacuda_blas.cc:365] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
Traceback (most recent call last):
  File "C:UsersDYZAnaconda3envs	ensorflowlibsite-packages	ensorflowpythonclientsession.py", line 1139, in _do_call
    return fn(*args)
  File "C:UsersDYZAnaconda3envs	ensorflowlibsite-packages	ensorflowpythonclientsession.py", line 1121, in _run_fn
    status, run_metadata)
  File "C:UsersDYZAnaconda3envs	ensorflowlibcontextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:UsersDYZAnaconda3envs	ensorflowlibsite-packages	ensorflowpythonframeworkerrors_impl.py", line 466, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InternalError: Blas GEMV launch failed:  m=2, n=100
         [[Node: 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)]]

這時(shí)你需要用下面的方法創(chuàng)建 Session

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

這里的0.333就是占你總顯存的份額。

----------End 特別提示----------

下面就是用我們的數(shù)據(jù)集來(lái)對(duì)模型進(jìn)行訓(xùn)練了:

feed_dict = {X: train_X, y: train_y}

for step in range(1000000):
    sess.run(train, {X: train_X, y: train_y})
    if step % 100 == 0:
        print(step, sess.run(W).flatten(), sess.run(b).flatten())

首先講要傳入的數(shù)據(jù)存放到一個(gè)變量中,在訓(xùn)練模型時(shí)傳入 sess.run();我們進(jìn)行 10000 次訓(xùn)練,每隔 100
次輸出一次當(dāng)前的目標(biāo)參數(shù) W, b。

到這里,訓(xùn)練代碼的部分就完成了,你可以使用你自己的 python 命令來(lái)運(yùn)行了。如果你嚴(yán)格按照上面的代碼做了,不出現(xiàn)錯(cuò)誤,你現(xiàn)在應(yīng)該可以看到控制臺(tái)里已經(jīng)開(kāi)始不斷輸出訓(xùn)練狀態(tài)了:

圖形化表示結(jié)果

當(dāng)訓(xùn)練結(jié)束后,你可以得到一個(gè) W,和一個(gè) b,這樣我們可以將數(shù)據(jù)集和擬合的結(jié)果通過(guò)圖表直觀地展現(xiàn)出來(lái)。

就在寫(xiě)作的過(guò)程中,我用上面的代碼訓(xùn)練出了一個(gè)結(jié)果:

我們將其直接寫(xiě)入代碼,即:

w = [0.12888144, 0.12310864]
b = -15.47322273

下面我們先將數(shù)據(jù)集表示在圖表上(x1為橫軸,x2為縱軸):

x1 = train_data[:, 0]
x2 = train_data[:, 1]
y = train_data[:, -1:]

for x1p, x2p, yp in zip(x1, x2, y):
    if yp == 0:
        plt.scatter(x1p, x2p, marker="x", c="r")
    else:
        plt.scatter(x1p, x2p, marker="o", c="g")

其中,我們用 紅色的x 代表 沒(méi)有被錄取,用 綠色的o 代表 被錄取。

其次我們將訓(xùn)練得出的決策邊界 XW + b = 0 表示到圖表上:

# 根據(jù)參數(shù)得到直線
x = np.linspace(20, 100, 10)
y = []
for i in x:
    y.append((i * -w[1] - b) / w[0])
    
plt.plot(x, y)
plt.show()

此時(shí),如果你的代碼沒(méi)錯(cuò)的話,再次運(yùn)行,你將得到如下結(jié)果:

可以看到,我們通過(guò)訓(xùn)練得出的參數(shù)劃出一條直線,非常合適地將兩種不同的數(shù)據(jù)樣例區(qū)分開(kāi)來(lái)。

到此,一個(gè)完整的簡(jiǎn)單的邏輯回歸模型就實(shí)現(xiàn)完畢了,希望通過(guò)這篇文章,能讓各位看官對(duì)在 TensorFlow 中機(jī)器學(xué)習(xí)模型的實(shí)現(xiàn)有一個(gè)初步的了解。本人也在初步學(xué)習(xí)當(dāng)中,如有不當(dāng)之處歡迎在評(píng)論區(qū)拍磚,在實(shí)現(xiàn)以上代碼的過(guò)程中如果遇到什么問(wèn)題也請(qǐng)?jiān)谠u(píng)論區(qū)隨意開(kāi)火。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38637.html

相關(guān)文章

  • Keras TensorFlow教程:如何從零開(kāi)發(fā)一個(gè)復(fù)雜深度學(xué)習(xí)模型

    摘要:目前,是成長(zhǎng)最快的一種深度學(xué)習(xí)框架。這將是對(duì)社區(qū)發(fā)展的一個(gè)巨大的推動(dòng)作用。以下代碼是如何開(kāi)始導(dǎo)入和構(gòu)建序列模型。現(xiàn)在,我們來(lái)構(gòu)建一個(gè)簡(jiǎn)單的線性回歸模型。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/205... Keras 是提供一些高可用的 Python API ,能幫助你快速的構(gòu)建...

    cyqian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<