一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Tensorflow實現(xiàn)線性支持向量機的形式來作為 Tensorflow 的“應(yīng)用式入門教程

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-03-29 17:02 ? 次閱讀

本文擬通過使用 Tensorflow 實現(xiàn)線性支持向量機(LinearSVM)的形式來作為 Tensorflow 的“應(yīng)用式入門教程”。雖說用 mnist 做入門教程項目幾乎是約定俗成的事了,但總感覺照搬這么個東西過來當(dāng)專欄有些水……所以還是自己親手寫了個 LinearSVM ( σ'ω')σ

在實現(xiàn)之前,先簡要介紹一下 LinearSVM 算法(詳細(xì)介紹可以參見這里):

以及介紹一下 Tensorflow 的若干思想:

Tensorflow 的核心在于它能構(gòu)建出一張“運算圖(Graph)”,我們需要做的是往這張 Graph 里加入元素

基本的元素有如下三種:常量(constant)、可訓(xùn)練的變量(Variable)和不可訓(xùn)練的變量(Variable(trainable=False))

由于機器學(xué)習(xí)算法常??梢赞D(zhuǎn)化為最小化損失函數(shù),Tensorflow 利用這一點、將“最小化損失”這一步進(jìn)行了很好的封裝。具體而言,你只需要在 Graph 里面將損失表達(dá)出來后再調(diào)用相應(yīng)的函數(shù)、即可完成所有可訓(xùn)練的變量的更新

其中第三點我們會在實現(xiàn) LinearSVM 時進(jìn)行相應(yīng)說明,這里則會把重點放在第二點上。首先來看一下應(yīng)該如何定義三種基本元素以及相應(yīng)的加、減、乘、除(值得一提的是,在 Tensorflow 里面、我們常常稱處于 Graph 之中的 Tensorflow 變量為“Tensor”,于是 Tensorflow 就可以理解為“Tensor 的流動”)(注:Tensor 這玩意兒叫張量,數(shù)學(xué)上是挺有來頭的東西;然而個人認(rèn)為如果不是做研究的話就完全可以不管它數(shù)學(xué)內(nèi)涵是啥、把它當(dāng)成高維數(shù)組就好 ( σ'ω')σ):

import tensorflow as tf

# 定義常量、同時把數(shù)據(jù)類型定義為能夠進(jìn)行 GPU 計算的 tf.float32 類型

x = tf.constant(1, dtype=tf.float32)

# 定義可訓(xùn)練的變量

y = tf.Variable(2, dtype=tf.float32)

# 定義不可訓(xùn)練的變量

z = tf.Variable(3, dtype=tf.float32, trainable=False)

x_add_y = x + y

y_sub_z = y – z

x_times_z = x * z

z_div_x = z / x

此外,Tensorflow 基本支持所有 Numpy 中的方法、不過它留給我們的接口可能會稍微有些不一樣。以“求和”操作為例:

# 用 Numpy 數(shù)組進(jìn)行 Tensor 的初始化

x = tf.constant(np.array([[1, 2], [3, 4]]))

# Tensorflow 中對應(yīng)于 np.sum 的方法

axis0 = tf.reduce_sum(x, axis=0) # 將會得到值為 [ 4 6 ] 的 Tensor

axis1 = tf.reduce_sum(x, axis=1) # 將會得到值為 [ 3 7 ] 的 Tensor

