tensorflow實現簡單神經網路層逼近一個二次函式的demo
阿新 • • 發佈:2019-02-14
構造一個滿足一元二次函式y=a*x^2 + b的網路,生成一批原始資料,然後搭建簡單的神經網路,僅僅包含著一個輸入層、一個隱藏層和一個輸出層。通過TensorFlow吧隱藏層和輸出層的權重w和偏置b學習出來,預估隨著實驗次數的增加,loss值會不斷地減小。
接下來我們遵循一下的思路進行實驗:
1.構造資料
2.構建網路
3.訓練模型
4.評估及預測模型
一開始用numpy包生成輸入資料,然後提出假設為y=x*x - 0.5,我們構造出滿足假設的x和y資料後,同時加入一些不滿足方程的噪聲點。程式碼如下:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Jan 4 15:02:04 2018 @author: lisir """ import tensorflow as tf import numpy as np # 構造滿足一元二次方程的函式 # 構建300個點,區間[-1, 1],直接用numpy生成等差數列,然後將結果是300個點的一維陣列轉換為300X1二維陣列 x_data = np.linspace(-1, 1, 300)[:, np.newaxis] # 此處加入噪聲點,使得他們與x_data的維度一致,並且擬合成均值為0,方差為0.05正態分佈 noise = np.random.normal(0, 0.05, x_data.shape) # 假設的方程,並且加入噪聲點 y_data = np.square(x_data) - 0.5 + noise xs = tf.placeholder(tf.float32, [None, 1]) ys = tf.placeholder(tf.float32, [None, 1]) # 定義網路層 def definate_layer(inputs, in_size, out_size, activation_function=None): # 權重構造,in_sizeXout_size大小的矩陣 weights = tf.Variable(tf.random_normal([in_size, out_size])) # 偏置構造,1Xout_size大小的矩陣 biases = tf.Variable(tf.zeros([1, out_size]) + 0.1) # 做乘法 Wx_plus_b = tf.matmul(inputs, weights) + biases if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) # 輸出資料 return outputs # 構建隱藏層,設定為10個神經元 h1 = definate_layer(xs, 1, 20, activation_function=tf.nn.relu) # 構建輸出層,與輸入層一樣,包含一個神經元 prediction = definate_layer(h1, 20, 1, activation_function=None) # 構建損失函式,計算預測值與真實值的誤差 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1])) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 初始化,構建TensorFlow會話 init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) # 訓練10000次 for i in range(100000): sess.run(train_step, feed_dict={xs:x_data, ys:y_data}) if i%50 == 0: # 50次列印一次 print("loss: ", sess.run(loss, feed_dict={xs:x_data, ys:y_data}))