神經網路實現鳶尾花分類
課程講解連結
神經網路實現鳶尾花分類僅需三步:
√準備資料
資料集讀入
資料集亂序
生成訓練集、測試集
配成對(輸入特徵、標籤),每次讀入一小撮batch
√搭建網路
定義神經網路中所有可訓練引數
√引數優化
巢狀迴圈迭代,with結構中求得損失函式loss對每個可訓練引數的偏導數,更新可訓練引數,顯示當前loss
鳶尾花分類程式碼:
準備資料
# -*- coding: UTF-8 -*-
# 利用鳶尾花資料集,實現前向傳播、反向傳播,視覺化loss曲線
# 匯入所需模組
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np
# 匯入資料,分別為輸入特徵和標籤
x_data = datasets.load_iris().data #引入iris鳶尾花資料,iris資料包含4個特徵變數
y_data = datasets.load_iris().target #4個標籤
#print(x_data)
#print(y_data)
# 隨機打亂資料(因為原始資料是順序的,順序不打亂會影響準確率)
# seed: 隨機數種子,是一個整數,當設定之後,每次生成的隨機數都一樣(為方便教學,以保每位同學結果一致)
np.random.seed(116) # 使用相同的seed,保證輸入特徵和標籤一一對應
np.random.shuffle(x_data) #shuffle-洗牌
np.random.seed(116)
np.random.shuffle(y_data)
# 將打亂後的資料集分割為訓練集和測試集,訓練集為前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()標記引數可訓練
# 使用seed使每次生成的隨機數相同(方便教學,使大家結果都一致,在現實使用時不寫seed)
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))
lr = 0.1 # 學習率為0.1
train_loss_results = [] # 將每輪的loss記錄在此列表中,為後續畫loss曲線提供資料
test_acc = [] # 將每輪的acc記錄在此列表中,為後續畫acc曲線提供資料
epoch = 500 # 迴圈500輪
loss_all = 0 # 每輪分4個step,loss_all記錄四個step生成的4個loss的和
引數優化
# 訓練部分
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符合概率分佈(此操作後與獨熱碼同量級,可相減求loss)
y_ = tf.one_hot(y_train, depth=3) # 將標籤值轉換為獨熱碼格式,方便計算loss和accuracy
loss = tf.reduce_mean(tf.square(y_ - y)) # 採用均方誤差損失函式mse = mean(sum(y-out)^2)
loss_all += loss.numpy() # 將每個step計算出的loss累加,為後續求loss平均值提供資料,這樣計算的loss更準確
# 計算loss對各個引數的梯度
grads = tape.gradient(loss, [w1, b1])
# 實現梯度更新 w1 = w1 - lr * w1_grad b = b - lr * b_grad
w1.assign_sub(lr * grads[0]) # 引數w1自更新
b1.assign_sub(lr * grads[1]) # 引數b自更新
# 每個epoch,列印loss資訊
print("Epoch {}, loss: {}".format(epoch, loss_all/4))
train_loss_results.append(loss_all / 4) # 將4個step的loss求平均記錄在此變數中
loss_all = 0 # loss_all歸零,為記錄下一個epoch的loss做準備
# 測試部分
# total_correct為預測對的樣本個數, total_number為測試的總樣本數,將這兩個變數都初始化為0
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)
pred = tf.argmax(y, axis=1) # 返回y中最大值的索引,即預測的分類
# 將pred轉換為y_test的資料型別
pred = tf.cast(pred, dtype=y_test.dtype)
# 若分類正確,則correct=1,否則為0,將bool型的結果轉換為int型
correct = tf.cast(tf.equal(pred, 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
test_acc.append(acc)
print("Test_acc:", acc)
print("--------------------------")
視覺化
# 繪製 loss 曲線
plt.title('Loss Function Curve') # 圖片標題
plt.xlabel('Epoch') # x軸變數名稱
plt.ylabel('Loss') # y軸變數名稱
plt.plot(train_loss_results, label="$Loss$") # 逐點畫出trian_loss_results值並連線,連線圖示是Loss
plt.legend() # 畫出曲線圖示
plt.show() # 畫出影像
# 繪製 Accuracy 曲線
plt.title('Acc Curve') # 圖片標題
plt.xlabel('Epoch') # x軸變數名稱
plt.ylabel('Acc') # y軸變數名稱
plt.plot(test_acc, label="$Accuracy$") # 逐點畫出test_acc值並連線,連線圖示是Accuracy
plt.legend()
plt.show()
相關文章
- 動手造輪子自己實現人工智慧神經網路(ANN),解決鳶尾花分類問題Golang1.18實現人工智慧神經網路Golang
- ML.NET 示例:多類分類之鳶尾花分類
- DL4J實戰之二:鳶尾花分類
- 圖卷積神經網路分類的pytorch實現卷積神經網路PyTorch
- 神經網路:numpy實現神經網路框架神經網路框架
- ML.NET 示例:聚類之鳶尾花聚類
- 02貝葉斯演算法-案例一-鳶尾花資料分類演算法
- 自己動手實現神經網路分詞模型神經網路分詞模型
- 神經網路 | 基於MATLAB 深度學習工具實現簡單的數字分類問題(卷積神經網路)神經網路Matlab深度學習卷積
- 使用pytorch快速搭建神經網路實現二分類任務(包含示例)PyTorch神經網路
- TF2.keras 實現基於卷積神經網路的影象分類模型TF2Keras卷積神經網路模型
- TF2.keras 實現基於卷積神經網路的影像分類模型TF2Keras卷積神經網路模型
- 對鳶尾花識別之KerasKeras
- EM 演算法-對鳶尾花資料進行聚類演算法聚類
- python對BP神經網路實現Python神經網路
- [譯] RNN 迴圈神經網路系列 2:文字分類RNN神經網路文字分類
- [Python人工智慧] 三.theano實現分類神經網路及機器學習基礎Python人工智慧神經網路機器學習
- 機器學習(四):4層BP神經網路(只用numpy不調包)用於訓練鳶尾花資料集|準確率96%機器學習神經網路
- numpy實現神經網路-反向傳播神經網路反向傳播
- 文字分類(下)-卷積神經網路(CNN)在文字分類上的應用文字分類卷積神經網路CNN
- 前饋神經網路進行MNIST資料集分類神經網路
- YJango的迴圈神經網路——實現LSTMGo神經網路
- 使用NumPy演示實現神經網路過程神經網路
- 使用PyTorch演示實現神經網路過程PyTorch神經網路
- TensorFlow上實現卷積神經網路CNN卷積神經網路CNN
- Keras上實現卷積神經網路CNNKeras卷積神經網路CNN
- (二)神經網路入門之Logistic迴歸(分類問題)神經網路
- 基於PyTorch框架的多層全連線神經網路實現MNIST手寫數字分類PyTorch框架神經網路
- 人工神經網路-2020-第十四周-人工神經網路硬體實現-備課神經網路
- YJango的迴圈神經網路——scan實現LSTMGo神經網路
- Tensorflow實現神經網路的前向傳播神經網路
- 卷積神經網路的原理及Python實現卷積神經網路Python
- 《卷積神經網路的Python實現》筆記卷積神經網路Python筆記
- 設計一個基於 LSTM 神經網路的文字分類器神經網路文字分類
- 神經網路神經網路
- 30分鐘講清楚深度神經網路神經網路
- DeepMind認為他們的神經網路可以實現類似人類的想象力 - kdnuggets神經網路
- [譯] 使用 Python 和 Keras 實現卷積神經網路PythonKeras卷積神經網路