tf2 0入門實戰,神經網路實現簡單的分類任務

2021-10-23 04:45:20 字數 4591 閱讀 9165

資料型別分析

from sklearn import datasets

import pandas as pd

#匯入資料和標籤

x_data = datasets.load_iris(

).data

y_data = datasets.load_iris(

).target

x_data = pd.dataframe(x_data, columns=

['花萼長度'

,'花萼寬度'

,'花瓣長度'

,'花瓣寬度'])

pd.set_option(

'display.unicode.east_asian_width'

,true

)#設定列名對其

x_data[

'類別'

]= y_data #新加一列,類別標籤為y_data

print

(x_data)

執行結果:

由圖可見,鳶尾花資料集中共有150個樣本,包含4個特徵,分為3個類別,由於資料量小故採用簡單的單層神經網路即可實現分類。

神經網路模型:

這裡使用一層包含4個單元的神經網路和3個輸出節點相連,最後用softmax實現分類任務

該分類任務需要完成如下操作:

資料讀入和處理

匯入資料

打亂資料

分開測試集和訓練集

將訓練和測試的樣本與標籤配對,並設定batch

搭建網路

定義神經網路中的可訓練引數

引數訓練和優化

前向傳播計算和反向求梯度更新優化引數,並顯示當前損失值loss

測試計算模型每訓練一次epoch的測試集準確率,並顯示當前正確率acc

結果視覺化

畫出acc和loss曲線

from sklearn import datasets

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import tensorflow as tf

from sklearn.utils import shuffle

# 匯入資料和標籤

x_data = datasets.load_iris(

).data

y_data = datasets.load_iris(

).target

'''x_data = pd.dataframe(x_data, columns=['花萼長度', '花萼寬度', '花瓣長度', '花瓣寬度'])

pd.set_option('display.unicode.east_asian_width', true) # 設定列名對其

x_data['類別'] = y_data # 新加一列,類別標籤為y_data

'''# 資料集打亂

x_data, y_data = shuffle(x_data, y_data, random_state =1)

# 分割訓練集和測試集

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_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)

)lr =

0.1train_loss_results =

# 記錄每輪的loss值

test_acc =

# 記錄每輪的測試acc值

epoch =

500loss_all =

0# 每輪分為4個step,loss_all記錄4個step的loss總和

# 巢狀迴圈迭代,with結構更新引數,顯示當前loss

for epoch in

range

(epoch)

:for step,

(x_train, y_train)

inenumerate

(train_db)

:with tf.gradienttape(

)as tape:

# 前向傳播過程計算y

y = tf.matmul(x_train, w1)

+ b1

y = tf.nn.softmax(y)

# 計算總loss

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

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

)# 採用均方誤差mse計算損失值

loss_all += loss.numpy(

) grads = tape.gradient(loss,

[w1, b1]

) w1.assign_sub(lr * grads[0]

)# 引數自更新

b1.assign_sub(lr * grads[1]

)print

("epoch{},loss:{}"

.format

(epoch, loss_all /4)

)4) loss_all =

0# 因為batch是32,需要迴圈4個batch為乙個epoch,所以每乙個step的loss為loss_all/4

total_correct, total_number =0,

0# 計算當前引數前向傳播後的準確率,顯示當前acc,注意x_test,y_test不是只有乙個值,而是乙個batch的值,是張量

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)

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

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

, dtype=tf.int32)

# tf.equal是逐個對應比較的

correct = tf.reduce_sum(correct)

# 將每個batch的correct數加起來

total_correct +=

int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

print

('test_acc:'

, acc)

print

('----------------------'

)# 損失函式影象

plt.title(

'loss curve'

)plt.xlabel(

'epoch'

)plt.ylabel(

'loss'

)plt.plot(train_loss_results, label=

"$loss$"

)plt.legend(

)plt.show(

)# 正確率影象

plt.title(

'acc curve'

)plt.xlabel(

'epoch'

)plt.ylabel(

'acc'

)plt.plot(test_acc, label=

"$accuracy$"

)plt.legend(

)# 顯示圖例

plt.show(

)

tf 神經網路的簡單搭建

import tensorflow as tf import numpy as np defadd layer inputs,in size,out size,activation function none weights tf.variable tf.random normal in size,...

實現簡單的神經網路

python語言 tensorflow框架實現簡單的神經網路 訓練神經網路的過程一般分為3個步驟 不隨網路結構的變化而變化 1.定義網路結構和前向傳播的輸出結果 2.定義損失函式以及選擇反向傳播優化演算法 3.生成會話,並在訓練資料上反覆執行反向傳播優化演算法 完整 如下 import tensor...

神經網路的簡單實現

在吳恩達的機器學習教程中,講解了同或邏輯運算的神經網路實現原理,我將其用python語言實現一下。異或即相同取1,不同取0,真值表如下 x1x2 x1 xnor x200 1100 0101 11同或運算的神經網路包括三層 輸入層 隱藏層 輸出層。首先需要實現以下三個部分 1 x1 and x2 與...