主頁 >  其他 > Tensorflow:TensorFlow基礎(二)

Tensorflow:TensorFlow基礎(二)

2020-10-19 04:53:54 其他

文章目錄

  • TensorFlow基礎(二)
    • 1.張量的典型應用
      • 1.1 標量
      • 1.2 向量
      • 1.3 矩陣
    • 2.索引與切片
      • 2.1 索引
      • 2.2 切片
    • 3.維度變換
      • 3.1 改變視圖
      • 3.2 增、刪維度
      • 3.3 交換維度
      • 3.4 復制資料
    • 4.Broadcasting
    • 5.數學運算
      • 5.1 加、減、乘、除運算
      • 5.2 乘方運算
      • 5.3 指數和對數運算
      • 5.4 矩陣相乘運算
    • 6.前向傳播實戰

TensorFlow基礎(二)

1.張量的典型應用

1.1 標量

# 隨機模擬網路輸出
out = tf.random.uniform([4,10]) 
# 隨機構造樣本真實標簽
y = tf.constant([2,3,2,0]) 
# one-hot 編碼
y = tf.one_hot(y, depth=10) 
# 計算每個樣本的 MSE
loss = tf.keras.losses.mse(y, out) 
# 平均 MSE,loss 應是標量
loss = tf.reduce_mean(loss) 
print(loss)
tf.Tensor(0.29024273, shape=(), dtype=float32)

1.2 向量

考慮 2 個輸出節點的網路層, 我們創建長度為 2 的偏置向量b,并累加在每個輸出節點上:

# z=wx,模擬獲得激活函式的輸入 z
z = tf.random.normal([4,2])
# 創建偏置向量
b = tf.zeros([2])
# 累加上偏置向量
z = z + b 
z
<tf.Tensor: shape=(4, 2), dtype=float32, numpy=
array([[ 0.31563172, -0.58949906],
       [ 0.90833205, -0.90002346],
       [-0.5645722 ,  1.5243807 ],
       [-0.46752235, -0.87098795]], dtype=float32)>

通過高層介面類 Dense()方式創建的網路層,張量 W 和 𝒃 存盤在類的內部,由類自動創
建并管理,可以通過全連接層的 bias 成員變數查看偏置變數𝒃,例如創建輸入節點數為 4,
輸出節點數為 3 的線性層網路,那么它的偏置向量 b 的長度應為 3:

# 創建一層 Wx+b,輸出節點為 3
fc = tf.keras.layers.Dense(3) 
# 通過 build 函式創建 W,b 張量,輸入節點為 4
fc.build(input_shape=(2,4))
# 查看偏置向量
fc.bias 
<tf.Variable 'bias:0' shape=(3,) dtype=float32, numpy=array([0., 0., 0.], dtype=float32)>

1.3 矩陣

# 2 個樣本,特征長度為 4 的張量
x = tf.random.normal([2,4]) 
# 定義 W 張量
w = tf.ones([4,3])
# 定義 b 張量
b = tf.zeros([3]) 
# X@W+b 運算
o = x@w+b 
o
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[ 0.24217486,  0.24217486,  0.24217486],
       [-2.0101817 , -2.0101817 , -2.0101817 ]], dtype=float32)>
# 定義全連接層的輸出節點為 3
fc = tf.keras.layers.Dense(3) 
# 定義全連接層的輸入節點為 4
fc.build(input_shape=(2,4)) 
# 查看權值矩陣 W
fc.kernel 
<tf.Variable 'kernel:0' shape=(4, 3) dtype=float32, numpy=
array([[-0.39046913,  0.10637152,  0.10071242],
       [ 0.21714497, -0.6418654 , -0.30992925],
       [-0.55721366,  0.61090446,  0.89444256],
       [-0.36123437,  0.03711444, -0.08871335]], dtype=float32)>

2.索引與切片

2.1 索引

# 創建4維張量
x = tf.random.normal([2,2,2,2]) 
# 取第 1 張圖片的資料
x[0]
<tf.Tensor: shape=(2, 2, 2), dtype=float32, numpy=
array([[[ 0.34822315,  0.3984542 ],
        [-0.4846413 , -0.97909266]],

       [[ 0.8115266 ,  0.00483855],
        [-0.80532825, -0.00211781]]], dtype=float32)>
# 取第 1 張圖片的第 2 行
x[0][1]
<tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 0.8115266 ,  0.00483855],
       [-0.80532825, -0.00211781]], dtype=float32)>
