自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

移動(dòng)開(kāi)發(fā) 深度學(xué)習(xí)
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 和框架的敲門磚。
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 和框架的敲門磚。

目標(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è)文件夾下:

https://s5.51cto.com/wyfs02/M02/9A/53/wKiom1lUb1_QUyZOAAAtgcLVUKU607.jpg

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

 https://s3.51cto.com/wyfs02/M01/9A/53/wKiom1lUb2Lx6xeJAAEaFTUwbRI891.jpg

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

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

import pandas as pd                # 用于讀取數(shù)據(jù)文件
import tensorflow as tf
import matplotlib.pyplot as plt    # 用于畫圖
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ù)組:

 https://s2.51cto.com/wyfs02/M02/9A/53/wKioL1lUb2KREW-UAAESR4t64Z4035.jpg

有了數(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])))

[[195335]]

可以看到,我們的數(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,θ)

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

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

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

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

由于我們的數(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)練的 W 和 b:

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

這里他們的類型為 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è)類似流程圖的東西,光有流程圖還不夠,我們需要一個(gè)主體來(lái)實(shí)際地運(yùn)行它,這就是Session的作用。

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

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

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] failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
Traceback (most recent call last):
  File "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1139, in _do_call
    return fn(*args)
  File "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1121, in _run_fn
    status, run_metadata)
  File "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\contextlib.py", line 66, in __exit__
    next(self.gen)
  File "C:\Users\DYZ\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\errors_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)了:

https://s2.51cto.com/wyfs02/M01/9A/53/wKioL1lUbrTikaBFAAHSU7Yg02k376.png

圖形化表示結(jié)果

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

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

https://s1.51cto.com/wyfs02/M02/9A/53/wKiom1lUbrTCNwk3AAAn87c3eiM452.png

我們將其直接寫入代碼,即:

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)火。

責(zé)任編輯:林師授 來(lái)源: segmentfault
相關(guān)推薦

2018-05-09 20:08:09

人工智能深度學(xué)習(xí)Python

2021-04-21 20:42:42

Nadam梯度優(yōu)化

2024-07-31 08:14:17

2015-11-17 16:11:07

Code Review

2018-04-18 07:01:59

Docker容器虛擬機(jī)

2019-01-18 12:39:45

云計(jì)算PaaS公有云

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2024-12-06 17:02:26

2021-03-16 11:30:33

2016-11-02 14:18:45

搭建論壇Flask框架

2025-04-17 09:00:00

2010-05-26 17:35:08

配置Xcode SVN

2018-09-14 17:16:22

云計(jì)算軟件計(jì)算機(jī)網(wǎng)絡(luò)

2024-05-15 14:29:45

2013-09-22 10:15:01

Spring DataJPA

2019-09-30 10:51:11

Markdown標(biāo)記語(yǔ)言

2023-06-02 07:37:12

LLM?大語(yǔ)言模型

2023-03-11 22:29:59

GitGitHub開(kāi)發(fā)

2020-02-11 16:49:24

React前端代碼

2018-08-20 08:15:50

編程語(yǔ)言Go語(yǔ)言切片
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)