1. 程式人生 > >tensorflow實現簡單神經網路層逼近一個二次函式的demo

tensorflow實現簡單神經網路層逼近一個二次函式的demo

  構造一個滿足一元二次函式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}))