# 取第 1 張圖片,第 2 行,第 2 列的資料
x[0][1][1]
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([-0.80532825, -0.00211781], dtype=float32)>
# 取第 1 張圖片,第 2 行,第 1 列的像素, B 通道(第 2 個通道)顏色強度值
x[0][1][0][1]
<tf.Tensor: shape=(), dtype=float32, numpy=0.004838548>
# 取第 2 張圖片,第 2 行,第 2 列的資料
x[1,1,1]
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([-0.44559637,  0.01962792], dtype=float32)>

2.2 切片

# 讀取第 1,2 張圖片
x[0:1]
<tf.Tensor: shape=(1, 2, 2, 2), dtype=float32, numpy=
array([[[[ 0.34822315,  0.3984542 ],
         [-0.4846413 , -0.97909266]],

        [[ 0.8115266 ,  0.00483855],
         [-0.80532825, -0.00211781]]]], dtype=float32)>
# 讀取第一張圖片
x[0,::] 
<tf.Tensor: shape=(2, 2, 2), dtype=float32, numpy=
array([[[ 0.34822315,  0.3984542 ],
        [-0.4846413 , -0.97909266]],

       [[ 0.8115266 ,  0.00483855],
        [-0.80532825, -0.00211781]]], dtype=float32)>
# 逆序全部元素
x[::-1] 
<tf.Tensor: id=331, shape=(9,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1, 0])>

讀取每張圖片的所有通道,其中行按著逆序隔行采樣,列按著逆序隔行采樣

x = tf.random.normal([2,4,4,4])
# 行、列逆序間隔采樣
x[0,::-2,::-2] 
<tf.Tensor: shape=(2, 2, 4), dtype=float32, numpy=
array([[[ 2.304297  , -1.0442073 , -0.56854004, -0.7879971 ],
        [ 1.0789118 , -0.18602042,  0.9888905 , -0.6266968 ]],

       [[ 0.16137564,  0.4127967 ,  0.72044903, -0.7933607 ],
        [-1.5984349 ,  1.3255346 , -0.27378082, -0.17433397]]],
      dtype=float32)>
# 取 G 通道資料
x[:,:,:,1] 
<tf.Tensor: shape=(2, 4, 4), dtype=float32, numpy=
array([[[-0.33024472, -1.1331698 ,  0.49589372, -0.78729445],
        [-1.2920703 ,  1.3255346 , -0.71679795,  0.4127967 ],
        [-0.57076746,  0.2409307 , -0.9696086 , -0.2732332 ],
        [-0.86820245, -0.18602042,  1.4539748 , -1.0442073 ]],

       [[-0.31168306, -0.9283122 , -0.54838717, -0.12986478],
        [-0.24761973,  0.6580482 ,  0.8283819 ,  0.8146409 ],
        [-1.1049583 , -0.24078842,  0.1042363 ,  0.29632303],
        [-0.00507268, -1.3736714 ,  0.01005635,  0.23007654]]],
      dtype=float32)>
# 讀取第 1~2 張圖片的 G/B 通道資料
# 高寬維度全部采集
x[0:2,...,1:] 
<tf.Tensor: shape=(2, 4, 4, 3), dtype=float32, numpy=
array([[[[-0.33024472,  0.6283163 , -0.04996401],
         [-1.1331698 ,  0.60591996,  0.23778886],
         [ 0.49589372, -0.30366042,  1.1818023 ],
         [-0.78729445,  1.6598036 , -1.2402087 ]],

        [[-1.2920703 ,  0.74676615, -0.42908686],
         [ 1.3255346 , -0.27378082, -0.17433397],
         [-0.71679795, -0.11399374, -0.12879518],
         [ 0.4127967 ,  0.72044903, -0.7933607 ]],

        [[-0.57076746, -1.1609849 ,  1.6461061 ],
         [ 0.2409307 ,  1.5247557 , -1.5071423 ],
         [-0.9696086 ,  2.1981888 ,  0.6549159 ],
         [-0.2732332 ,  0.24407765,  0.05883753]],

        [[-0.86820245,  0.27632675,  0.68970746],
         [-0.18602042,  0.9888905 , -0.6266968 ],
         [ 1.4539748 ,  0.4892664 ,  0.34481934],
         [-1.0442073 , -0.56854004, -0.7879971 ]]],

?

       [[[-0.31168306, -0.4917958 , -0.5603941 ],
         [-0.9283122 , -0.25997722, -0.5569816 ],
         [-0.54838717, -1.1659151 ,  0.37025896],
         [-0.12986478, -0.43251887,  0.16835675]],

        [[-0.24761973,  0.7648886 , -0.9059888 ],
         [ 0.6580482 ,  0.14856052,  0.8848719 ],
         [ 0.8283819 ,  1.2512318 ,  0.21912369],
         [ 0.8146409 , -1.926621  ,  1.5576432 ]],

        [[-1.1049583 ,  0.3476432 , -0.20792682],
         [-0.24078842,  0.41281703,  0.665506  ],
         [ 0.1042363 , -0.40645656, -0.15254466],
         [ 0.29632303, -0.23996541, -1.9224465 ]],

        [[-0.00507268, -0.7571799 ,  0.12876898],
         [-1.3736714 ,  1.2115971 ,  0.55076367],
         [ 0.01005635, -0.43012097,  0.2410907 ],
         [ 0.23007654, -0.9896959 ,  2.7479093 ]]]], dtype=float32)>

