日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从 TensorFlow 入门机器学习

發(fā)布時間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从 TensorFlow 入门机器学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫在前面:緊跟時代步伐,開始學(xué)習(xí)機器學(xué)習(xí),抱著爭取在畢業(yè)之前多看看各個方向是什么樣子的心態(tài),發(fā)現(xiàn)這是一個很有潛力也很有趣的領(lǐng)域(keng)。// 然后就開始補數(shù)學(xué)了……

0 TensorFlow 介紹

剛剛?cè)腴T的小白,理解不深,直接看官方的介紹吧

GitHub Description: Computation using data flow graphs for scalable machine learning

官網(wǎng): 是一個使用數(shù)據(jù)流圖進行數(shù)值計算的開源軟件庫。圖中的節(jié)點代表數(shù)學(xué)運算, 而圖中的邊則代表在這些節(jié)點之間傳遞的多維數(shù)組(張量)。

0.1 什么是 TensorFlow ?

是張量的意思, 是流的意思。所以可以直接看做利用張量組成的數(shù)據(jù)流圖進行計算的一個開源庫。

0.2 TensorFlow 可以做什么 ?

目前主要是用于機器學(xué)習(xí),這樣說有點不親民,筆者理解是可以將數(shù)據(jù)轉(zhuǎn)化為向量描述并且構(gòu)建相應(yīng)的計算流圖都是可以使用的。 舉個例子吧,雖然不知道恰不恰當(dāng)。 比如我們在計算 時,可以構(gòu)建一個二叉樹

這棵二叉樹的中序遍歷就是上面的表達式,也就是說這個表達式可以轉(zhuǎn)化成一個形如二叉樹的圖,而 正好可以計算這個圖。下面給出代碼,看不懂沒關(guān)系,只要理解代碼流程是對圖(二叉樹)的計算就可以了,下一章會介紹如何使用。

# coding: utf-8 import tensorflow as tfa, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4) add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d) with tf.Session() as sess:print(sess.run(sub)) # output: # 5 復(fù)制代碼

0.3 TensorFlow 安裝

這里就不做詳細介紹了,相信點開這篇文章的你應(yīng)該有了運行環(huán)境。如果沒有這里推薦兩個網(wǎng)站英文:官網(wǎng) 和 中文:**學(xué)院翻譯 然后介紹一下我的環(huán)境:

注意 設(shè)置為 才能跑 。如果不會可以多看看網(wǎng)上的教程,能對虛擬環(huán)境加深了解。

1 初識 TensorFlow

好了,有前面的介紹,你應(yīng)該有能夠使用 的環(huán)境了,下面開始介紹如何編碼。

1.1 基礎(chǔ)語法

其實說語法是不準確的,語法就是 的語法(這里使用 Python),主要是介紹調(diào)用這個計算庫來實現(xiàn)這個特殊的計算。同樣擺上官網(wǎng)教程

1.1.1 計算單元介紹

可以看到在計算圖中,有兩個主要的內(nèi)容是點(葉子和非葉子節(jié)點)和線。我的理解是點代表數(shù)據(jù),線代表操作。不知道對不對,不過下面就按照這樣思路介紹了。 下面開始介紹有哪些常用的“點”:

常量

c = tf.constant(2) 復(fù)制代碼

變量

v = tf.Variable(2) 復(fù)制代碼

占位符

p = tf.placeholder(tf.float32) 復(fù)制代碼

以上代碼都是以最小能用原則傳的參,感興趣的可以去看看源碼,這里主要是往 語法上拉,先使用起來再以后自己深究為什么要設(shè)計成這樣的數(shù)據(jù)結(jié)構(gòu)對計算圖是必須的。

接下來就是有哪些“線”:

四則運算

add = tf.add(a, b) sub = tf.subtract(a, b) mul = tf.multiply(a, b) div = tf.divide(a, b) 復(fù)制代碼

其他的就不再介紹了,詳情可看 的源碼。比如以上的操作定義在 。

1.1.2 計算流程介紹

知道了常見數(shù)據(jù)和計算方法下面介紹計算流程:

# coding: utf-8 import tensorflow as tf# Step1: 創(chuàng)建數(shù)據(jù) a, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4)# Step2: 構(gòu)造計算圖 add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d)# Step3: 進行計算 with tf.Session() as sess:print(sess.run(sub)) 復(fù)制代碼

上面這個例子是一個標準的常量計算過程,你可以試著 print(a, add) 看看你創(chuàng)建的是個什么東西,你會發(fā)現(xiàn)他是一個 而且里面的值是 。可以猜測,這里只打印不計算,看 源碼:

# ops.py def __repr__(self):return "<tf.Tensor '%s' shape=%s dtype=%s>" % (self.name, self.get_shape(),self._dtype.name)@property def name(self):"""The string name of this tensor."""if not self._op.name:raise ValueError("Operation was not named: %s" % self._op)return "%s:%d" % (self._op.name, self._value_index) 復(fù)制代碼

學(xué)會了計算常量,變量是不是也一樣?如果你試過就知道是不一樣的,變量需要初始化操作。

v = tf.Variable(2) with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(v, sess.run(v)) 復(fù)制代碼

到這里可能會疑問,那變量和常量有什么區(qū)別?從字面意思可以知道變量應(yīng)該是可變的,方便我們在計算過程中隨時調(diào)整參數(shù),下面通過一段代碼介紹如何使用。

v = tf.Variable(2) # 將 v 的值自乘 2 update = tf.assign(v, tf.multiply(v, tf.constant(2))) with tf.Session() as sess:sess.run(tf.global_variables_initializer())for _ in range(4):print("-----------------------")print "Before : ", sess.run(v)sess.run(update)print "After : ", sess.run(v)# output: # ----------------------- # Before : 2 # After : 4 # ----------------------- # Before : 4 # After : 8 # ----------------------- # Before : 8 # After : 16 # ----------------------- # Before : 16 # After : 32 復(fù)制代碼

但是如果我們不想每次都設(shè)置-更新-計算-更新-計算……而是直接把數(shù)據(jù)寫入計算,那占位符就起作用了。同樣舉個小例子。

c = tf.constant(2) # 注意類型一致,這里是 tf.int32 p = tf.placeholder(tf.int32) mul = tf.multiply(c, p) with tf.Session() as sess:# tmp = 2 相當(dāng)于上一個例子變量的初始值是 2tmp = 2;for _ in range(4):# 直接填充 feed_dicttmp = sess.run(mul, feed_dict={p:tmp})print tmp# output: # 4 # 8 # 16 # 32 復(fù)制代碼

下面總結(jié)下計算過程:

  • 創(chuàng)建數(shù)據(jù):可以創(chuàng)建常量、變量和占位符。
  • 構(gòu)建圖:通過前面的數(shù)據(jù)構(gòu)建一張圖。
  • 初始化:把變量初始化。
  • 計算:必須通過開啟一個 Session 來計算圖

1.2 可視化

提供了一個可視化工具——,下面開始介紹如何使用。

這里對上面二叉樹的例子進行可視化處理。

# coding: utf-8 import tensorflow as tfa, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4) add = tf.add(a,b) mul = tf.multiply(add, c) sub = tf.subtract(mul, d) with tf.Session() as sess:writer = tf.summary.FileWriter('./graphs', sess.graph)print(sess.run(sub)) writer.close() 復(fù)制代碼

然后使用命令行到存儲 graphs 的文件夾下執(zhí)行 tensorboard --logdir="./graphs" 命令,然后按照提示在瀏覽器中打開 http://localhost:6006 如果成功顯示 界面就說明成功了。

2 利用 TensorFlow 進行機器學(xué)習(xí)

這里也算是機器學(xué)習(xí)的入門介紹吧。直接介紹機器學(xué)習(xí)相關(guān)知識可能不太現(xiàn)實,而且筆者也是在學(xué)習(xí)階段,所以舉一些小例子來體會機器學(xué)習(xí)的過程吧。

2.1 線性回歸

這里我們使用最熟悉的線性回歸來體會一下機器學(xué)習(xí)的過程:

2.1.1 準備數(shù)據(jù)

這里很簡單,就是模擬一個線性回歸,所以我們直接自己擬定一些數(shù)據(jù)好預(yù)測結(jié)果和自己設(shè)想的是否一致。

train_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7]) train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9]) 復(fù)制代碼

2.1.2 構(gòu)建模型

我們采用占位符的形式進行計算,在運算時直接導(dǎo)入數(shù)據(jù)便可。 這里因為我們采用線性回歸,所以目標函數(shù)是形如 的形式的一次函數(shù)。也就是說,我們通過給出的點去擬合一條比較符合這些點分布的直線。

X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32)W = tf.Variable(-1., name="weight") b = tf.Variable(-1., name="bias")# linear model # activation = X*W + b activation = tf.add(tf.multiply(X, W), b) 復(fù)制代碼

2.1.3 參數(shù)評估

我們采用每個點給出的縱坐標和線性模型算出的縱坐標的差的平方和作為損失函數(shù),在訓(xùn)練中采用梯度下降算法盡量使和最小,學(xué)利率選擇 。其中的數(shù)學(xué)原理這里就不介紹了,以后會寫關(guān)于機器學(xué)習(xí)算法的相關(guān)文章。 一般選取損失函數(shù)和通過某些最優(yōu)化手段更新權(quán)重是這里的一大難點,如果要知道原理,需要學(xué)習(xí)大量數(shù)學(xué)基礎(chǔ)知識(概率論,線性代數(shù),微積分……)。

