TensorFlow實現鳶尾花分類


准備數據

  • 數據集讀入
  • 數據集亂序
  • 生成訓練集和測試集
  • 特征和標簽配對,每次讀入一小撮(batch)

搭建網絡

  • 定義神經網絡中所有可訓練參數

參數優化

  • 嵌套循環迭代,with結構更新參數,顯示當前loss

測試效果

  • 計算當前參數前向傳播后的准確率,顯示當前acc

acc/loss可視化


from sklearn import datasets
import tensorflow as tf 
import numpy as np 
from matplotlib import pyplot as plt

x_data = datasets.load_iris().data # 返回iris的輸入特征
y_data = datasets.load_iris().target # 返回iris的標簽
# 打亂數據集
np.random.seed(20) # 使用相同的seed,使得輸入特征、標簽一一對應
np.random.shuffle(x_data)
np.random.seed(20)
np.random.shuffle(y_data)
tf.random.set_seed(20)
# 划分數據集
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]
# 轉換數據集內容的格式
x_train = tf.cast(x_train,tf.float32)
x_test = tf.cast(x_test,tf.float32)

# 使用form_tensor_slices使得特征和標簽配對,每32個打包為一個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)

# 定義神經網絡中所有可訓練的參數
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))

epoch = 1000 # 對整個訓練集的訓練次數
loss_all = 0 # 每個epoch的整體損失
train_loss_results = [] # 訓練損失結果列表,用來畫圖
test_acc = [] # 每一個epoch后測試時的acc列表
lr = 0.1 # 學習率

for epoch in range(epoch): 
    for step,(x_train,y_train) in enumerate(train_db): # 對打包的訓練集進行batch訓練
        with tf.GradientTape() as tape: # 記錄計算過程
            y = tf.matmul(x_train,w1) + b1 # 計算
            y = tf.nn.softmax(y) # softmax符合概率
            y_ = tf.one_hot(y_train,depth = 3) # 對訓練集的標簽進行one_hot編碼
            loss = tf.reduce_mean(tf.square(y_ - y)) # 計算損失
            loss_all += loss.numpy() # 累加每個batch損失

        grads = tape.gradient(loss,[w1,b1]) # 對loss中的w1,b1進行求導
        w1.assign_sub(lr*grads[0]) # 更新w1
        b1.assign_sub(lr*grads[1]) # 更新w2

    print("Epoch:{},loss:{}".format(epoch,loss_all/4)) # 平均損失 120組,一個批次32,打印的每個批次的平均損失
    train_loss_results.append(loss_all/4) # 加入訓練損失列表,方便畫圖
    loss_all = 0 # 重置此epoch的損失

    total_correct,total_number = 0,0
    for x_test,y_test in test_db: # 遍歷測試集中的batch
        y = tf.matmul(x_test,w1) + b1 # 預測
        y = tf.nn.softmax(y) # 符合概率
        pred = tf.argmax(y,axis = 1) # 取出行中最大值的索引,也就是取出其中概率最大的索引
        pred = tf.cast(pred,dtype=y_test.dtype) # 轉換到y_test的類型

        correct = tf.cast(tf.equal(pred,y_test),dtype=tf.int32) # 判斷與測試集的標簽是否相等並且轉換bool為int型
        correct = tf.reduce_sum(correct) # 沿着指定維度的和,不指定axis則默認為所有元素的和
        total_correct += int(correct) # 對每個batch的correct相加
        total_number += x_test.shape[0] # 算測試集總數
    acc = total_correct/total_number # 計算准確率
    test_acc.append(acc) # 計算每epoch的總數

    print("test_acc:",acc)
    print("----------------------")

plt.figure("figure1")
plt.title("Loss Function Curce")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.plot(train_loss_results,label="$Loss$")
plt.legend() # 顯示圖例
plt.show
print("-------------")
plt.figure("figure2")
plt.title('Acc Curce')
plt.xlabel('Epoch')
plt.ylabel('Acc')
plt.plot(test_acc,label="$Accuracy$")
plt.legend()
plt.show()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM