反向傳播(bpn)演算法是神經網路中研究最多、使用最多的演算法之一,它用於將輸出層中的誤差傳播到隱藏層的神經元,然後用於更新權重。
學習 bpn 演算法可以分成以下兩個過程:
正向傳播:輸入被饋送到網路,訊號從輸入層通過隱藏層傳播到輸出層。在輸出層,計算誤差和損失函式。
反向傳播:在反向傳播中,首先計算輸出層神經元損失函式的梯度,然後計算隱藏層神經元損失函式的梯度。接下來用梯度更新權重。
這兩個過程重複迭代直到收斂。使用mnist資料集
具體實現過程
# 反向傳播(bpn)演算法
# 匯入模組
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# 載入資料集,通過設定 one_hot=true 來使用獨熱編碼標籤
mnist = input_data.read_data_sets(
"mnist_data"
, one_hot=
true
)'''
定義超引數和其他常量。這裡,每個手寫數字的尺寸是 28×28=784 畫素。
資料集被分為 10 類,以 0 到 9 之間的數字表示。這兩點是固定的。
學習率、最大迭代週期數、每次批量訓練的批量大小以及隱藏層中的神經元數量都是超引數。
可以通過調整這些超引數,看看它們是如何影響網路表現的.
'''n_input =
784n_classes =
10max_epochs =
10000
learning_rate =
0.5batch_size =
10seed =
0n_hidden =
30# 需要sigmoid函式的導數來進行權重更新,所以定義它:
defsigmaprime
(x):
return tf.multiply(tf.sigmoid(x)
, tf.subtract(tf.constant(
1.0)
, tf.sigmoid(x)))
# 為訓練資料建立佔位符:
x_in = tf.compat.v1.placeholder(tf.float32,
[none
, n_input]
)y = tf.compat.v1.placeholder(tf.float32,
[none
, n_classes]
)# 建立模型
defmultilayer_perceptron
(x, weights, biases)
: h_layer_1 = tf.add(tf.matmul(x, weights[
'h1'])
, biases[
'h1'])
out_layer_1 = tf.sigmoid(h_layer_1)
h_out = tf.matmul(out_layer_1, weights[
'out'])
+ biases[
'out'
]return tf.sigmoid(h_out)
, h_out, out_layer_1, h_layer_1
# 定義權重和偏置變數
weights =
biases =
# 為正向傳播、誤差、梯度和更新計算建立計算圖
# forward pass
y_hat, h_2, o_1, h_1 = multilayer_perceptron(x_in, weights, biases)
# error
err = y_hat - y
# backward pass
delta_2 = tf.multiply(err, sigmaprime(h_2)
)delta_w_2 = tf.matmul(tf.transpose(o_1)
, delta_2)
wtd_error = tf.matmul(delta_2, tf.transpose(weights[
'out'])
)delta_1 = tf.multiply(wtd_error, sigmaprime(h_1)
)delta_w_1 = tf.matmul(tf.transpose(x_in)
, delta_1)
eta = tf.constant(learning_rate)
# 更新引數(update weights)
step =
[ tf.compat.v1.assign(weights[
'h1'
], tf.subtract(weights[
'h1'
], tf.multiply(eta, delta_w_1)))
, tf.compat.v1.assign(biases[
'h1'
], tf.subtract(biases[
'h1'
], tf.multiply(eta, tf.reduce_mean(delta_1, axis=[0
])))
),tf.compat.v1.assign(weights[
'out'
], tf.subtract(weights[
'out'
], tf.multiply(eta, delta_w_2)))
, tf.assign(biases[
'out'
], tf.subtract(biases[
'out'
], tf.multiply(eta, tf.reduce_mean(delta_2, axis=[0
])))
)]# 定義計算精度accuracy的操作
acc_mat = tf.equal(tf.argmax(y_hat,1)
, tf.argmax(y,1)
)accuracy = tf.reduce_sum(tf.cast(acc_mat, tf.float32)
)# 初始化變數:
init = tf.compat.v1.global_variables_initializer(
)# 執行圖:
with tf.compat.v1.session(
)as sess:
sess.run(init)
for epoch in
range
(max_epochs)
: batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(step, feed_dict=
)if epoch %
1000==0
: acc_test = sess.run(accuracy, feed_dict=
) acc_train = sess.run(accuracy, feed_dict=
)print
('epoch: accuracy train%: accuracy test%:'
.format
(epoch, acc_train /
600,
(acc_test /
100)
))
TensorFlow實現MNIST反向傳播
coding utf 8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data defsigmaprime x 用sigmoid函式的導數更新權重 param x return 更新後的權...
TensorFlow反向傳播演算法實現
tensorflow反向傳播演算法實現 反向傳播 bpn 演算法是神經網路中研究最多 使用最多的演算法之一,用於將輸出層中的誤差傳播到隱藏層的神經元,然後用於更新權重。學習 bpn 演算法可以分成以下兩個過程 正向傳播 輸入被饋送到網路,訊號從輸入層通過隱藏層傳播到輸出層。在輸出層,計算誤差和損失函...
tensorflow reverse 反向傳播
1 tensorflow的反向傳播 import tensorflow as tf import numpy as np batch size 8 seed 23455 基於seed產生隨機數 rng np.random.randomstate seed 隨機數返回32行2列的矩陣 表示32組 體積...