利用 getTrain_X() 隨機取的0~1之間的浮點數.
定義getTrain_Y() 的轉換函數,運算後輸出答案
build_NN 建立神經網路,試圖學習Train_Y中的數學函數
本測試針對單一神經元可以學習的函數複雜度進行測試
#-*- coding: utf-8 -*- #引用必要函數 import tensorflow as tf import numpy as np def getTrain_X(): # creat data #創造 亂數100個亂數 值介於0~1之間 x_data = np.random.rand(100).astype(np.float32) return x_data def getTrain_Y(x_data): #訂出要學習的函數 這裡要學的是 weight:0.1 biases:0.3 #y_data = x_data*0.6+0.3 #y_data = (x_data * x_data) * 0.6 + 0.3 y_data = x_data*x_data + 0.6 * x_data + 0.3 return y_data def build_NN(train_x,train_y): ###creat tensorflow structure start### #定立 weights 的 範圍 和初始化 Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0)) biases = tf.Variable(tf.zeros([1])) #定立 給 tensorflow 學習的函數 y = Weights * train_x + biases #建立 loss 規則 loss = tf.reduce_mean(tf.square(y-train_y)) #選擇學習機制 optimizer = tf.train.GradientDescentOptimizer(0.5) #learning rate #像tensorflow 說 訓練規則就是把 loss 減到最小 最好是0 train = optimizer.minimize(loss) return (train,Weights,biases) def main(): x_data = getTrain_X() y_data = getTrain_Y(x_data) (train,Weights,biases) = build_NN(x_data,y_data) sess = tf.Session() #sess.run(tf.initialize_all_variables()) #Very important sess.run(tf.global_variables_initializer()) """ 跑 for 迴圈 更新wight201次 然後每訓練20次 印出一次 Weight """ for step in range(201): sess.run(train) if step % 20 ==0: print(step,sess.run(Weights),sess.run(biases)) if __name__ == '__main__': main()
透過定義不同的目標函數測試 單一神經元的學習能力:
y_data = (x_data * x_data) * 0.6 + 0.3
y_data = x_data * 0.6 + 0.3
y_data = x_data*x_data + 0.6 * x_data + 0.3
由上述測試中可以發現,神經元對於單一變數的學習能力非常優越,及便是二次函數能可輕易學習.找出正確的a與b.
然而當數學式為ax^2 + ax + b =y 時,單一神經元明顯無法有效學習。
文章標籤
全站熱搜
留言列表