TensorFlow2 0程式實現鳶尾花資料集分類

2021-10-05 23:16:49 字數 3750 閱讀 7381

先回顧鳶尾花資料集,其提供了150組鳶尾花資料,每組包括鳶尾花的花萼長、花萼寬、花瓣長、花瓣寬 4個輸入特徵,同時還給出了這一組特徵對應的鳶尾花類別。類別包括狗尾鳶尾、雜色鳶尾、維吉尼亞鳶尾三類, 分別用數字0、1、2表示。使用此資料集**如下:

from sklearn.datasets import load_iris

x_data = datasets.load_iris(

).data # 返回iris資料集所有輸入特徵

y_data = datasets.load_iris(

).target # 返回iris資料集所有標籤

即從sklearn包中匯出資料集,將輸入特徵賦值給x_data變數,將對應標籤賦值給y_data變數。

我們用神經網路實現鳶尾花分類僅需要三步:

(1)準備資料,包括資料集讀入、資料集亂序,把訓練集和測試集中的資料配成輸入特徵和標籤對,生成train和test即永不相見的訓練集和測試集;

(2)搭建網路,定義神經網路中的所有可訓練引數;

(3)優化這些可訓練的引數,利用巢狀迴圈在with結構中求得損失函式loss對每個可訓練引數的偏導數,更改這些可訓練引數,為了檢視效果,程式中可以加入每遍歷一次資料集顯示當前準確率,還可以畫出準確率acc和損失函式loss的變化曲線圖。以上部分的完整**與解析如下:

(1) 資料集讀入:

from sklearn.datasets import datasets

x_data = datasets.load_iris(

).data # 返回iris資料集所有輸入特徵

y_data = datasets.load_iris(

).target # 返回iris資料集所有標籤

(2) 資料集亂序:
np.random.seed(

116)

# 使用相同的seed,使輸入特徵/標籤一一對應

np.random.shuffle(x_data)

np.random.seed(

116)

np.random.shuffle(y_data)

tf.random.set_seed(

116)

(3) 資料集分割成永不相見的訓練集和測試集:
x_train = x_data[:-

30]y_train = y_data[:-

30]x_test = x_data[-30

:]y_test = y_data[-30

:]

(4) 配成[輸入特徵,標籤]對,每次餵入一小撮(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)

上述四小部分**實現了資料集讀入、資料集亂序、將資料集分割成永不相見的訓練集和測試集、將資料配成[輸入特徵,標籤]對。人類在認識這個世界的時候 資訊是沒有規律的,雜亂無章的湧入大腦的,所以餵入神經網路的資料集也需要被打亂順序。

(2)部分實現了讓資料集亂序,因為使用了同樣的隨機種子,所以打亂順序後輸入特徵和標籤仍然是一一對應的。

(3)部分將打亂後的前120個資料取出來作為訓練集,後30個資料作為測試集,為了公正評判神經網路的效果,訓練集和測試集沒有交集。

(4)部分使用from_tensor_slices把訓練集的輸入特徵和標籤配對打包,將每32組輸入特徵標籤對打包為乙個batch,在餵入神經網路時會以batch為單位餵入。

(5) 定義神經網路中所有可訓練引數:

w1 = tf.variable(tf.random.truncated_normal([4

,3], stddev=

0.1, seed=1)

)b1 = tf.variable(tf.random.truncated_normal([3

], stddev=

0.1, seed=1)

)

(6) 巢狀迴圈迭代,with結構更新引數,顯示當前loss:
for epoch in

range

(epoch)

:#資料集級別迭代

for step,

(x_train, y_train)

inenumerate

(train_db)

:#batch級別迭代

with tf.gradienttape(

)as tape:

# 記錄梯度資訊

(前向傳播過程計算y)

(計算總loss)

grads = tape.gradient(loss,

[ w1, b1 ]

)w1.assign_sub(lr * grads[0]

)#引數自更新

b1.assign_sub(lr * grads[1]

)print

("epoch {}, loss: {}"

.format

(epoch, loss_all/4)

)

(7) 計算當前引數前向傳播後的準確率,顯示當前準確率acc:
for x_test, y_test in test_db:

y = tf.matmul(h, w)

+ b # y為**結果

y = tf.nn.softmax(y)

# y符合概率分布

pred = tf.argmax(y, axis=1)

# 返回y中最大值的索引即**的分類

pred = tf.cast(pred, dtype=y_test.dtype)

# 調整資料型別與標籤一致

correct = tf.cast(tf.equal(pred, y_test)

, dtype=tf.int32)

correct = tf.reduce_sum (correct)

# 將每個batch的correct數加起來

total_correct +=

int(correct)

# 將所有batch中的correct數加起來 total_number += x_test.shape [0]

acc = total_correct / total_number

print

("test_acc:"

, acc)

(8) acc / loss視覺化:
plt.title(acc curve)

# 標題

plt.xlabel(epoch)

# x軸名稱

plt.ylabel(acc)

# y軸名稱

plt.plot(test_acc, label=

"$accuracy$"

)# 逐點畫出test_acc值並連線

tensorflow2 0視訊記憶體設定

遇到乙個問題 新買顯示卡視訊記憶體8g但是tensorflow執行的時候介面顯示只有約6.3g的視訊記憶體可用,如下圖 即限制了我的視訊記憶體,具體原因為什麼我也不知道,但原來的視訊記憶體小一些的顯示卡就沒有這個問題。目前的解決辦法是 官方文件解決 然後對應的中文部落格 總結一下,就是下面的兩個辦法...

Tensorflow2 0 啟用函式

常用啟用函式及對應特點 神經網路結構的輸出為所有輸入的加權和,這導致整個神經網路是乙個線性模型。而線性模型不能解決異或問題,且面對多分類問題,也顯得束手無策。所以為了解決非線性的分類或回歸問題,啟用函式必須是非線性函式。神經網路中啟用函式的主要作用是提供網路的非線性建模能力。這是因為反向傳播演算法就...

初步了解TensorFlow2 0

為什麼要學習tensorflow?深度學習能夠更好地抽取資料中的規律,從而給公司帶來更大的價值 tensorflow是強大且靈活的開源框架 使用廣泛 2.0更加強大 易用 成熟 tensorflow是什麼?是google的開源軟體庫 採用資料流圖,用於數值計算 支援多平台 gpu cpu 移動裝置 ...