TensorFlow實現反向傳播演算法

2021-10-06 04:57:56 字數 3713 閱讀 3743

反向傳播(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組 體積...