1. 程式人生 > >tensorflow(1) 基礎: 神經網絡基本框架

tensorflow(1) 基礎: 神經網絡基本框架

決定 所有 start 梯度 span truncated 正態分布 variables data

1.tensorflow 的計算得到的是計算圖graph

import tensorflow as tf
a=tf.constant([1.0,2.0])
b=tf.constant([3.0,4.0])
c=a+b
print(c)

結果:Tensor("add_5:0", shape=(2,), dtype=float32)

得到計算圖(graph),不計算 其中
shape=(2,0)表示一維 ,長度2 dtype是數據類型

若要計算, 需要用到會話session

x=tf.constant([[1.0,2.0]]) #張量
w=tf.constant([[3.0],[4.0]])
y=tf.matmul(x,w)
print(y) #得到計算圖 graph with tf.Session()as sess: #利用會話 運行 print(sess.run(y))

得到 y=11.0

除了tf.conatant, 還有其他: tf.zeros, tf.ones

tf.fill 全定值數組

print(tf.zeros([3,2]))
print(tf.ones([3,2]))
print(tf.fill([3,2],6)) #全定值數組
print(tf.constant([3,2,1]))

得到未計算的計算graph
Tensor("zeros:0", shape=(3, 2), dtype=float32)
Tensor("ones:0", shape=(3, 2), dtype=float32)
Tensor("Fill:0", shape=(3, 2), dtype=int32)
Tensor("Const_20:0", shape=(3,), dtype=int32)

2.生成隨機數 tf.Variable

w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1))# 2行3列
print(w)

得到 <tf.Variable Variable_18:0 shape=(2, 3) dtype=float32_ref>

若seed沒有則隨機數每次不同, 2*3shape
上述tf.random_normal() 可以用tf.truncated_normal()替換,
表示去掉過大偏離點的正態分布
tf.random_uniform() 平均分布

3. 神經網絡實現步驟

step1 準備數據集,提取特征,作為輸入餵給神經網絡(natural network NN)

step2 搭建NN結構, 從輸入到輸出(先搭建計算圖,再用會話執行)(NN前向傳播算法,計算輸出)

step 3 大量特征數據餵給NN,叠代優化NN參數(NN反向傳播算法,將輸出反向傳給神經網絡,調節參數優化參數訓練模型)

step4 使用訓練好的模型預測和分類
其中上述123 是訓練過程, 第4步是使用過程(應用)

eg: 前向傳播的example

生產一批零件 體積x1 重量 x2 作為輸入,通過NN後輸出一個參數

x=tf.constant([[0.7,0.5]]) #定義輸入和參數
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
with tf.Session() as sess: #會話計算結果
    init_op=tf.global_variables_initializer() #初始化所有變量的函數,初始化為一個節點
    sess.run(init_op)
    print(sess.run(y))

得到 [[3.0904665]]
#tf.placeholder餵入數據
x=tf.placeholder(tf.float32,shape=(1,2)) # 實現餵一組數據 w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1)) w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) a=tf.matmul(x,w1) y=tf.matmul(a,w2) with tf.Session() as sess: #用會話計算結果 init_op=tf.global_variables_initializer() sess.run(init_op) print(sess.run(y,feed_dict={x:[[0.7,0.5]]})) #餵一組數據

若要為餵入多組數據:

x=tf.placeholder(tf.float32,shape=(None,2)) #實現餵多組數據 不知餵幾組,設為None
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
with tf.Session() as sess: #用會話計算結果
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y,feed_dict={x:[[0.7,0.5],[0.3,0.4],[0.4,0.5]]}))

得到:

[[3.0904665]
[1.7270732]
[2.2305048]]

4.反向傳播:訓練模型參數w1 w2 ,在所有參數上用梯度下降,使得NN模型在訓練數據上的損失函數最小,損失函數loss 預測值y 與已知答案 y_ 的差距

loss可以用均方誤差, 均方誤差MSE MSE(y_,y)=sum(y-y_)^2/n

