1. 程式人生 > >Tensor flow實現FCN和linear regression: Y=XW+b

Tensor flow實現FCN和linear regression: Y=XW+b

FCN(fully connect network)和linear regression其中的數學模型為:

Y=XW+b

(一)1維情形

舉慄:輸入向量x為觀測一次得到的一組特徵(N個特徵),單次輸出y為這次觀測值作出預測,其間的對映為f:R^{^{N}} \rightarrow R

共有M次觀測。

加上偏置b,可以這樣實現:

x=[x1,x2,...,xN,1]

第m列向量w=[w1,w2,...,wN,b]

程式碼:

X = tf.placeholder(tf.float32,[None,num_features])

Y = tf.placeholder(tf.float32,[None,1])

w = tf.Variable(tf.random_normal((num_features,1)),name='weights')

pred = tf.matmul(X,w)

上述運算為:

X:?× (N+1)

w:(N+1)×1

Y:?×1

點評:程式碼中num_features為N+1, 即特徵增廣1,目的是為了加上偏置b。問號為重複觀測的次數,這裡為M。可以看出,預測值pred為長度為M的一維向量。


(二)2維情形

栗子:輸入影象為N×N解析度,首先將影象每一行依次放進一個行向量,如32×32影象重排為長度1024的向量。輸出y分類的概率,共M種分類。其間的對映為:f:R^{N\times N}\rightarrow R^{M}

X = tf.placeholder(tf.float32,[None,n_dim])

Y = tf.placeholder(tf.float32,[None,n_classes])

w = tf.Variable(tf.random_normal([n_dim,n_classes],stddev=0.01),name='weights')

b = tf.Variable(tf.random_normal([n_classes]),name='weights')

out = tf.matmul(X,w) + b

上述運算為

X:?× (N×N)

w:(N × N) × M

Y:?× M

b: M × 1

點評:程式碼中n_dim即是N×N,n_class即是M。問號?代表共K副影象。那麼上述運算除了矩陣相乘,還涉及第三維,即輸出out的size:1×M×K,便於理解。