最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類

 更新時間:2021年05月12日 12:02:25   作者:你,好  
這篇文章主要介紹了python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類,幫助大家更好的利用python進(jìn)行深度學(xué)習(xí),感興趣的朋友可以了解下

Hello,兄弟們,開始搞深度學(xué)習(xí)了,今天出第一篇博客,小白一枚,如果發(fā)現(xiàn)錯誤請及時指正,萬分感謝。

使用軟件

Python 3.8,Tensorflow2.0

問題描述

鳶尾花主要分為狗尾草鳶尾(0)、雜色鳶尾(1)、弗吉尼亞鳶尾(2)。
人們發(fā)現(xiàn)通過計(jì)算鳶尾花的花萼長、花萼寬、花瓣長、花瓣寬可以將鳶尾花分類。
所以只要給出足夠多的鳶尾花花萼、花瓣數(shù)據(jù),以及對應(yīng)種類,使用合適的神經(jīng)網(wǎng)絡(luò)訓(xùn)練,就可以實(shí)現(xiàn)鳶尾花分類。

搭建神經(jīng)網(wǎng)絡(luò)

輸入數(shù)據(jù)是花萼長、花萼寬、花瓣長、花瓣寬,是n行四列的矩陣。
而輸出的是每個種類的概率,是n行三列的矩陣。
我們采用BP神經(jīng)網(wǎng)絡(luò),設(shè)X為輸入數(shù)據(jù),Y為輸出數(shù)據(jù),W為權(quán)重,B偏置。有

y=x∗w+b

因?yàn)閤為n行四列的矩陣,y為n行三列的矩陣,所以w必須為四行三列的矩陣,每個神經(jīng)元對應(yīng)一個b,所以b為一行三列的的矩陣。
神經(jīng)網(wǎng)絡(luò)如下圖。

所以,只要找到合適的w和b,就能準(zhǔn)確判斷鳶尾花的種類。
下面就開始對這兩個參數(shù)進(jìn)行訓(xùn)練。

訓(xùn)練參數(shù)

損失函數(shù)

損失函數(shù)表達(dá)的是預(yù)測值(y*)和真實(shí)值(y)的差距,我們采用均方誤差公式作為損失函數(shù)。

損失函數(shù)值越小,說明預(yù)測值和真實(shí)值越接近,w和b就越合適。
如果人來一組一組試,那肯定是不行的。所以我們采用梯度下降算法來找到損失函數(shù)最小值。
梯度:對函數(shù)求偏導(dǎo)的向量。梯度下降的方向就是函數(shù)減少的方向。

其中a為學(xué)習(xí)率,即梯度下降的步長,如果a太大,就可能錯過最優(yōu)值,如果a太小,則就需要更多步才能找到最優(yōu)值。所以選擇合適的學(xué)習(xí)率很關(guān)鍵。

參數(shù)優(yōu)化

通過反向傳播來優(yōu)化參數(shù)。
反向傳播:從后向前,逐層求損失函數(shù)對每層神經(jīng)元參數(shù)的偏導(dǎo)數(shù),迭代更新所有參數(shù)。
比如

可以看到w會逐漸趨向于loss的最小值0。
以上就是我們訓(xùn)練的全部關(guān)鍵點(diǎn)。

代碼

數(shù)據(jù)集

我們使用sklearn包提供的鳶尾花數(shù)據(jù)集。共150組數(shù)據(jù)。
打亂保證數(shù)據(jù)的隨機(jī)性,取前120個為訓(xùn)練集,后30個為測試集。

