人工智慧 鳶尾花分類實現

2021-10-10 04:22:58 字數 4562 閱讀 8132

從sklearn包datasets讀入資料集,語法為:

from sklearn.datasets import load_iris

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

x_data=datasets.load_iris(

).data

#返回iris資料集所有標籤

y_data=datasets.load_iris(

).target

準備資料

搭建網路

引數優化

測試效果

acc/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

y_data=datasets.load_iris(

).target

print

(x_data)

#隨機打亂資料(因為原始資料是順序的,順序不打亂會影響準確率)

# seed:隨機數種子,是乙個整數,當設定之後,每次生成的隨機數都一樣

np.random.seed(

116)

np.random.shuffle(x_data)

print

(x_data)

print

("---------------"

)np.random.seed(

116)

np.random.shuffle(y_data)

tf.random.set_seed(

116)

#將打亂後的資料集分割為訓練集和測試集,訓練集為前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個輸入節點,因分三類,輸出層為三個神經元

#使用tf.variable()標記引數可訓練

#使用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)

)#學習率為0.1

lr=0.1

#將每輪的loss記錄在此列表當中,為後續畫loss曲線提供資料

train_loss_results=

#將每輪的acc記錄在此列表中,為後續畫acc曲線提供資料

test_acc=

#迴圈500輪

epoch=

500#每輪分4個step,loss_all記錄四個step生成的4個loss的和

loss_all=

0#訓練部分

#資料集級別迴圈,每個epoch迴圈一次資料集

for epoch in

range

(epoch)

:#batch級別的迴圈,每個step迴圈乙個batch

for step,

(x_train,y_train)

inenumerate

(train_db)

:#with結構記錄神經梯度

with tf.gradienttape(

)as tape:

#神經網路乘法加法運算

y=tf.matmul(x_train,w1)

+b1 #使輸出y符合概率分布

y=tf.nn.softmax(y)

#將標籤值轉換成獨熱碼格式,方便計算loss和accuracy

y_=tf.one_hot(y_train,depth=3)

#採用均方差損失函式mse=mean(sum(y-out)^2)

loss=tf.reduce_mean(tf.square(y_-y)

)#將每個step計算出來的loss累加,為後續求loss平均值提供資料,這樣計算的loss更準確

loss_all+=loss.numpy(

)#計算loss對各個引數的梯度

grads=tape.gradient(loss,

[w1,b1]

)#實現梯度更新w1=w1-lr*w1_grad b=b-lr*b_grad

w1.assign_sub(lr*grads[0]

) b1.assign_sub(lr*grads[1]

)#每個epoch列印loss資訊

print

("epoch{},loss:{}"

.format

(epoch,loss_all/4)

)#將4個step的loss求平均記錄在此變數中4)

#loss_all歸零,為記錄下乙個epoch的loss做準備

loss_all=

0#測試部分

#total_correct為測試對的樣本個數,total_number為測試總樣本數

total_correct,total_number=0,

0for x_test,y_test in test_db:

#使用更新後的引數進行**

y=tf.matmul(x_test,w1)

+b1 y=tf.nn.softmax(y)

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

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

#將pred轉換為y_test的資料型別

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

#若分類正確,則cirrect=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的行數,shap[0]返回變數的行數

total_number+=x_test.shape[0]

#總的準確率為 總準確的個數/總個數

acc=total_correct/total_number

print

("test_acc"

,acc)

print

("------------------"

)#繪製loss曲線

plt.title(

'loss function curve'

)plt.xlabel(

'epoch'

)plt.ylabel(

'loss'

)#逐點畫出值並連線,連線圖示使loss

plt.plot(train_loss_results,label=

"$loss$"

)#畫出曲線圖示

plt.legend(

)#畫出影象

plt.show(

)#繪製accuracy曲線

knn實現鳶尾花分類

依照歐氏距離計算公式計算測試資料與訓練集的距離 按照距離公升序排序,選取距離最小的k個點 確定前k個點所在類別的出現頻率 返回前k個點出現頻率最高的類作為測試資料的 分類 import operator import numpy as np from sklearn.datasets import ...

KNN實現鳶尾花分類

將其按照7 3的比例劃分為訓練集和測試集。前4列為特徵,第5列為類別,setosa 視為1,versicolor 視為2,virginica 視為3 測試集順序略有調整。最簡單最初級的分類器是將全部的訓練資料所對應的類別都記錄下來,當測試物件的屬性和某個訓練物件的屬性完全匹配時,便可以對其進行分類。...

鳶尾花分類python演算法 BP演算法鳶尾花分類

bp演算法鳶尾花分類 網上很多鳶尾花例子,學習其他人後仿寫,我在執行其他人的時候會有溢位和錯誤。下述 準確率95 提取碼 y07d 如果有什麼不對的或者有什麼不懂iamzhubaoliang yeah.net 工程位址 import math import random import pandas ...