3.維度變換

3.1 改變視圖

我們通過 tf.range()模擬生成一個向量資料,并通過 tf.reshape 視圖改變函式產生不同的視圖

# 生成向量
x = tf.range(24) 
# 改變 x 的視圖,獲得 4D 張量,存盤并未改變
x = tf.reshape(x,[1,2,3,4]) 
x
<tf.Tensor: shape=(1, 2, 3, 4), dtype=int32, numpy=
array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]]])>
# 獲取張量的維度數和形狀串列
x.ndim,x.shape 
(4, TensorShape([1, 2, 3, 4]))

通過 tf.reshape(x, new_shape),可以將張量的視圖任意地合法改變

tf.reshape(x,[2,-1])
<tf.Tensor: shape=(2, 12), dtype=int32, numpy=
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])>
 tf.reshape(x,[2,4,3])
<tf.Tensor: shape=(2, 4, 3), dtype=int32, numpy=
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]]])>
tf.reshape(x,[2,-1,3])
<tf.Tensor: shape=(2, 4, 3), dtype=int32, numpy=
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]]])>

3.2 增、刪維度

# 產生矩陣
x = tf.random.uniform([4,4],maxval=10,dtype=tf.int32)
x
<tf.Tensor: shape=(4, 4), dtype=int32, numpy=
array([[0, 6, 8, 7],
       [1, 5, 1, 7],
       [5, 9, 6, 0],
       [4, 5, 3, 9]])>

通過 tf.expand_dims(x, axis)可在指定的 axis 軸前可以插入一個新的維度

# axis=2 表示寬維度后面的一個維度
x = tf.expand_dims(x,axis=2) 
x
<tf.Tensor: shape=(4, 4, 1), dtype=int32, numpy=
array([[[0],
        [6],
        [8],
        [7]],

       [[1],
        [5],
        [1],
        [7]],

       [[5],
        [9],
        [6],
        [0]],

       [[4],
        [5],
        [3],
        [9]]])>
tf.expand_dims(x,axis=0) # 高維度之前插入新維度
<tf.Tensor: shape=(1, 4, 4, 1), dtype=int32, numpy=
array([[[[0],
         [6],
         [8],
         [7]],

        [[1],
         [5],
         [1],
         [7]],

        [[5],
         [9],
         [6],
         [0]],

        [[4],
         [5],
         [3],
         [9]]]])>
x = tf.squeeze(x, axis=2) # 洗掉圖片數量維度
x
<tf.Tensor: shape=(4, 4), dtype=int32, numpy=
array([[0, 6, 8, 7],
       [1, 5, 1, 7],
       [5, 9, 6, 0],
       [4, 5, 3, 9]])>
x = tf.random.uniform([1,4,4,1],maxval=10,dtype=tf.int32)
tf.squeeze(x) # 洗掉所有長度為 1 的維度
<tf.Tensor: shape=(4, 4), dtype=int32, numpy=
array([[9, 9, 7, 6],
       [0, 3, 6, 8],
       [2, 7, 6, 9],
       [8, 8, 3, 5]])>

3.3 交換維度