learning_rate = 0.01cost = tf.reduce_sum(tf.pow(activation - Y, 2)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 復(fù)制代碼

2.1.4 訓(xùn)練數(shù)據(jù)

這里就是取數(shù)據(jù),喂給圖中的輸入節(jié)點,然后模型會自己進行優(yōu)化,可以將數(shù)據(jù)多次迭代使得擬合函數(shù)能夠更好的適應(yīng)這些數(shù)據(jù)點。

training_epochs = 2000 display_step = 100with tf.Session() as sess:sess.run(tf.global_variables_initializer())for epoch in range(training_epochs):for (x, y) in zip(train_X, train_Y):sess.run(optimizer, feed_dict={X: x, Y: y})if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=","{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",sess.run(b))print("Optimization Finished!")print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b)) 復(fù)制代碼

2.1.5 可視化

可以直接繪制二維圖形看結(jié)果。不熟悉的可以參考Matplotlib 教程

writer = tf.summary.FileWriter('./graphs', sess.graph)plt.scatter(train_X, train_Y, color='red', label='Original data')plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')plt.show() writer.close() 復(fù)制代碼

二維圖:

數(shù)據(jù)流圖:

2.1.6 小結(jié)

其實整個過程如果不深究其中的原理,還是很好理解的,無非就是提供數(shù)據(jù)-選取擬合函數(shù)-構(gòu)建圖-選取損失函數(shù)-最優(yōu)化-訓(xùn)練數(shù)據(jù)(更新權(quán)重)-得出結(jié)論。這個過程符合我們對線性回歸這個問題解決的基本思路的預(yù)期。當(dāng)然,筆者認為這只是開始,要想深入,學(xué)習(xí)必要的數(shù)學(xué)知識是機器學(xué)習(xí)的必經(jīng)之路。

這里可以參考TensorFlow 入門 整體代碼:

# coding: utf-8 from __future__ import print_function import tensorflow as tf import numpy import matplotlib.pyplot as plttrain_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7]) train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9])X = tf.placeholder(tf.float32) Y = tf.placeholder(tf.float32)W = tf.Variable(-1., name="weight") b = tf.Variable(-1., name="bias")activation = tf.add(tf.multiply(X, W), b)learning_rate = 0.01cost = tf.reduce_sum(tf.pow(activation - Y, 2)) optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)training_epochs = 2000 display_step = 100with tf.Session() as sess:sess.run(tf.global_variables_initializer())for epoch in range(training_epochs):for (x, y) in zip(train_X, train_Y):sess.run(optimizer, feed_dict={X: x, Y: y})if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=","{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",sess.run(b))print("Optimization Finished!")print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))writer = tf.summary.FileWriter('./graphs', sess.graph)plt.scatter(train_X, train_Y, color='red', label='Original data')plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')plt.show() writer.close()# output: # Epoch: 0001 cost= 0.785177052 W= 1.07263 b= -0.448403 # Epoch: 0101 cost= 0.440001398 W= 1.02555 b= -0.0137608 # Epoch: 0201 cost= 0.437495589 W= 1.02078 b= 0.0176154 # Epoch: 0301 cost= 0.437433660 W= 1.02043 b= 0.0199056 # Epoch: 0401 cost= 0.437430561 W= 1.02041 b= 0.0200727 # Epoch: 0501 cost= 0.437429130 W= 1.0204 b= 0.0200851 # Epoch: 0601 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0701 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0801 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 0901 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1001 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1101 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1201 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1301 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1401 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1501 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1601 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1701 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1801 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Epoch: 1901 cost= 0.437429696 W= 1.0204 b= 0.0200854 # Optimization Finished! # cost= 0.43743 W= 1.0204 b= 0.0200854 # 可以看到迭代次數(shù)到 500 次左右數(shù)據(jù)就穩(wěn)定了。 復(fù)制代碼

3 總結(jié)

其實這只是一個開始,還有好多好多東西要去學(xué)習(xí)。越來越覺得基礎(chǔ)的重要性,不僅僅是計算機基礎(chǔ),數(shù)學(xué)基礎(chǔ)也是同等重要,特別是未來的物聯(lián)網(wǎng)趨勢,可能編碼這種專業(yè)越來越淡化,只是作為某些專業(yè)人員的一種工具/技能使用。馬上面臨畢業(yè),只能自己慢慢啃這些東西了……

4 參考資料

  • 0. 官網(wǎng)
  • 1. 中文:**學(xué)院翻譯
  • 2. Matplotlib 教程
  • 3. TensorFlow 入門

總結(jié)

以上是生活随笔為你收集整理的从 TensorFlow 入门机器学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。