深度強化學習篇1:神經網絡迴歸實例---複雜函數擬合

擅長一件事,喜歡一件事,工作一件事。如果三件事重合,就不要躊躇了。 

一、TensorFlow2

TensorFlow的張量與數據流圖:一維張量如向量,二維張量如矩陣,以此類推。TensorFlow的數據流圖如下。

                                                                  

二、神經網絡基礎編程實例

1、TensorFlow例程1——TensorFlow結構,優化器逼近函數參數

import tensorflow as tf
import numpy as np

# 數據
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3
# 權重和偏置
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases = tf.Variable(tf.zeros([1]))
# 估計y
y = Weights*x_data+biases
loss = tf.reduce_mean(tf.square(y-y_data))
# 設置優化器
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 初始化全部變量
init = tf.initialize_all_variables()
# 設置對話
sess = tf.Session()
sess.run(init)
for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step,sess.run(Weights),sess.run(biases))

2、TensorFlow例程2——構建三層神經網絡預測函數輸出(300一維數據輸入,輸出預測值,損失函數爲誤差平和方均值)

一維數據輸入,全連接層10個神經元。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
plt.show()

def add_layer(inputs, in_size, out_size, activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size, out_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

# 構建數據
x_data = np.linspace(-1,1,300, dtype=np.float32)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise

# 定義輸入
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

# 定義隱藏層
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)

# 定義輸出層
prediction = add_layer(l1, 10, 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)

# 初始化變量
init = tf.global_variables_initializer()

# 開啓會話
sess = tf.Session()
sess.run(init)

# 顯示圖片框
fig = plt.figure()

# 連續畫圖ax,數據點
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data, y_data)

# 訓練
for i in range(5000):
    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}))
        # 除了第一次,抹除之前預測線
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
        # 把預測用一條線表示
        lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
        plt.pause(0.1)
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))

 

訓練500次,每50次可視化一次預測曲線。 

              

訓練5000次,10個神經元,lost:0.00242。 訓練5000次,30個神經元,lost:0.00262。神經元的增加並沒有降低lost。

                                                     

                                                                            300數據,訓練5000次,10個神經元

                                                          

                                                                             100數據,訓練5000次,10個神經元

注:tensorboard左側的工具欄上的smoothing,表示在做圖的時候對圖像進行平滑處理,這樣做是爲了更好的展示參數的整體變化趨勢。如果不平滑處理的話,有些曲線波動很大,難以看出趨勢。0 就是不平滑處理,1 就是最平滑,默認是 0.6。

可視化進階1:https://blog.csdn.net/wgj99991111/article/details/84294450  Tensorflow的可視化工具Tensorboard

可視化進階2:https://blog.csdn.net/Charel_CHEN/article/details/80364841 tensorboard 平滑損失曲線代碼

3、TensorFlow例程3——建立神經網絡來擬合下圖函數

    (目標函數f(x)=0.2+0.4x2+0.3sin(15x)+0.05cos(50x)f(x)=0.2+0.4x2+0.3sin(15x)+0.05cos(50x))

                                                                

                                                              

兩層隱含層構建神經網絡擬合複雜函數曲線,lost收斂至0.000743。

三、全連接層總結

1、曲線擬合主要使用全連接層,理論上一層全連接層的神經網絡就可以擬合所有連續函數。

2、全連接層的參數:

  1. 全接解層的總層數(長度)
  2. 單個全連接層的神經元數(寬度)
  3. 激活函數

3、參數的影響:

如果全連接層寬度不變,增加長度。神經元個數增加,模型複雜度提升;全連接層數加深,模型非線性表達能力提高。理論上都可以提高模型的學習能力。

如果全連接層長度不變,增加寬度。神經元個數增加,模型複雜度提升。理論上可以提高模型的學習能力。

如果長度寬度都增加。學習能力太好容易造成過擬合。運算時間增加,效率變低。

參考鏈接:https://www.zhihu.com/question/41037974/answer/320267531  全連接層的作用是什麼?

%一些記錄

權重與偏置: 控制信號的重要性 ,權重越大,對應信號越重要。偏置是神經元被激活的容易程度,偏置越小越容易激活。

感知機的侷限:只能用一條直線分割空間,無法實現異或。但是可以通過多層感知機實現異或。

計算機與感知機:與非門的組合再現計算機的處理,因此多層感知機也可以表示計算機處理。

神經網絡與感知機:感知機使用階躍函數做激勵,人工調權重。神經網絡使用平滑激勵函數,從數據中學習權重參數。感知機中流動的是0,1二元信號。激勵函數使神經網絡實現平滑性,流動連續的實值信號。

激勵函數的選擇:激勵函數如果使用線性函數,不管如何加深層數,總存在與之等效的無隱藏層神經網絡,使加深網絡失去意義。關於輸出層的激活函數,迴歸問題用恆等函數,分類問題用softmax函數。

其它:層號從零開始,便於Python實現。輸入到輸出的(前向)運算。前向表示輸入到輸出的方向的傳遞處理。神經網絡的推理處理也叫神經網絡的前向傳播。神經網絡可以用在分類和迴歸問題上,根據需要改變輸出層的激活函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章