先回顧鳶尾花資料集,其提供了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 移動裝置 ...