loss=tf.reduce_mean(tf.square(y_-y))
反向傳播的訓練方法,以減小loss為優化目標,可以選擇以下三個方法,都需要學習率
(決定每次參數更新的幅度), 一般選一個小一點的值0.001

train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step=tf.train.MomentumOptimizer(learning_rate,momentum).minimize(loss)
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
#神經網絡基本框架 記住!!!
batch_size=8 #一次餵給神經網絡多少數據 
seed=23455
rng=np.random.RandomState(seed) #基於seed產生隨機數
X=rng.rand(32,2) #32組數據(每組兩個數據,體積,重量)
#從x這32行的矩陣中取出一行小於 則y賦值為1,大於1則賦值為0
Y=[[int(x0+x1<1)] for (x0,x1) in X]

print(X:\n,X)
print(Y:\n,Y)
#定義神經網絡的輸入 參數 輸出 定義前向傳播過程
x=tf.placeholder(tf.float32,shape=(None,2)) 
y_=tf.placeholder(tf.float32,shape=(None,1)) # 合格或者不合格的特征
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))    
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)   
#定義損失函數 後向傳播方法
loss=tf.reduce_mean(tf.square(y_-y))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#train_step=tf.train.MomentumOptimizer(0.001,0.9).minimize(loss) #其他方法
#train_step=tf.train.AdamOptimizer(0.001).minimize(loss)   

#生成會話 訓練    
with tf.Session() as sess: #用會話計算結果
    init_op=tf.global_variables_initializer()
    sess.run(init_op)   
    print(w1:\n, sess.run(w1)) #輸出目前(未經訓練的)參數取值
    print(w2:\n, sess.run(w2))
#訓練模型 
    steps=3000 #訓練3000次
    for i in range(steps):
        start=(i*batch_size) %32
        end=start+batch_size
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]}) #8組數據
        if i % 500==0:  #每500輪打印一次loss值
            total_loss=sess.run(loss,feed_dict={x:X,y_:Y})
            print(After %d training steps,loss on all data is %g %(i,total_loss))
    print(w1:\n, sess.run(w1)) #輸出訓練後的參數
    print(w2:\n, sess.run(w2))

X:
[[0.83494319 0.11482951]
[0.66899751 0.46594987]
[0.60181666 0.58838408]
[0.31836656 0.20502072]
[0.87043944 0.02679395]
[0.41539811 0.43938369]
[0.68635684 0.24833404]
[0.97315228 0.68541849]
[0.03081617 0.89479913]
[0.24665715 0.28584862]
[0.31375667 0.47718349]
[0.56689254 0.77079148]
[0.7321604 0.35828963]
[0.15724842 0.94294584]
[0.34933722 0.84634483]
[0.50304053 0.81299619]
[0.23869886 0.9895604 ]
[0.4636501 0.32531094]
[0.36510487 0.97365522]
[0.73350238 0.83833013]
[0.61810158 0.12580353]
[0.59274817 0.18779828]
[0.87150299 0.34679501]
[0.25883219 0.50002932]
[0.75690948 0.83429824]
[0.29316649 0.05646578]
[0.10409134 0.88235166]
[0.06727785 0.57784761]
[0.38492705 0.48384792]
[0.69234428 0.19687348]
[0.42783492 0.73416985]
[0.09696069 0.04883936]]
Y:
[[1], [0], [0], [1], [1], [1], [1], [0], [1], [1], [1], [0], [0], [0], [0], [0], [0], [1], [0], [0], [1], [1], [0], [1], [0], [1], [1], [1], [1], [1], [0], [1]]
w1:
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
w2:
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]
After 0 training steps,loss on all data is 5.13118
After 500 training steps,loss on all data is 0.429111
After 1000 training steps,loss on all data is 0.409789
After 1500 training steps,loss on all data is 0.399923
After 2000 training steps,loss on all data is 0.394146
After 2500 training steps,loss on all data is 0.390597
w1:
[[-0.7000663 0.9136318 0.08953571]
[-2.3402493 -0.14641267 0.58823055]]
w2:
[[-0.06024267]
[ 0.91956186]
[-0.0682071 ]]

tensorflow(1) 基礎: 神經網絡基本框架