# 添加神經層
# add layer
# 層包括weights,biases,激勵函數
import tensorflow as tf
import numpy as np
# 添加層,有輸入,輸入輸出大小,激勵函數(默認是為None,則是線性函數)
def add_layer(inputs,in_size,out_size,activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size,out_size])) # 權重 用隨機變量會比全部為0好很多 ,這里未變量矩陣
biases = tf.Variable(tf.zeros([1,out_size]) + 0.1) # biases不是矩陣,是類似列表的東西,在激勵學習中,biases推薦不為0
Wx_plus_b = tf.matmul(inputs,Weights) + biases # 矩陣乘法 這是預測的值,還沒被激活
if activation_function is None:
outputs = Wx_plus_b # 如果是線性函數則不需要添加激勵函數(因為激勵函數是非線性方程)
else:
outputs = activation_function(Wx_plus_b) # 把Wx_plus_b激活
return outputs
x_data = np.linspace(-1,1,300)[:,np.newaxis] # 建立-1到1的區間有300個單位,添加維度
noise = np.random.normal(0,0.05,x_data.shape) # 添加噪點,讓它更像真實數據,方差是0.05,跟x_data一樣的格式
y_data = np.square(x_data) - 0.5 + noise # 構建y_data為x_data的平方
xs = tf.placeholder(tf.float32,[None,1]) # None表示輸出多少都ok
ys = tf.placeholder(tf.float32,[None,1])
# 建造第一層layer (輸入層,隱藏層,輸出層) 典型的神經網絡,三層神經 ,只有一個屬性, 一個神經元
# 定義隱藏層
layer1 = add_layer(xs,1,10,activation_function=tf.nn.relu) # 輸入一個參數,隱藏層有10個神經元,使用tensorflow自帶的激勵方程
prediction = add_layer(layer1,10,1,activation_function=None) # 輸出層
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) # 算出prediction跟真實值的區別,求和后再求平均值
# 練習,提升誤差
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 學習效率(0.1), 減少誤差, 用小步訓練更能體現訓練的效率
init = tf.initialize_all_variables() # 初始化所有變量
sess = tf.Session()
sess.run(init) # 運算
for i in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
# 輸出結果,如果誤差不斷減少則效率提升
if i % 50 == 0:
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
輸出
0.587287
0.00809391
0.00612073
0.00531567
0.0048084
0.00443714
0.00415135
0.00392712
0.00374785
0.00360647
0.00348928
0.0033773
0.00327797
0.00318462
0.00310172
0.00303527
0.00297711
0.00292976
0.00288618
0.00284872
誤差越來越少