# 導(dǎo)入數(shù)據(jù),分別為輸入特征和標(biāo)簽
x_data = datasets.load_iris().data ## 存花萼、花瓣特征數(shù)據(jù)
y_data = datasets.load_iris().target # 存對應(yīng)種類
# 隨機(jī)打亂數(shù)據(jù)(因?yàn)樵紨?shù)據(jù)是順序的,順序不打亂會影響準(zhǔn)確率)
# seed: 隨機(jī)數(shù)種子,是一個整數(shù),當(dāng)設(shè)置之后,每次生成的隨機(jī)數(shù)都一樣(為方便教學(xué),以保每位同學(xué)結(jié)果一致)
np.random.seed(116)  # 使用相同的seed,保證輸入特征和標(biāo)簽一一對應(yīng)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)
# 將打亂后的數(shù)據(jù)集分割為訓(xùn)練集和測試集,訓(xùn)練集為前120行,測試集為后30行
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]
# 轉(zhuǎn)換x的數(shù)據(jù)類型,否則后面矩陣相乘時會因數(shù)據(jù)類型不一致報(bào)錯
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)
# from_tensor_slices函數(shù)使輸入特征和標(biāo)簽值一一對應(yīng)。(把數(shù)據(jù)集分批次,每個批次batch組數(shù)據(jù))
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

參數(shù)

# 生成神經(jīng)網(wǎng)絡(luò)的參數(shù),4個輸入特征故,輸入層為4個輸入節(jié)點(diǎn);因?yàn)?分類,故輸出層為3個神經(jīng)元
# 用tf.Variable()標(biāo)記參數(shù)可訓(xùn)練
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1)) # 四行三列,方差為0.1
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1)) # 一行三列,方差為0.1

訓(xùn)練

a = 0.1  # 學(xué)習(xí)率為0.1
epoch = 500  # 循環(huán)500輪
# 訓(xùn)練部分
for epoch in range(epoch):  # 數(shù)據(jù)集級別的循環(huán),每個epoch循環(huán)一次數(shù)據(jù)集
    for step, (x_train, y_train) in enumerate(train_db):  # batch級別的循環(huán) ,每個step循環(huán)一個batch
        with tf.GradientTape() as tape:  # with結(jié)構(gòu)記錄梯度信息
            y = tf.matmul(x_train, w1) + b1  # 神經(jīng)網(wǎng)絡(luò)乘加運(yùn)算
            y = tf.nn.softmax(y)  # 使輸出y符合概率分布
            y_ = tf.one_hot(y_train, depth=3)  # 將標(biāo)簽值轉(zhuǎn)換為獨(dú)熱碼格式,方便計(jì)算loss
            loss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方誤差損失函數(shù)mse = mean(sum(y-y*)^2)
        # 計(jì)算loss對w, b的梯度
        grads = tape.gradient(loss, [w1, b1])
        # 實(shí)現(xiàn)梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_grad
        w1.assign_sub(a * grads[0])  # 參數(shù)w1自更新
        b1.assign_sub(a * grads[1])  # 參數(shù)b自更新

測試

# 測試部分
total_correct, total_number = 0, 0
for x_test, y_test in test_db:
    # 前向傳播求概率
    y = tf.matmul(x_test, w1) + b1
    y = tf.nn.softmax(y)
    predict = tf.argmax(y, axis=1)  # 返回y中最大值的索引,即預(yù)測的分類
    # 將predict轉(zhuǎn)換為y_test的數(shù)據(jù)類型
    predict = tf.cast(predict, dtype=y_test.dtype)
    # 若分類正確,則correct=1,否則為0,將bool型的結(jié)果轉(zhuǎn)換為int型
    correct = tf.cast(tf.equal(predict, y_test), dtype=tf.int32)
    # 將每個batch的correct數(shù)加起來
    correct = tf.reduce_sum(correct)
    # 將所有batch中的correct數(shù)加起來
    total_correct += int(correct)
    # total_number為測試的總樣本數(shù),也就是x_test的行數(shù),shape[0]返回變量的行數(shù)
    total_number += x_test.shape[0]
# 總的準(zhǔn)確率等于total_correct/total_number
acc = total_correct / total_number
print("測試準(zhǔn)確率 = %.2f %%" % (acc * 100.0))
my_test = np.array([[5.9, 3.0, 5.1, 1.8]])
print("輸入 5.9  3.0  5.1  1.8")
my_test = tf.convert_to_tensor(my_test)
my_test = tf.cast(my_test, tf.float32)
y = tf.matmul(my_test, w1) + b1
y = tf.nn.softmax(y)
species = {0: "狗尾鳶尾", 1: "雜色鳶尾", 2: "弗吉尼亞鳶尾"}
predict = np.array(tf.argmax(y, axis=1))[0]  # 返回y中最大值的索引,即預(yù)測的分類
print("該鳶尾花為:" + species.get(predict))

