1. 程式人生 > >【手把手TensorFlow】一、從開始使用TensorFlow到弄清楚“搭建神經網路套路”

【手把手TensorFlow】一、從開始使用TensorFlow到弄清楚“搭建神經網路套路”

一、基本概念

基於TensorFlow的NN(神經網路):
1.張量:即多維陣列,表示資料
2.計算圖:搭建神經網路,不運算
3.會話:執行計算圖

注:用階表示張量的維度,t=[[]]表示2階,t=[[[]]]表示3階。數張量右邊括號數。
0階張量表示數
1階張量表示陣列
2階張量表示矩陣

測試樣例一

import tensorflow as tf

'''測試1'''
a=tf.constant([1.0,2.0])#1階張量,表示長度為2的一個數組。
b=tf.constant([3.0,4.0])
result=a+b
print(result))#也應該為1階張量,表示長度為2的一個數組。

Tensor(“add:0”, shape=(2,), dtype=float32)
表示名為"add:0"的張量,shape=(2,)表示長度為2的一維陣列,dtype=float32表示資料型別

測試樣例二

'''測試2'''
x=tf.constant([[1.0,2.0]])#2階張量,表示1X2矩陣
w=tf.constant([[3.0],[4.0]])#2階張量,表示2X1矩陣
y=tf.matmul(x,w)#矩陣相乘
print(y)
##顯示運算結果需要執行,即需要會話Session()
with tf.Session() as sess:
    print(sess.
run(y))

得到[[11.]],即1.03.0+2.04.0=11.0

二、神經網路的搭建

1.神經網路的引數

一般會先隨機生成引數,生成引數格式:tf.Variable(生成引數的方法)
生成引數的方法:
tf.random_normal() 生成正態分佈的隨機數
tf.zeros() 生成全0陣列
···

如:w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1))
①隨機種子如果去掉每次生成的隨機數將不一致。
②如果沒有特殊要求標準差、均值、隨機種子是可以不寫的。
tf.zeros([3,2],int32)表示生成[[0,0],[0,0],[0,0]]

2.搭建過程

2.1準備資料集,提取特徵,餵給NN
2.2搭建NN結構,從輸入到輸出。先計算圖,後會話執行。——前向傳播
2.3大量特徵餵給NN,迭代優化NN引數——反向傳播
2.4預測+分類

'''前向傳播'''
x=tf.placeholder(tf.float32,shape=(None,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("y is:\n", sess. run(y, feed_dict={x:[[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))

第一組喂體積0.7、重量0.5,第二組喂體積0.2、重量0.3,第三組喂體積0.3、重量0.4,第四組喂體積0.4、重量0.5.

三、含反向傳播的完整例項

0.匯入模組

import tensorflow as tf 
import numpy as np 
BATCH_SIZE=8
seed =23455
#基於seed產生隨機數
rng =np.random.RandomState(seed)
#糖機散返回32行2列的矩陣表示32組體積和重量作為輸入資料集
X=rng.rand(32,2)
#從X這個32行2列的矩陣中取出一行利斷如果和小於1給Y賺值1如果和不小於1給Y賦值0
#作為輸入資料集的標籤(正確答案)
Y=[[int(x0+x1<1)]for(x0,x1)in X]
print("X:\n",X)
print("Y:\n",Y)

1.定義神經網路的輸入、引數和輸出,定義前向傳播過程

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)

2.定義損失函式及反向傳播方法

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_mse)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)

3生成會話,訓練STEPS輪

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
    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]})
        if i % 500 == 0:
            total_loss = sess.run(loss, feed_dict={x: X, y_: Y})
            print("After %d training step(s), loss_mse on all data is %g" % (i, total_loss))
    
    # 輸出訓練後的引數取值。
    print( "w1:\n", sess.run(w1))
    print( "w2:\n", sess.run(w2))

輸出結果:
在這裡插入圖片描述

總結

關鍵是先搭建前向傳播神經網路,形成網路邏輯通路。在用反向傳播更新優化引數,提升模型效果。

有關TensorFlow要熟悉變數,計算圖,會話區別和聯絡:用變數儲存特徵,計算圖搭建框架,最終用會話執行。