x = tf.random.normal([1,2,3,4])
# 交換維度
tf.transpose(x,perm=[0,3,1,2]) 
<tf.Tensor: shape=(1, 4, 2, 3), dtype=float32, numpy=
array([[[[ 1.054216  ,  0.9930936 ,  0.02253438],
         [-0.8523428 ,  1.4335555 ,  1.3674371 ]],

        [[-1.3224561 , -0.56301004, -1.9799871 ],
         [ 0.6887363 ,  1.6728357 , -0.89002633]],

        [[ 0.5843838 , -0.412141  ,  1.8223515 ],
         [ 0.92986745,  0.21938261,  2.0599825 ]],

        [[ 1.7795099 , -1.6967453 , -1.856098  ],
         [-1.0092537 ,  0.02507956, -0.25849926]]]], dtype=float32)>
x = tf.random.normal([1,2,3,4])
# 交換維度
tf.transpose(x,perm=[0,2,1,3]) 
<tf.Tensor: shape=(1, 3, 2, 4), dtype=float32, numpy=
array([[[[ 0.04785682,  0.25443026,  1.5284601 ,  0.11894976],
         [ 0.04647516, -0.41432348, -0.85131294,  0.46643516]],

        [[-0.1527475 , -0.823387  ,  0.35662124, -0.6405889 ],
         [-0.08285429, -0.34229243,  2.2337375 ,  0.54682755]],

        [[ 1.7444025 ,  1.0962962 ,  0.07826549,  0.78326786],
         [ 0.6024326 ,  0.34614065,  1.8503569 , -0.41436443]]]],
      dtype=float32)>

3.4 復制資料

# 創建向量 b
b = tf.constant([1,2]) 
# 插入新維度,變成矩陣
b = tf.expand_dims(b, axis=0) 
b
<tf.Tensor: shape=(1, 2), dtype=int32, numpy=array([[1, 2]])>
# 樣本維度上復制一份
b = tf.tile(b, multiples=[2,1]) 
b
<tf.Tensor: id=414, shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
       [1, 2]])>
x = tf.range(4)
# 創建 2 行 2 列矩陣
x=tf.reshape(x,[2,2]) 
x
<tf.Tensor: id=420, shape=(2, 2), dtype=int32, numpy=
array([[0, 1],
       [2, 3]])>
# 列維度復制一份
x = tf.tile(x,multiples=[1,2]) 
x
<tf.Tensor: id=422, shape=(2, 4), dtype=int32, numpy=
array([[0, 1, 0, 1],
       [2, 3, 2, 3]])>
# 行維度復制一份
x = tf.tile(x,multiples=[2,1]) 
x
<tf.Tensor: id=424, shape=(4, 4), dtype=int32, numpy=
array([[0, 1, 0, 1],
       [2, 3, 2, 3],
       [0, 1, 0, 1],
       [2, 3, 2, 3]])>

4.Broadcasting

Broadcasting 也叫廣播機制(自動擴展也許更合適),它是一種輕量級張量復制的手段,
在邏輯上擴展張量資料的形狀,但是只要在需要時才會執行實際存盤復制操作,對于大部
分場景,Broadcasting 機制都能通過優化手段避免實際復制資料而完成邏輯運算,從而相對
于 tf.tile 函式,減少了大量計算代價,
在這里插入圖片描述

# 創建矩陣
A = tf.random.normal([4,3]) 
B = tf.random.normal([1,3])
# 擴展為 3D 張量
tf.broadcast_to(B, [4,1,3])
print(A + B)
tf.Tensor(
[[ 2.0599308  -1.7524832   2.020039  ]
 [ 0.67481816 -0.25245976 -1.6941655 ]
 [ 0.39008152 -1.2065786   0.28262126]
 [-0.19673708 -2.8015094   2.692475  ]], shape=(4, 3), dtype=float32)
A = tf.random.normal([32,2])
# 不符合 Broadcasting 條件
try: 
    tf.broadcast_to(A, [2,32,32,4])
except Exception as e:
    print(e)
Incompatible shapes: [32,2] vs. [2,32,32,4] [Op:BroadcastTo]

5.數學運算

5.1 加、減、乘、除運算

a = tf.range(5)
b = tf.constant(2)
# 整除運算
a//b 
<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 0, 1, 1, 2])>
# 余除運算
a%b 
<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 0, 1, 0])>

5.2 乘方運算

