7 tensorflow神經網路前向傳播

2021-10-24 08:42:56 字數 3087 閱讀 9815

import tensorflow as tf

import tensorflow.keras.datasets as datasets

defload_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

definit_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

deftrain_epoch

(epoch, train_dataset, w1, b1, w2, b2, w3, b3, lr=

0.001):

for step,

(x, y)

inenumerate

(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]

)if step %

100==0:

print

(epoch, step,

'loss:'

, loss.numpy())

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

) x =

[i for i in

range(0

, epochs)

]if __name__ ==

'__main__'

: train(epochs=

20)

Tensorflow卷積神經網路

卷積神經網路 convolutional neural network,cnn 是一種前饋神經網路,在計算機視覺等領域被廣泛應用.本文將簡單介紹其原理並分析tensorflow官方提供的示例.關於神經網路與誤差反向傳播的原理可以參考作者的另一篇博文bp神經網路與python實現.卷積是影象處理中一種...

Tensorflow 深層神經網路

維基百科對深度學習的定義 一類通過多層非線性變換對高複雜性資料建模演算法的合集.tensorflow提供了7種不同的非線性啟用函式,常見的有tf.nn.relu,tf.sigmoid,tf.tanh.使用者也可以自己定義啟用函式.3.1.1 交叉熵 用途 刻畫兩個概率分布之間的距離,交叉熵h越小,兩...

Tensorflow(三) 神經網路

1 前饋傳播 y x w1 b1 w2 b2 import tensorflow as tf x tf.constant 0.9,0.85 shape 1,2 w1 tf.variable tf.random normal 2,3 stddev 1,seed 1 name w1 w2 tf.vari...