天天看點

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

目錄

  • 1.1人工智能三學派
  • 1.2 神經網絡設計過程
  • 1.3 張量生成
      • 1.3.1建立張量:
      • 1.3.2将numpy資料類型轉換為Tensor類型:
      • 1.3.3建立一些特殊的張量:
      • 1.3.4生成均勻分布随機數:
  • 1.4 常用函數
      • 1.4.1 求最大最小值等函數:
      • 1.4.2 tf.Variable()函數将變量标記為“可訓練”:
      • 1.4.3 數學運算函數:
      • 1.4.4 平方、次方與開方函數:
      • 1.4.5 矩陣乘法函數 tf.matmul():
      • 1.4.6 将特征與标簽配對的函數 tf.data.Dataset.from_tensor_slices():
      • 1.4.7 tf.GradientTape()函數實作指定函數對某個參數的梯度運算:
      • 1.4.8 enumerate()函數将清單、元組或字元串打包成(索引元素):
      • 1.4.9 tf.one_hot() 函數将待轉換資料,轉換為one-hot形式的資料輸出:
      • 1.4.10 tf.nn.softmax():
      • 1.4.11 assign_sub() 指派操作,更新參數的值并傳回:
      • 1.4.12 tf.argmax() 傳回張量沿指定次元最大值的索引:
  • 1.5 鸢尾花資料集讀入
      • 1.5.1 資料集介紹:
      • 1.5.2 讀入鸢尾花資料集(Iris):
  • 1.6 神經網絡實作鸢尾花分類
      • 1.6.1 鸢尾花分類代碼結構說明:
      • 1.6.2 鸢尾花分類代碼:

1.1人工智能三學派

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.2 神經網絡設計過程

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

下面看看步驟:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

以上就是神經網絡的全部過程。

看一個最簡單的更新參數w的例子:

import tensorflow as tf

w = tf.Variable(tf.constant(5, dtype=tf.float32))  #  tf.Variable()函數将變量标記為“可訓練”:
lr = 0.2
epoch = 40

for epoch in range(epoch):  # for epoch 定義頂層循環,表示對資料集循環epoch次,此例資料集資料僅有1個w,初始化時候constant指派為5,循環40次疊代。
    with tf.GradientTape() as tape:  # with結構到grads框起了梯度的計算過程。
        loss = tf.square(w + 1)
    grads = tape.gradient(loss, w)  # .gradient函數告知誰對誰求導

    w.assign_sub(lr * grads)  # .assign_sub 對變量做自減 即:w -= lr*grads 即 w = w - lr*grads
    print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))

# lr初始值:0.2   請自改學習率  0.001  0.999 看收斂過程
# 最終目的:找到 loss 最小 即 w = -1 的最優參數w

           

1.3 張量生成

這裡是以TensorFlow2學習的。

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.3.1建立張量:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.3.2将numpy資料類型轉換為Tensor類型:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.3.3建立一些特殊的張量:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

下面看個例子:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.3.4生成均勻分布随機數:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4 常用函數

1.4.1 求最大最小值等函數:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

看一個求均值的例子:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.2 tf.Variable()函數将變量标記為“可訓練”:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.3 數學運算函數:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

看個例子:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.4 平方、次方與開方函數:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.5 矩陣乘法函數 tf.matmul():

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.6 将特征與标簽配對的函數 tf.data.Dataset.from_tensor_slices():

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

看個例子:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.7 tf.GradientTape()函數實作指定函數對某個參數的梯度運算:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.8 enumerate()函數将清單、元組或字元串打包成(索引元素):

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.9 tf.one_hot() 函數将待轉換資料,轉換為one-hot形式的資料輸出:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.10 tf.nn.softmax():

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.11 assign_sub() 指派操作,更新參數的值并傳回:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.4.12 tf.argmax() 傳回張量沿指定次元最大值的索引:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.5 鸢尾花資料集讀入

1.5.1 資料集介紹:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.5.2 讀入鸢尾花資料集(Iris):

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

看一段讀入這個資料集的代碼:

from sklearn import datasets
from pandas import DataFrame
import pandas as pd

x_data = datasets.load_iris().data  # .data傳回iris資料集所有輸入特征
y_data = datasets.load_iris().target  # .target傳回iris資料集所有标簽
print("x_data from datasets: \n", x_data)
print("y_data from datasets: \n", y_data)

x_data = DataFrame(x_data, columns=['花萼長度', '花萼寬度', '花瓣長度', '花瓣寬度']) # 為表格增加行索引(左側)和列标簽(上方)
pd.set_option('display.unicode.east_asian_width', True)  # 設定列名對齊
print("x_data add index: \n", x_data)

x_data['類别'] = y_data  # 新加一列,列标簽為‘類别’,資料為y_data
print("x_data add a column: \n", x_data)

#類型次元不确定時,建議用print函數列印出來确認效果
           

運作結果:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.6 神經網絡實作鸢尾花分類

1.6.1 鸢尾花分類代碼結構說明:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類
Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

1.6.2 鸢尾花分類代碼:

# -*- 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)
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) 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和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))
    train_loss_results.append(loss_all / 4)  # 将4個step的loss求平均記錄在此變量中
    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
    test_acc.append(acc)
    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()

           

運作結果:

Loss變化曲線:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

Acc準确率:

Tensorflow筆記——第一講:神經網絡計算1.1人工智能三學派1.2 神經網絡設計過程1.3 張量生成1.4 常用函數1.5 鸢尾花資料集讀入1.6 神經網絡實作鸢尾花分類

繼續閱讀