x = tf.range(4)
# 乘方運算
tf.pow(x,3) 
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([ 0,  1,  8, 27])>
# 乘方運算子
x**2 
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([0, 1, 4, 9])>
x=tf.constant([1.,4.,9.])
# 平方根
x**(0.5) 
tf.Tensor([ 4. 16. 36.], shape=(3,), dtype=float32)
x = tf.range(5)
# 轉換為浮點數
x = tf.cast(x, dtype=tf.float32) 
# 平方
x = tf.square(x) 
# 平方根
tf.sqrt(x) 
<tf.Tensor: shape=(5,), dtype=float32, numpy=array([0., 1., 2., 3., 4.], dtype=float32)>

5.3 指數和對數運算

x = tf.constant([1.,2.,3.])
# 指數運算
2**x 
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([2., 4., 8.], dtype=float32)>
# 自然指數運算
tf.exp(1.)
<tf.Tensor: shape=(), dtype=float32, numpy=2.7182817>
x = tf.exp(3.)
# 對數運算
tf.math.log(x) 
<tf.Tensor: id=472, shape=(), dtype=float32, numpy=3.0>
x = tf.constant([1.,2.])
x = 10**x
# 換底公式
tf.math.log(x)/tf.math.log(10.) 
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([1., 2.], dtype=float32)>

5.4 矩陣相乘運算

神經網路中間包含了大量的矩陣相乘運算,前面我們已經介紹了通過@運算子可以方
便的實作矩陣相乘,還可以通過 tf.matmul(a, b)實作,需要注意的是,TensorFlow 中的矩陣
相乘可以使用批量方式,也就是張量 a,b 的維度數可以大于 2,當張量 a,b 維度數大于 2
時,TensorFlow 會選擇 a,b 的最后兩個維度進行矩陣相乘,前面所有的維度都視作 Batch 維 度,

根據矩陣相乘的定義,a 和 b 能夠矩陣相乘的條件是,a 的倒數第一個維度長度(列)和 b 的倒數第二個維度長度(行)必須相等,比如張量 a shape:[4,3,28,32]可以與張量 b
shape:[4,3,32,2]進行矩陣相乘:

a = tf.random.normal([1,2,3,4])
b = tf.random.normal([1,2,4,3])
# 批量形式的矩陣相乘
a@b
<tf.Tensor: shape=(1, 2, 3, 3), dtype=float32, numpy=
array([[[[ 0.68976855, -0.6210845 , -0.5555833 ],
         [ 0.85787934,  2.1133952 , -4.354555  ],
         [-1.2786795 ,  2.2707722 ,  2.1012263 ]],

        [[ 1.6670487 ,  0.176045  ,  0.5425054 ],
         [-1.7086754 , -0.12377246, -0.5034031 ],
         [-0.47702566, -0.49839175,  0.3666957 ]]]], dtype=float32)>

矩陣相乘函式支持自動 Broadcasting 機制:

a = tf.random.normal([1,2,3])
b = tf.random.normal([3,2])
# 先自動擴展,再矩陣相乘
tf.matmul(a,b)
<tf.Tensor: shape=(1, 2, 2), dtype=float32, numpy=
array([[[ 0.00706174,  0.4290892 ],
        [-3.5093076 , -2.220005  ]]], dtype=float32)>

6.前向傳播實戰

三層神經網路的實作:

o𝑢𝑡 = 𝑟𝑒𝑙𝑢{𝑟𝑒𝑙𝑢{𝑟𝑒𝑙𝑢[𝑋@𝑊1 + 𝑏1]@𝑊2 + 𝑏2}@𝑊 + 𝑏 }

我們采用的資料集是 MNIST 手寫數字圖片集,輸入節點數為 784,第一層的輸出節點數是
256,第二層的輸出節點數是 128,第三層的輸出節點是 10,也就是當前樣本屬于 10 類別
的概率,

import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow.keras.datasets as datasets

plt.rcParams['font.size'] = 16
plt.rcParams['font.family'] = ['STKaiti']
plt.rcParams['axes.unicode_minus'] = False

加載資料集:

在前向計算時,首先將 shape 為[𝑏, 28,28]的輸入資料 Reshape 為[𝑏, 784],將真實的標注張量 y 轉變為 one-hot 編碼

