TensorFlow搭建基礎神經網路

2021-10-07 21:38:53 字數 4611 閱讀 6541

相當重要,部落格記錄一下

# -*- coding: utf-8 -*-

# 利用鳶尾花資料集,實現前向傳播、反向傳播,視覺化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

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

# seed: 隨機數種子,是乙個整數,當設定之後,每次生成的隨機數都一樣(為方便教學,以保每位同學結果一致)

np.random.seed(

116)

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

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)

# from_tensor_slices函式使輸入特徵和標籤值一一對應。(把資料集分批次,每個批次batch組資料)

train_db = tf.data.dataset.from_tensor_slices(

(x_train, y_train)

).batch(32)

print

(train_db)

test_db = tf.data.dataset.from_tensor_slices(

(x_test, y_test)

).batch(32)

# 生成神經網路的引數,4個輸入特徵故,輸入層為4個輸入節點;因為3分類,故輸出層為3個神經元

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

# 使用seed使每次生成的隨機數相同(方便教學,使大家結果都一致,在現實使用時不寫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)

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

inenumerate

(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和accuracy

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

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

loss_all += loss.numpy(

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

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

grads = tape.gradient(loss,

[w1, b1]

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

w1.assign_sub(lr * grads[0]

)# 引數w1自更新

b1.assign_sub(lr * grads[1]

)# 引數b自更新

# 每個epoch,列印loss資訊

print

("epoch {}, loss: {}"

.format

(epoch, loss_all/4)

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

loss_all =

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

# 測試部分

# total_correct為**對的樣本個數, total_number為測試的總樣本數,將這兩個變數都初始化為0

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)

# 返回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(

)

從零開始用TensorFlow搭建卷積神經網路

by 蔣思源 2017年8月29日 14 50 機器之心基於 ahmet taspinar 的博文使用 tensorflow 手動搭建卷積神經網路,並提供所有 和注釋的 jupyter notebook 文件。我們將不僅描述訓練情況,同時還將提供各種背景知識和分析。所有的 和執行結果都已上傳至 gi...

TensorFlow基礎環境搭建(Windows)

本文介紹當前最流行的人工智慧分析框架tensorflow的基礎環境搭建 windows 1 python基礎環境搭建 安裝python3.6 安裝anaconda 安裝jupyter 安裝後anaconda後,直接在命令列工具裡進行安裝即可 pip install jupyter 啟動jupter ...

tensorflow安裝神坑

莫名的,我之前安裝的tensorflow又用不了了,並且不論怎麼重新安裝都會報錯。1.importerror dll load failed 找不到指定的模組。這個錯誤在我不停解除安裝不停重灌中一直存在,直到我在乙個博主安裝細節中找到 這一步網上有很多安裝方法,有pip的,有conda的。但是,大部...