偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

從零開始使用TensorFlow建立簡單的邏輯回歸模型

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

目標(biāo)讀者

知道邏輯回歸是什么,懂一點 Python,聽說過 TensorFlow

數(shù)據(jù)集

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

環(huán)境

Python 2.7 - 3.x

pandas, matplotlib, numpy

安裝 TensorFlow

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

開始

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

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

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

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

前兩列分別為兩次考試成績(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ù)計算

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

接著我們將數(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變量,通過df.values將 DataFrame 轉(zhuǎn)化為二維數(shù)組:

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

有了數(shù)據(jù)之后,我們需要將特征(x1, x2)和標(biāo)簽(y)分別放到兩個變量中,以便在訓(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è)計

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

hθ(x)=sigmoid(XW+b)

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

P(y=1|x,θ)

這個函數(shù)的形狀請自行百度

W 和 b 是我們接下來的學(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ù)集只有兩個特征,因此不用擔(dān)心過擬合,所以損失函數(shù)里的正規(guī)化項就不要了😌。

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

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

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

接著我們再定義出我們要訓(xùn)練的 W 和 b:

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

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

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

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)

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

接下來,我們要定義使用的優(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)盡可能小,否則可能會出現(xiàn)損失計算中出現(xiàn) log(0)的問題。

訓(xùn)練

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

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

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

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

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

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

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)]]

這時你需要用下面的方法創(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ù)集來對模型進行訓(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ù)存放到一個變量中,在訓(xùn)練模型時傳入 sess.run();我們進行 10000 次訓(xùn)練,每隔 100
次輸出一次當(dāng)前的目標(biāo)參數(shù) W, b。

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

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

圖形化表示結(jié)果

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

就在寫作的過程中,我用上面的代碼訓(xùn)練出了一個結(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 代表 沒有被錄取,用 綠色的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()

此時,如果你的代碼沒錯的話,再次運行,你將得到如下結(jié)果:

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

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

責(zé)任編輯:林師授 來源: 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

2019-01-18 12:39:45

云計算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2016-11-02 14:18:45

搭建論壇Flask框架

2021-03-16 11:30:33

2025-04-17 09:00:00

2010-05-26 17:35:08

配置Xcode SVN

2018-09-14 17:16:22

云計算軟件計算機網(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)記語言

2023-06-02 07:37:12

LLM?大語言模型

2020-02-11 16:49:24

React前端代碼

2018-08-20 08:15:50

編程語言Go語言切片

2023-03-11 22:29:59

GitGitHub開發(fā)
點贊
收藏

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