更多的操作方法可以參見這里(https://zhuanlan.zhihu.com/p/26657869)

最后要特別指出的是,為了將 Graph 中的 Tensor 的值“提取”出來、我們需要定義一個 Session 來做相應(yīng)的工作??梢赃@樣理解 Graph 和 Session 的關(guān)系(注:該理解可能有誤!如果我確實在瞎扯的話,歡迎觀眾老爺們指出 ( σ'ω')σ):

Graph 中定義的是一套“運算規(guī)則”

Session 則會“啟動”這一套由 Graph 定義的運算規(guī)則,而在啟動的過程中、Session 可能會額外做三件事:

從運算規(guī)則中提取出想要的中間結(jié)果

更新所有可訓(xùn)練的變量(如果啟動的運算規(guī)則包括“更新參數(shù)”這一步的話)

賦予“運算規(guī)則”中一些“占位符”以具體的值

其中“更新參數(shù)”和“占位符”的相關(guān)說明會放在后文進(jìn)行,這里我們只說明“提取中間結(jié)果”是什么意思。比如現(xiàn)在 Graph 中有這么一套運算規(guī)則:,而我只想要運算規(guī)則被啟動之后、y 的運算結(jié)果。該需求的代碼實現(xiàn)如下:

x = tf.constant(1)

y = x + 1

z = y + 1

print(tf.Session().run(y)) # 將會輸出2

如果我想同時獲得 y 和 z 的運算結(jié)果的話,只需將第 4 行改為如下代碼即可:

print(tf.Session().run([y, z])) # 將會輸出 [2, 3]

最后想要特別指出一個非常容易犯錯的地方:當(dāng)我們使用了 Variable 時,必須要先調(diào)用初始化的方法之后、才能利用 Session 將相應(yīng)的值從 Graph 里面提取出來。比如說,下面這段代碼是會報錯的:

x = tf.Variable(1)

print(tf.Session().run(x)) # 報錯!

應(yīng)該改為:

x = tf.Variable(1)

with tf.Session().as_default() as sess:

sess.run(tf.global_variables_initializer())

print(sess.run(x))

其中 tf.global_variables_initializer() 的作用可由其名字直接得知:初始化所有 Variable

接下來就是 LinearSVM 的實現(xiàn)了,由前文的討論可知,關(guān)鍵只在于把損失函數(shù)的形式表達(dá)出來(利用到了 ClassifierBase(https://link.zhihu.com/?target=https%3A//github.com/carefree0910/MachineLearning/blob/master/Util/Bases.py%23L196);同時為了簡潔,我們設(shè)置C=1):

import tensorflow as tf

from Util.Bases import ClassifierBase

class TFLinearSVM(ClassifierBase):

def __init__(self):

super(TFLinearSVM, self).__init__()

self._w = self._b = None

# 使用 self._sess 屬性來存儲一個 Session 以方便調(diào)用

self._sess = tf.Session()

def fit(self, x, y, sample_weight=None, lr=0.001, epoch=10 ** 4, tol=1e-3):

# 將 sample_weight(樣本權(quán)重)轉(zhuǎn)換為 constant Tensor

if sample_weight is None:

sample_weight = tf.constant(

np.ones(len(y)), dtype=tf.float32, name="sample_weight")

else:

sample_weight = tf.constant(

np.array(sample_weight) * len(y), dtype=tf.float32, name="sample_weight")

# 將輸入數(shù)據(jù)轉(zhuǎn)換為 constant Tensor

x, y = tf.constant(x, dtype=tf.float32), tf.constant(y, dtype=tf.float32)

# 將需要訓(xùn)練的 w、b 定義為可訓(xùn)練 Variable

self._w = tf.Variable(np.zeros(x.shape[1]), dtype=tf.float32, name="w")

self._b = tf.Variable(0., dtype=tf.float32, name="b")

# ========== 接下來的步驟很重要!??! ==========

# 調(diào)用相應(yīng)方法獲得當(dāng)前模型預(yù)測值

y_pred = self.predict(x, True, False)

# 利用相應(yīng)函數(shù)計算出總損失:

# cost = ∑_(i=1)^N max?(1-y_i?(w?x_i+b),0)+1/2 + 0.5 * ‖w‖^2

cost = tf.reduce_sum(tf.maximum(

1 - y * y_pred, 0) * sample_weight) + tf.nn.l2_loss(self._w)

# 利用 Tensorflow 封裝好的優(yōu)化器定義“更新參數(shù)”步驟

# 該步驟會調(diào)用相應(yīng)算法、以減少上述總損失為目的來進(jìn)行參數(shù)的更新

train_step = tf.train.AdamOptimizer(learning_rate=lr).minimize(cost)

# 初始化所有 Variable

self._sess.run(tf.global_variables_initializer())

# 不斷調(diào)用“更新參數(shù)”步驟;如果期間發(fā)現(xiàn)誤差小于閾值的話就提前終止迭代

for _ in range(epoch):

# 這種寫法是比較偷懶的寫法,得到的 cost 將不太精確

if self._sess.run([cost, train_step])[0] < tol:

break

然后就要定義獲取模型預(yù)測值的方法——self.predict 了:

def predict(self, x, get_raw_results=False, out_of_sess=True):

# 利用 reduce_sum 方法算出預(yù)測向量

rs = tf.reduce_sum(self._w * x, axis=1) + self._b

if not get_raw_results:

rs = tf.sign(rs)

# 如果 out_of_sess 參數(shù)為 True、就要利用 Session 把具體數(shù)值算出來

if out_of_sess:

rs = self._sess.run(rs)

# 否則、直接把 Tensor 返回即可

return rs

之所以要額外用一個 out_of_sess 參數(shù)控制輸出的原因如下:

Tensorflow 在內(nèi)部進(jìn)行 Graph 運算時是無需把具體數(shù)值算出來的、不如說使用原生態(tài)的 Tensor 進(jìn)行運算反而會快很多

當(dāng)模型訓(xùn)練完畢后,在測試階段我們希望得到的當(dāng)然是具體數(shù)值而非 Tensor、此時就需要 Session 幫我們把中間結(jié)果提取出來了

以上就是 LinearSVM 的完整實現(xiàn),可以看到還是相當(dāng)簡潔的

這里特別指出這么一點:利用 Session 來提取中間結(jié)果這個過程并非是沒有損耗的;事實上,當(dāng) Graph 運算本身的計算量不大時,開啟、關(guān)閉 Session 所造成的開銷反而會占整體開銷中的絕大部分。因此在我們編寫 Tensorflow 程序時、要注意避免由于貪圖方便而隨意開啟 Session

在本文的最后,我們來看一下 Tensorflow 里面 Placeholder 這個東西的應(yīng)用。目前實現(xiàn)的 LinearSVM 雖說能用,但其實存在著內(nèi)存方面的隱患。為了解決這個隱患,一個常見的做法是分 Batch 訓(xùn)練,這將會導(dǎo)致“更新參數(shù)”步驟每次接受的數(shù)據(jù)都是“不固定”的數(shù)據(jù)——原數(shù)據(jù)的一個小 Batch。為了描述這個“不固定”的數(shù)據(jù)、我們就需要利用到 Tensorflow 中的“占位符(Placeholder)”,其用法非常直觀:

# 定義一個數(shù)據(jù)類型為 tf.float32、“長”未知、“寬”為 2 的矩陣

Placeholder x = tf.placeholder(tf.float32, [None, 2])

# 定義一個 numpy 數(shù)組:[ [ 1 2 ], [ 3 4 ], [ 5 6 ] ]

y = np.array([[1, 2], [3, 4], [5, 6]])

# 定義 x + 1 對應(yīng)的 Tensor

z = x + 1

# 利用 Session 及其 feed_dict 參數(shù)、將 y 的值賦予給 x、同時輸出 z 的值 print(tf.Session().run(z, feed_dict={x: y}))

# 將會輸出 [ [ 2 3 ], [ 4 5 ], [ 6 7 ] ]

于是分 Batch 運算的實現(xiàn)步驟就很清晰了:

把計算損失所涉及的所有 x、y 定義為占位符

每次訓(xùn)練時,通過 feed_dict 參數(shù)、將原數(shù)據(jù)的一個小 Batch 賦予給 x、y

占位符還有許多其它有趣的應(yīng)用手段,它們的思想都是相通的:將未能確定的信息以 Placeholder 的形式進(jìn)行定義、在確實調(diào)用到的時候再賦予具體的數(shù)值

事實上,基本所有 Tensorflow 模型都要用到 Placeholder。雖然我們上面實現(xiàn)的 TFLinearSVM 沒有用到,但正因如此、它是存在巨大缺陷的(比如說,如果在同一段代碼中不斷地調(diào)用參數(shù) out_of_sess 為 True 的 predict 方法的話,會發(fā)現(xiàn)它的速度越來越慢。觀眾老爺們可以思考一下這是為什么 ( σ'ω')σ)

以上就是 Tensorflow 的一個簡要教程,雖然我是抱著“即使從來沒用過 Tensorflow 也能看懂”的心去寫的,但可能還是會有地方說得不夠詳細(xì);若果真如此,還愿不吝指出 ( σ'ω')σ

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 人工智能
    +關(guān)注

    關(guān)注

    1804

    文章

    48449

    瀏覽量

    245069
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    330

    瀏覽量

    60940

原文標(biāo)題:從零開始學(xué)人工智能(26)--Tensorflow · LinearSVM

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于 TensorFlow

    的底層數(shù)據(jù)操作,你也可以自己寫一點c++代碼來豐富底層的操作。真正的可移植性(Portability)Tensorflow 在CPU和GPU上運行,比如說可以運行在臺式、服務(wù)器、手機移動設(shè)備等等。想要
    發(fā)表于 03-30 19:57

    使用 TensorFlow, 你必須明白 TensorFlow

    () as sess:result = sess.run([product])print result在實現(xiàn)上, TensorFlow 將圖形定義轉(zhuǎn)換成分布執(zhí)行的操作, 以充分利用可用的計算資源(如
    發(fā)表于 03-30 20:03

    干貨 | TensorFlow的55個經(jīng)典案例

    導(dǎo)語:本文是TensorFlow實現(xiàn)流行機器學(xué)習(xí)算法的教程匯集,目標(biāo)是讓讀者可以輕松通過清晰簡明的案例深入了解 TensorFlow。這些案例適合那些想要實現(xiàn)一些
    發(fā)表于 10-09 11:28

    Tensorflow的非線性回歸

    Tensorflow線性回歸
    發(fā)表于 05-12 10:19

    TensorFlow如何入門

    TensorFlow 入門(四)
    發(fā)表于 05-27 17:40

    tensorflow怎么入門

    tensorflow入門(五)
    發(fā)表于 05-28 13:05

    情地使用Tensorflow吧!

    和GPU上運行,比如說可以運行在臺式、服務(wù)器、手機移動設(shè)備等等。想要在沒有特殊硬件的前提下,在你的筆記本上跑一下機器學(xué)習(xí)的新想法?Tensorflow可以辦到這點。準(zhǔn)備將你的訓(xùn)練模型在多個CPU上規(guī)模
    發(fā)表于 07-22 10:13

    TensorFlow是什么

    在多種平臺上工作,甚至是移動平臺和分布平臺。它受到所有云服務(wù)(AWS、Google和Azure)的支持。Keras——高級神經(jīng)網(wǎng)絡(luò) API,已經(jīng)與 TensorFlow 整合。與 Torch
    發(fā)表于 07-22 10:14

    TensorFlow XLA加速線性代數(shù)編譯器

    加速線性代數(shù)器(Accelerated linear algebra,XLA)是線性代數(shù)領(lǐng)域的專用編譯器。根據(jù) https://www.tensorflow.org/performance/xla
    發(fā)表于 07-28 14:31

    TensorFlow實現(xiàn)簡單線性回歸

    本小節(jié)直接從 TensorFlow contrib 數(shù)據(jù)集加載數(shù)據(jù)。使用隨機梯度下降優(yōu)化器優(yōu)化單個訓(xùn)練樣本的系數(shù)。實現(xiàn)簡單線性回歸的具體做法導(dǎo)入需要的所有軟件包: 在神經(jīng)網(wǎng)絡(luò)中,所有的輸入都
    發(fā)表于 08-11 19:34

    TensorFlow實現(xiàn)多元線性回歸(超詳細(xì))

    TensorFlow 實現(xiàn)簡單線性回歸的基礎(chǔ)上,可通過在權(quán)重和占位符的聲明中稍作修改來對相同的數(shù)據(jù)進(jìn)行多元線性回歸。在多元線性回歸的情況
    發(fā)表于 08-11 19:35

    TensorFlow發(fā)布語音識別入門教程助力初學(xué)者入門

    雖然有一些偉大的開源語音識別系統(tǒng),如Kaldi可以使用神經(jīng)網(wǎng)絡(luò)作為一個組件,但它們的復(fù)雜性,使得它們難以被用來作簡單任務(wù)的指南。 目前,找不到免費且公開的數(shù)據(jù)集及教程,讓初學(xué)者入門(許多需要
    發(fā)表于 09-22 16:47 ?2次下載

    TensorFlow架構(gòu)分析探討

    TensorFlow是什么? TensorFlow基于數(shù)據(jù)流圖,用于大規(guī)模分布數(shù)值計算的開源框架。節(jié)點表示某種抽象的計算,邊表示節(jié)點之間相互聯(lián)系的張量。 計算圖實例 TensorFlow
    發(fā)表于 09-30 14:29 ?0次下載
    <b class='flag-5'>TensorFlow</b>架構(gòu)分析探討

    tensorflow簡單的模型訓(xùn)練

    TensorFlow開始,然后介紹如何構(gòu)建和訓(xùn)練一個簡單的神經(jīng)網(wǎng)絡(luò)模型。 1. 安裝TensorFlow 首先,我們需要安裝TensorFlow。TensorFlow
    的頭像 發(fā)表于 07-05 09:38 ?1104次閱讀

    TensorFlow是什么?TensorFlow怎么用?

    術(shù)界和工業(yè)界都得到了廣泛的應(yīng)用。它不僅支持大規(guī)模的數(shù)據(jù)處理,還提供了自動微分、分布訓(xùn)練等高級功能,極大地簡化了深度學(xué)習(xí)任務(wù)的開發(fā)流程。
    的頭像 發(fā)表于 07-12 16:38 ?1092次閱讀