結(jié)果:

結(jié)語

以上就是全部內(nèi)容,鳶尾花分類作為經(jīng)典案例,應(yīng)該重點(diǎn)掌握理解。有一起學(xué)習(xí)的伙伴可以把想法打在評論區(qū),大家多多交流,我也會及時回復(fù)的!

以上就是python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類的詳細(xì)內(nèi)容,更多關(guān)于python 訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 夯實(shí)基礎(chǔ)Python列表的索引和切片使用示例

    夯實(shí)基礎(chǔ)Python列表的索引和切片使用示例

    這篇文章主要為大家介紹了Python列表的索引和切片使用示例基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python使用正則表達(dá)式實(shí)現(xiàn)爬蟲數(shù)據(jù)抽取

    Python使用正則表達(dá)式實(shí)現(xiàn)爬蟲數(shù)據(jù)抽取

    這篇文章主要介紹了Python使用正則表達(dá)式實(shí)現(xiàn)爬蟲數(shù)據(jù)抽取,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 基于PyQt6編寫一個串口調(diào)試助手

    基于PyQt6編寫一個串口調(diào)試助手

    這篇文章主要為大家詳細(xì)介紹了如何基于PyQt6編寫一個串口調(diào)試助手,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 基于Tensorflow的MNIST手寫數(shù)字識別分類

    基于Tensorflow的MNIST手寫數(shù)字識別分類

    這篇文章主要為大家詳細(xì)介紹了基于Tensorflow的MNIST手寫數(shù)字識別分類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Python下線程之間的共享和釋放示例

    Python下線程之間的共享和釋放示例

    這篇文章主要用示例簡單介紹了Python下線程之間的共享和釋放,線程一直是Python開發(fā)者中的熱點(diǎn)問題,需要的朋友可以參考下
    2015-05-05
  • python實(shí)現(xiàn)邏輯回歸的方法示例

    python實(shí)現(xiàn)邏輯回歸的方法示例

    這篇文章主要介紹了python實(shí)現(xiàn)邏輯回歸的方法示例,這是機(jī)器學(xué)習(xí)課程的一個實(shí)驗(yàn),整理出來共享給大家,需要的朋友可以參考學(xué)習(xí),下來要一起看看吧。
    2017-05-05
  • Python?watchdog靈活監(jiān)控文件和目錄的變化

    Python?watchdog靈活監(jiān)控文件和目錄的變化

    Python?Watchdog是一個強(qiáng)大的Python庫,它提供了簡單而靈活的方式來監(jiān)控文件系統(tǒng)的變化,本文將詳細(xì)介紹Python?Watchdog的用法和功能,包括安裝、基本用法、事件處理以及實(shí)際應(yīng)用場景,并提供豐富的示例代碼
    2024-01-01
  • Python中if有多個條件處理方法

    Python中if有多個條件處理方法

    在本篇文章里小編給大家整理的是一篇關(guān)于Python中if有多個條件處理方法,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • 一篇文章弄懂Python中的內(nèi)建函數(shù)

    一篇文章弄懂Python中的內(nèi)建函數(shù)

    Python學(xué)習(xí),內(nèi)建函數(shù)是你必須要掌握的一部分,下面這篇文章主要給大家介紹了關(guān)于Python中內(nèi)建函數(shù)的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • 用python寫一個福字(附完整代碼)

    用python寫一個福字(附完整代碼)

    大家好,本篇文章主要講的是用python寫一個福字(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論

江永县| 连云港市| 无棣县| 介休市| 鹤岗市| 台湾省| 西吉县| 黑水县| 稷山县| 开江县| 紫云| 兴义市| 永安市| 蚌埠市| 盐池县| 轮台县| 大安市| 兴文县| 勐海县| 安徽省| 辰溪县| 临邑县| 定边县| 称多县| 新乡县| 达日县| 张家港市| 巨鹿县| 喀喇沁旗| 蒙自县| 怀集县| 澜沧| 惠州市| 萨嘎县| 石狮市| 老河口市| 吴堡县| 宝应县| 西峡县| 河池市| 星子县|