1. 程式人生 > >1.4激活函數-帶隱層的神經網絡tf實戰

1.4激活函數-帶隱層的神經網絡tf實戰

ima 需要 logs .com horizon optimizer 數量 sid ont

激活函數

激活函數----日常不能用線性方程所概括的東西

左圖是線性方程,右圖是非線性方程

當男生增加到一定程度的時候,喜歡女生的數量不可能無限制增加,更加趨於平穩

技術分享圖片

在線性基礎上套了一個激活函數,使得最後能得到輸出結果

技術分享圖片

常用的三種激活函數:

取值不同時得到的結果也不同

技術分享圖片

技術分享圖片

常見激活函數圖形

技術分享圖片

tensorflow中自帶的激活函數舉例:

技術分享圖片

添加隱層的神經網絡

#添加隱層的神經網絡結構
import tensorflow as tf

def add_layer(inputs,in_size,out_size,activation_function=None):
    #定義權重--隨機生成inside和outsize的矩陣
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))
    #不是矩陣,而是類似列表
    biaes=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biaes
    if activation_function is  None:
        outputs=Wx_plus_b
    else:
        outputs=activation_function(Wx_plus_b)
    return outputs

import numpy as np
x_data=np.linspace(-1,1,300)[:,np.newaxis] #300行數據
noise=np.random.normal(0,0.05,x_data.shape)
y_data=np.square(x_data)-0.5+noise
#None指定sample個數,這裏不限定--輸出屬性為1
xs=tf.placeholder(tf.float32,[None,1])  #這裏需要指定tf.float32,
ys=tf.placeholder(tf.float32,[None,1])

#建造第一層layer
#輸入層(1)
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)
#隱層(10)
prediction=add_layer(l1,10,1,activation_function=None)
#輸出層(1)
#預測prediction
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
                   reduction_indices=[1])) #平方誤差
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

init=tf.initialize_all_variables()
sess=tf.Session()
#直到執行run才執行上述操作
sess.run(init)
for i in range(1000):
    #這裏假定指定所有的x_data來指定運算結果
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if i%50:
        print (sess.run(loss,feed_dict={xs:x_data,ys:y_data}))

顯示:

1.11593
0.26561
0.167872
0.114671
0.0835957
0.0645237
0.0524448
0.0446363
0.039476
0.0360211
0.0336599
0.0320134
0.0308378
0.0299828
0.029324
0.0287996
0.0283558
0.0279624
0.0276017
0.02726
0.0269316
0.0266103
0.026298
0.0259914
0.0256905
0.025395
0.0251055
0.0248204
0.024538
0.0242604
0.023988
0.0237211
0.0234583
0.0231979
0.0229418
0.0226901
0.0224427
0.0221994
0.0219589
0.0217222
0.0214888
0.0212535
0.0210244
0.0207988
0.0205749
0.0203548
0.0201381

增加np.newaxis

np.newaxis 為 numpy.ndarray(多維數組)增加一個軸

>> type(np.newaxis)
NoneType
>> np.newaxis == None
True

np.newaxis 在使用和功能上等價於 None,其實就是 None 的一個別名。

1. np.newaxis 的實用

>> x = np.arange(3)
>> x
array([0, 1, 2])
>> x.shape
(3,)

>> x[:, np.newaxis]
array([[0],
       [
1], [2]]) >> x[:, None] array([[0], [1], [2]]) >> x[:, np.newaxis].shape (3, 1)

2. 索引多維數組的某一列時返回的是一個行向量

>>> X = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> X[:, 1]
array([2, 6, 10])       % 這裏是一個行
>>> X[:, 1].shape       % X[:, 1] 的用法完全等同於一個行,而不是一個列,
(3, )

如果我們索引多維數組的某一列時,返回的仍然是列的結構,一種正確的索引方式是:

>>>X[:, 1][:, np.newaxis]
array([[2],
      [6],
      [10]])

如果想實現第二列和第四列的拼接(層疊):

>>>X_sub = np.hstack([X[:, 1][:, np.newaxis], X[:, 3][:, np.newaxis]])           
                   % hstack:horizontal stack,水平方向上的層疊
>>>X_sub
array([[2, 4]
      [6, 8]
      [10, 12]])

當然更為簡單的方式還是使用切片:

>> X[:, [1, 3]]
array([[ 2,  4],
       [ 6,  8],
       [10, 12]])

1.4激活函數-帶隱層的神經網絡tf實戰