中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在python中使用Tensorflow訓練BP神經網絡

發布時間:2021-05-12 15:56:57 來源:億速云 閱讀:621 作者:Leah 欄目:開發技術

如何在python中使用Tensorflow訓練BP神經網絡?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

使用軟件

Python 3.8,Tensorflow2.0

問題描述

鳶尾花主要分為狗尾草鳶尾(0)、雜色鳶尾(1)、弗吉尼亞鳶尾(2)。
人們發現通過計算鳶尾花的花萼長、花萼寬、花瓣長、花瓣寬可以將鳶尾花分類。
所以只要給出足夠多的鳶尾花花萼、花瓣數據,以及對應種類,使用合適的神經網絡訓練,就可以實現鳶尾花分類。

搭建神經網絡

輸入數據是花萼長、花萼寬、花瓣長、花瓣寬,是n行四列的矩陣。
而輸出的是每個種類的概率,是n行三列的矩陣。
我們采用BP神經網絡,設X為輸入數據,Y為輸出數據,W為權重,B偏置。有

y=x?w+b

因為x為n行四列的矩陣,y為n行三列的矩陣,所以w必須為四行三列的矩陣,每個神經元對應一個b,所以b為一行三列的的矩陣。
神經網絡如下圖。

如何在python中使用Tensorflow訓練BP神經網絡

所以,只要找到合適的w和b,就能準確判斷鳶尾花的種類。
下面就開始對這兩個參數進行訓練。

訓練參數

損失函數

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

如何在python中使用Tensorflow訓練BP神經網絡

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

如何在python中使用Tensorflow訓練BP神經網絡

其中a為學習率,即梯度下降的步長,如果a太大,就可能錯過最優值,如果a太小,則就需要更多步才能找到最優值。所以選擇合適的學習率很關鍵。

如何在python中使用Tensorflow訓練BP神經網絡

參數優化

通過反向傳播來優化參數。
反向傳播:從后向前,逐層求損失函數對每層神經元參數的偏導數,迭代更新所有參數。
比如

如何在python中使用Tensorflow訓練BP神經網絡

如何在python中使用Tensorflow訓練BP神經網絡

可以看到w會逐漸趨向于loss的最小值0。
以上就是我們訓練的全部關鍵點。

代碼

數據集

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

# 導入數據,分別為輸入特征和標簽
x_data = datasets.load_iris().data ## 存花萼、花瓣特征數據
y_data = datasets.load_iris().target # 存對應種類
# 隨機打亂數據(因為原始數據是順序的,順序不打亂會影響準確率)
# seed: 隨機數種子,是一個整數,當設置之后,每次生成的隨機數都一樣(為方便教學,以保每位同學結果一致)
np.random.seed(116)  # 使用相同的seed,保證輸入特征和標簽一一對應
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)
# 將打亂后的數據集分割為訓練集和測試集,訓練集為前120行,測試集為后30行
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]
# 轉換x的數據類型,否則后面矩陣相乘時會因數據類型不一致報錯
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)
# from_tensor_slices函數使輸入特征和標簽值一一對應。(把數據集分批次,每個批次batch組數據)
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)

參數

# 生成神經網絡的參數,4個輸入特征故,輸入層為4個輸入節點;因為3分類,故輸出層為3個神經元
# 用tf.Variable()標記參數可訓練
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

訓練

a = 0.1  # 學習率為0.1
epoch = 500  # 循環500輪
# 訓練部分
for epoch in range(epoch):  # 數據集級別的循環,每個epoch循環一次數據集
    for step, (x_train, y_train) in enumerate(train_db):  # batch級別的循環 ,每個step循環一個batch
        with tf.GradientTape() as tape:  # with結構記錄梯度信息
            y = tf.matmul(x_train, w1) + b1  # 神經網絡乘加運算
            y = tf.nn.softmax(y)  # 使輸出y符合概率分布
            y_ = tf.one_hot(y_train, depth=3)  # 將標簽值轉換為獨熱碼格式,方便計算loss
            loss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方誤差損失函數mse = mean(sum(y-y*)^2)
        # 計算loss對w, b的梯度
        grads = tape.gradient(loss, [w1, b1])
        # 實現梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_grad
        w1.assign_sub(a * grads[0])  # 參數w1自更新
        b1.assign_sub(a * grads[1])  # 參數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中最大值的索引,即預測的分類
    # 將predict轉換為y_test的數據類型
    predict = tf.cast(predict, dtype=y_test.dtype)
    # 若分類正確,則correct=1,否則為0,將bool型的結果轉換為int型
    correct = tf.cast(tf.equal(predict, y_test), dtype=tf.int32)
    # 將每個batch的correct數加起來
    correct = tf.reduce_sum(correct)
    # 將所有batch中的correct數加起來
    total_correct += int(correct)
    # total_number為測試的總樣本數,也就是x_test的行數,shape[0]返回變量的行數
    total_number += x_test.shape[0]
# 總的準確率等于total_correct/total_number
acc = total_correct / total_number
print("測試準確率 = %.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中最大值的索引,即預測的分類
print("該鳶尾花為:" + species.get(predict))

結果:

如何在python中使用Tensorflow訓練BP神經網絡

Python的優點有哪些

1、簡單易用,與C/C++、Java、C# 等傳統語言相比,Python對代碼格式的要求沒有那么嚴格;2、Python屬于開源的,所有人都可以看到源代碼,并且可以被移植在許多平臺上使用;3、Python面向對象,能夠支持面向過程編程,也支持面向對象編程;4、Python是一種解釋性語言,Python寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序;5、Python功能強大,擁有的模塊眾多,基本能夠實現所有的常見功能。

關于如何在python中使用Tensorflow訓練BP神經網絡問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天峨县| 临湘市| 汤阴县| 石台县| 海安县| 花莲县| 鄂州市| 隆德县| 绩溪县| 恩施市| 石柱| 惠来县| 沂源县| 习水县| 新疆| 嘉祥县| 宁乡县| 监利县| 陆川县| 长垣县| 鄱阳县| 晋城| 鄂温| 博罗县| 正镶白旗| 忻州市| 屏东市| 广元市| 望江县| 阿城市| 雷波县| 肇东市| 施秉县| 苏尼特右旗| 临海市| 太保市| 淳安县| 阳春市| 达孜县| SHOW| 阜城县|