TensorFlow實現MNIST反向傳播

2021-09-12 02:01:56 字數 3574 閱讀 1634

# coding=utf-8

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

defsigmaprime

(x):

""" 用sigmoid函式的導數更新權重

:param x:

:return: 更新後的權重

"""return tf.multiply(tf.sigmoid(x)

, tf.subtract(tf.constant(

1.0)

, tf.sigmoid(x)))

# 資料集

mnist = input_data.read_data_sets(

"mnist_data/"

, one_hot=

true

)# 讀取mnist,獨熱編碼

# 定義模型

# 常數

n_input =

784# mnist尺寸(28*28)

n_classes =

10# mnist類別(0-9)

# 超引數

max_epochs =

10000

# 最大迭代數

learning_rate =

0.5# 學習率

batch_size =

10# 每批訓練批量大小

seed =

0# 隨機種子

n_hidden =

30# 隱藏層的神經元數

# 佔位符

x_in = tf.placeholder(tf.float32,

[none

, n_input]

)y = tf.placeholder(tf.float32,

[none

, n_classes]

)# 建立模型

defmultilayer_perceptron

(x, weights, biases)

: h_layer_1 = tf.add(tf.matmul(x, weights[

'h1'])

, biases[

'h1'])

# 隱藏層使用relu啟用函式

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 =

# 正向傳播

y_hat, h_2, o_1, h_1 = multilayer_perceptron(x_in, weights, biases)

# 損失函式

err = y - y_hat

loss = tf.reduce_mean(tf.square(err, name=

'loss'))

# 反向傳播

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)

# 更新權重

train =

[ tf.assign(weights[

'h1'

], tf.add(weights[

'h1'

], tf.multiply(eta, delta_w_1)))

, tf.assign(biases[

'h1'

], tf.add(biases[

'h1'

], tf.multiply(eta, tf.reduce_mean(delta_1, axis=[0

])))

), tf.assign(weights[

'out'

], tf.add(weights[

'out'

], tf.multiply(eta, delta_w_2)))

, tf.assign(biases[

'out'

], tf.add(biases[

'out'

], tf.multiply(eta, tf.reduce_mean(delta_2, axis=[0

])))

)]# 定義精度

acct_mat = tf.equal(tf.argmax(y_hat,1)

, tf.argmax(y,1)

)accuracy = tf.reduce_sum(tf.cast(acct_mat, tf.float32)

)# 訓練

init = tf.global_variables_initializer(

)with tf.session(

)as sess:

sess.run(init)

for epoch in

range

(max_epochs)

: batch_xs, batch_ys = mnist.train.next_batch(batch_size)

_, loss1 = sess.run(

[train, loss]

, feed_dict=

)if epoch %

1000==0

:print

('epoch: loss: '

.format

(epoch, loss1)

) acc_test = sess.run(accuracy, feed_dict=

) acc_train = sess.run(accuracy, feed_dict=

)# 評估

print

('accuracy train%: accuracy test%: '

.format

(epoch, acc_train /

600,

(acc_test /

100)

))

反向傳播:bn(backpropagation),計算輸出層損失函式梯度→計算隱藏層損失函式梯度→用梯度更新權重

relu啟用函式:整流線性單元,隱藏層最常使用的啟用函式。當輸入為負時不啟用神經元。

accuracy train%: 84.91833333333334 accuracy test%: 92.53

tensorflow教程學習三深入MNIST

載入資料 from tensorflow.examples.tutorials.mnist import input data mnist input data.read data sets mnist data one hot true 我們使用interactivesession類可以更加靈活地...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...

Python keras神經網路識別mnist

上次用matlab寫過乙個識別mnist的神經網路,位址在 這次又用keras做了乙個差不多的,畢竟,現在最流行的專案都是python做的,我也跟一下潮流 資料是從本地解析好的影象和標籤載入的。神經網路有兩個隱含層,都有512個節點。import numpy as np from keras.pre...