完整神經網路樣例程式詳解

2022-06-16 10:18:09 字數 4041 閱讀 3959

主要是對《tensorflow 實戰google深度學習框架》的第三章中在模擬資料集上訓練神經網路的完整程式進行詳解,

所利用的神經網路結構圖如下

詳細**如下

import

tensorflow as tf

from numpy.random import

randomstate

#定義神經網路的引數,輸入和輸出節點

batch_size = 8w1= tf.variable(tf.random_normal([2, 3], stddev=1, seed=1))

w2= tf.variable(tf.random_normal([3, 1], stddev=1, seed=1))

x = tf.placeholder(tf.float32, shape=(none, 2), name="

x-input")

y_= tf.placeholder(tf.float32, shape=(none, 1), name='

y-input')

#定義前向傳播過程,損失函式及反向傳播演算法

a =tf.matmul(x, w1)

y =tf.matmul(a, w2)

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))

train_step = tf.train.adamoptimizer(0.001).minimize(cross_entropy)

#生成模擬資料集

rdm = randomstate(1)

x = rdm.rand(128,2)

y = [[int(x1+x2 < 1)] for (x1, x2) inx]#

建立乙個會話來執行tensorflow程式

with tf.session() as sess:

init_op =tf.global_variables_initializer()

sess.run(init_op)

#輸出目前(未經訓練)的引數取值。

print("

w1:"

, sess.run(w1))

print("

w2:"

, sess.run(w2))

print("\n"

)

#訓練模型。

steps = 5000

for i in

range(steps):

start = (i*batch_size) % 128end = (i*batch_size) % 128 +batch_size

sess.run(train_step, feed_dict=)

if i % 1000 ==0:

total_cross_entropy = sess.run(cross_entropy, feed_dict=)

print("

after %d training step(s), cross entropy on all data is %g

" % (i, total_cross_entropy))

下面我們對**進行詳細的解讀

from numpy.random import randomstate

randomstate():隨機數種子 

功能:隨機產生所需資料。這段引入主要是為了引入可以產生隨機數組的randomstate

由於在每次迭代的開始,首先需要選取一小部分訓練資料,這一小部分資料稱為乙個batch,batch_size的大小決定了一次性讀入多少批量的資料

batch_size = 8

w1= tf.variable(tf.random_normal([2, 3], stddev=1, seed=1))

w2= tf.variable(tf.random_normal([3, 1], stddev=1, seed=1))

在tensorflow中,變數(tf.variable)的作用是儲存和更新神經網路中的引數,需要指定初始值,一般是使用隨機初始值。stddev=1代表矩陣元素中的方差為1

設定輸入輸出矩陣

x = tf.placeholder(tf.float32, shape=(none, 2), name="

x-input")

y_= tf.placeholder(tf.float32, shape=(none, 1), name='

y-input

')

在tensorflow 中提供了placeholder這一機制用於提供輸入資料,placeholder相當於定義了乙個位置,這個位置中的資料在程式執行時再指定,這樣程式中就不需要生成大量常量來提供輸入資料,而只需要將這個資料通過placeholder傳入tensorflow計算圖,在placeholder定義時,這個位置上的資料型別是需要指定的,和其他張量一樣,placeholder的型別也是不可以改變的

這個函式的形式為tf.placeholder(dtype,shape=資料維度,name=資料名稱)

函式功能:

插入一張張量的佔位符,這個張量總是被餵入資料,相當於乙個形參

形參:只有在呼叫時才分配記憶體單元,在呼叫結束時,就會釋放所分配的記憶體單元

a =tf.matmul(x, w1)

y = tf.matmul(a, w2)

在這裡,由於我們做的神經網路輸入層是x,隱含層是a,輸出層是y,因此這裡主要是呼叫tensorflow中的矩陣相乘的函式實現矩陣的乘法

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 

train_step = tf.train.adamoptimizer(0.001).minimize(cross_entropy)

在得到乙個batch的前向傳播結果之後,需要定義乙個損失函式來刻畫當前的**值和真實答案之間的差距,因此我們定義了如上的損失函式來刻畫**值和真實值之間的差距

y_:正確結果,y:**結果,tf.clip_by_value(y, 1e-10, 1.0)將張量限制在1e-10和1.0之間,
rdm = randomstate(1)

x = rdm.rand(128,2)

y = [[int(x1+x2 < 1)] for (x1, x2) in x]

with tf.session() as sess:

這是tensorflow建立會話的模式,這個就是建立乙個會話,並通過python中的上下文管理器來管理這個會話,通過python的上下文管理機制,只要將所有的計算資源放在"with"的內部就可以,當上下文管理器推出時會自動釋放所有資源,這樣解決了因為異常退出時資源釋放的問題

init_op =tf.global_variables_initializer()

sess.run(init_op)

tensorflow中提供了一種便捷的方式來完成變數初始化過程,,利用以上**可以直接完成變數的初始化

steps = 5000

for i in

range(steps):

#每次選取batch_size個樣本進行訓練

start = (i*batch_size) % 128end = (i*batch_size) % 128 +batch_size

#通過選取的樣本訓練神經網路並更新

sess.run(train_step, feed_dict=)

if i % 1000 ==0:

#每隔一段時間計算所在資料的交叉熵並輸出

total_cross_entropy = sess.run(cross_entropy, feed_dict=)

print("

after %d training step(s), cross entropy on all data is %g

" % (i, total_cross_entropy))

用TensorFlow實現完整神經網路樣例程式

該樣例程式再模擬資料集上訓練神經網路解決二分類問題。coding utf 8import tensorflow as tf numpy是乙個科學計算工具包,這裡通過numpy工具包生成模擬資料集 from numpy.random import randomstate 定義訓練資料batch的大小 ...

BP神經網路詳解

一,什麼是bp bp back propagation 網路是1986年由rumelhart和mccelland為首的科學家小組提出,是一種按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一。bp網路能學習和存貯大量的輸入 輸出模式對映關係,而無需事前揭示描述這種對映關係的數學...

卷積神經網路詳解

卷積層其實是將輸入的按照filter的size與stride分割成許多local regions,然後分別作卷積運算,得到新每個點的畫素值。假設輸入為227 227 3,filter有96個,size為11 11 3,stride為4,那麼卷積運算後生成的每張大小為 227 11 4 1即55 55...