算法小白的第一次嘗試---tensorflow2.0實戰iris


import tensorflow as tf
import sklearn.datasets as datasets
import numpy as np

## 1.加載數據集
x_data = datasets.load_iris().data #加載features
y_data = datasets.load_iris().target #加載label

# 隨機切分數據,此處需設置相同的隨機種子
np.random.seed(168)
np.random.shuffle(x_data)
np.random.seed(168)
np.random.shuffle(y_data)

x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]

# 原始x_train爲float64,不轉化後期矩陣運算報錯
x_train = tf.cast(x_train,tf.float32)
x_test = tf.cast(x_test,tf.float32)

### 1.3 featur和label拼接
train_data = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32)
test_data = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)

# 2.模型訓練
### 2.1 定義神經元連接權重和偏置項
w = tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,dtype = tf.float32))
b = tf.Variable(tf.random.truncated_normal([3],stddev=0.1,dtype=tf.float32))

lr = 0.1 #學習率
epochs = 500 #迭代次數
classes = 3 #總的類別數
train_loss_result = []
accuracy_result = []
loss_all = 0
for epoch in range(epochs):
    for x_train,y_train in train_data:
        with tf.GradientTape() as tape:
            y = tf.matmul(x_train,w) + b
            y = tf.nn.softmax(y) #通過softmax轉化爲概率模型
            y_= tf.one_hot(y_train,depth =classes) #label轉化爲獨熱編碼
            loss = tf.reduce_mean(tf.square(y - y_))
            loss_all += loss.numpy()
        grads = tape.gradient(loss,[w,b]) #求取梯度
        w.assign_sub(lr * grads[0])
        b.assign_sub(lr * grads[1])
    train_loss_result.append(loss_all / 4) #4批次的均值作爲當前輪次的loss 
    loss_all = 0 
    
    #測試數據
    total_correct ,total_num =0,0
    for x_test,y_test in test_data:
        y = tf.matmul(x_test,w) + b
        y = tf.nn.softmax(y)
        pred = tf.argmax(y,axis=1)
        pred = tf.cast(pred,dtype = tf.int32)
        # 計算準確率
        correct = tf.cast(tf.equal(pred,y_test),dtype = tf.int32) #boolean型數據轉化爲0,1,方便使用tf.reduce_sum
        correct = tf.reduce_sum(correct)
        #所以batch的correct累加
        total_correct += correct
        total_num += x_test.shape[0]
    
    accuracy = total_correct / total_num 
    accuracy_result.append(accuracy)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章