神經網路鳶尾花分類

2021-10-24 21:36:21 字數 3743 閱讀 1643

import tensorflow as tf

import numpy as np

from sklearn import datasets

import pandas as pd

import matplotlib.pyplot as plt

# 從sklearn包datasets中讀入資料集

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

x_data = datasets.load_iris().data

# 返回iris資料集所有標籤

y_data = datasets.load_iris().target

# 資料集亂序

# 使用相同的seed,使輸入/特徵標籤一一對應

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

np.random.seed(116)

# 劃分出訓練集與測試集

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, dtype=tf.float32)

x_test = tf.cast(x_test, dtype=tf.float32)

# 配成[輸入特徵,標籤]對,每次餵入乙個batch

train_db = tf.data.dataset.from_tensor_slices((x_train,y_train)).batch(32)

test_db = tf.data.dataset.from_tensor_slices((x_train,y_train)).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))

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 = tf.reduce_mean(tf.square(y_ - y)) # 採用均方誤差損失函式mse = mean(sum(y-out)^2)

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

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

w1.assign_sub(lr*grads[0])

b1.assign_sub(lr*grads[1])

# 每個epoch,列印loss資訊

print("epoch {}, loss: {}".format(epoch, loss_all/4))

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

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 的兩種方法做了詳細解釋,還有在編譯模型時如何選擇損失函式和優化器,以及在不同層啟用函式的選擇。構建人工神經網路的兩種方法如下 第一種方法 model tf.keras.sequential t...

實驗 鳶尾花分類 簡單的神經網路

import torch from torch import nnfrom sklearn.datasets import load iris from sklearn.model selection import train test split import numpy as np import...

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

主要步驟 1.準備資料 2.搭建網路 3.引數優化 4.測試效果 import tensorflow as tf from sklearn import datasets from matplotlib import pyplot as plt import numpy as np 匯入輸入特徵和標...