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