def load_data():
    # 加載 MNIST 資料集
    (x, y), (x_val, y_val) = datasets.mnist.load_data()
    # 轉換為浮點張量, 并縮放到-1~1
    x = tf.convert_to_tensor(x, dtype=tf.float32) / 255.
    # 轉換為整形張量
    y = tf.convert_to_tensor(y, dtype=tf.int32)
    # one-hot 編碼
    y = tf.one_hot(y, depth=10)
    # 改變視圖, [b, 28, 28] => [b, 28*28]
    x = tf.reshape(x, (-1, 28 * 28))

    # 構建資料集物件
    train_dataset = tf.data.Dataset.from_tensor_slices((x, y))
    # 批量訓練
    train_dataset = train_dataset.batch(200)
    return train_dataset
a = load_data()

創建每個非線性函式的 w,b 引數張量:

def init_paramaters():
    # 每層的張量都需要被優化,故使用 Variable 型別,并使用截斷的正太分布初始化權值張量
    # 偏置向量初始化為 0 即可
    # 第一層的引數
    w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
    b1 = tf.Variable(tf.zeros([256]))
    # 第二層的引數
    w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
    b2 = tf.Variable(tf.zeros([128]))
    # 第三層的引數
    w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
    b3 = tf.Variable(tf.zeros([10]))
    return w1, b1, w2, b2, w3, b3
def train_epoch(epoch, train_dataset, w1, b1, w2, b2, w3, b3, lr=0.001):
    for step, (x, y) in enumerate(train_dataset):
        with tf.GradientTape() as tape:
            # 第一層計算, [b, 784]@[784, 256] + [256] => [b, 256] + [256] => [b,256] + [b, 256]
            h1 = x @ w1 + tf.broadcast_to(b1, (x.shape[0], 256))
            h1 = tf.nn.relu(h1)  # 通過激活函式

            # 第二層計算, [b, 256] => [b, 128]
            h2 = h1 @ w2 + b2
            h2 = tf.nn.relu(h2)
            # 輸出層計算, [b, 128] => [b, 10]
            out = h2 @ w3 + b3

            # 計算網路輸出與標簽之間的均方差, mse = mean(sum(y-out)^2)
            # [b, 10]
            loss = tf.square(y - out)
            # 誤差標量, mean: scalar
            loss = tf.reduce_mean(loss)

            # 自動梯度,需要求梯度的張量有[w1, b1, w2, b2, w3, b3]
            grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])

        # 梯度更新, assign_sub 將當前值減去引數值,原地更新
        w1.assign_sub(lr * grads[0])
        b1.assign_sub(lr * grads[1])
        w2.assign_sub(lr * grads[2])
        b2.assign_sub(lr * grads[3])
        w3.assign_sub(lr * grads[4])
        b3.assign_sub(lr * grads[5])    
    
    return loss.numpy()
def train(epochs):
    losses = []
    train_dataset = load_data()
    w1, b1, w2, b2, w3, b3 = init_paramaters()
    for epoch in range(epochs):
        loss = train_epoch(epoch, train_dataset, w1, b1, w2, b2, w3, b3, lr=0.001)
        print('epoch:', epoch, 'loss:', loss)
        losses.append(loss)

    x = [i for i in range(0, epochs)]
    # 繪制曲線
    plt.plot(x, losses, color='blue', marker='s', label='train')
    plt.xlabel('Epoch')
    plt.ylabel('MSE')
    plt.legend()
    plt.show()
train(epochs=20)
epoch: 0 loss: 0.1580837
epoch: 1 loss: 0.14210287
epoch: 2 loss: 0.13077658
epoch: 3 loss: 0.12195561
epoch: 4 loss: 0.114933565
epoch: 5 loss: 0.10921349
epoch: 6 loss: 0.10445824
epoch: 7 loss: 0.10043198
epoch: 8 loss: 0.09693184
epoch: 9 loss: 0.0938519
epoch: 10 loss: 0.091136694
epoch: 11 loss: 0.08872058
epoch: 12 loss: 0.08654878
epoch: 13 loss: 0.08458985
epoch: 14 loss: 0.08280441
epoch: 15 loss: 0.08116647
epoch: 16 loss: 0.07964487
epoch: 17 loss: 0.07823177
epoch: 18 loss: 0.07691963
epoch: 19 loss: 0.07569754

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/179514.html

標籤:其他

上一篇:python爬蟲—分析Ajax請求對json檔案爬取今日頭條街拍美圖

下一篇:【資料結構與演算法】三個經典案例帶你了解動態規劃

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more