tensorflow 神經網路實現鳶尾花分類

2022-05-08 08:36:36 字數 4276 閱讀 6555

主要步驟:

1.準備資料

2.搭建網路

3.引數優化

4.測試效果

**:

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

#隨機打亂資料

#使用相同的隨機種子,保證輸入特徵和標籤一一對應

np.random.seed(116)

np.random.shuffle(x_data)

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)

#將輸入特徵和標籤一一配對

#每32組資料,打包一次,分批次餵入神經網路

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個輸入特徵,3個分類,故輸入層為4個輸入節點,輸出層為3個神經元

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.2

#記錄每輪訓練後的loss,為後續畫loss曲線提供引數

train_loss_results =

#記錄每輪訓練後的正確率

test_acc =

#將資料餵入神經網路500次

epoch = 500

#因為資料分批次餵入神經網路,所以需要求和

loss_all =0

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

for epoch in

range(epoch):

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

for step, (x_train, y_train) in

enumerate(train_db):

with tf.gradienttape() as tape:

#神經網路乘加操作

y = tf.matmul(x_train, w1) +b1

#使y符合概率分布,與獨熱碼同級,相減可求loss

y =tf.nn.softmax(y)

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

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

#使用均方誤差損失函式

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

#將每個step計算出來的loss累加

loss_all +=loss.numpy()

#計算loss對各引數的導數

grads =tape.gradient(loss, [w1, b1])

#引數w1和b1自更新

w1.assign_sub(lr *grads[0])

b1.assign_sub(lr * grads[1])

#輸出每次訓練的loss

#因為有4組batch,所以除以4

print("

epoch:%d loss:%f

" % (epoch, loss_all/4))

#記錄每次訓練的loss,方便後面繪製loss變化曲線圖

#歸零,方便下次統計

loss_all =0

#呼叫測試資料,統計正確率

#total_correct為正確個數, total_number為測試總數

#注意,此時仍為batch級別的迴圈,每次迴圈,餵入乙個batch

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)

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

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

#將pred轉換成y_test的型別

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

#將bool型別轉換成int型別,若分類正確correct=1,否則為0

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

#計算每個batch中的correct數

correct =tf.reduce_sum(correct)

#將所有batch中的correct數加起來

total_correct +=int(correct)

#x_test有多少行,每個batch就有多少樣本

total_number +=x_test.shape[0]

acc = total_correct/total_number

print("

test_acc:%f

" %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()

執行結果:

基於tensorflow的神經網路簡單例項

通過構建乙個簡單的擬合直線的神經網路來簡單的講解基於tensorflow框架的神經網路構建方法。講解簡單的使用tensorboard來展示 分析神經網路流圖的方法。coding utf 8 呼叫tensorflow import tensorflow as tf import numpy as np...

Tensorflow卷積神經網路

卷積神經網路 convolutional neural network,cnn 是一種前饋神經網路,在計算機視覺等領域被廣泛應用.本文將簡單介紹其原理並分析tensorflow官方提供的示例.關於神經網路與誤差反向傳播的原理可以參考作者的另一篇博文bp神經網路與python實現.卷積是影象處理中一種...

Tensorflow 深層神經網路

維基百科對深度學習的定義 一類通過多層非線性變換對高複雜性資料建模演算法的合集.tensorflow提供了7種不同的非線性啟用函式,常見的有tf.nn.relu,tf.sigmoid,tf.tanh.使用者也可以自己定義啟用函式.3.1.1 交叉熵 用途 刻畫兩個概率分布之間的距離,交叉熵h越小,兩...