擅長一件事,喜歡一件事,工作一件事。如果三件事重合,就不要躊躇了。
一、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、全連接層的參數:
- 全接解層的總層數(長度)
- 單個全連接層的神經元數(寬度)
- 激活函數
3、參數的影響:
如果全連接層寬度不變,增加長度。神經元個數增加,模型複雜度提升;全連接層數加深,模型非線性表達能力提高。理論上都可以提高模型的學習能力。
如果全連接層長度不變,增加寬度。神經元個數增加,模型複雜度提升。理論上可以提高模型的學習能力。
如果長度寬度都增加。學習能力太好容易造成過擬合。運算時間增加,效率變低。
參考鏈接:https://www.zhihu.com/question/41037974/answer/320267531 全連接層的作用是什麼?
%一些記錄
權重與偏置: 控制信號的重要性 ,權重越大,對應信號越重要。偏置是神經元被激活的容易程度,偏置越小越容易激活。
感知機的侷限:只能用一條直線分割空間,無法實現異或。但是可以通過多層感知機實現異或。
計算機與感知機:與非門的組合再現計算機的處理,因此多層感知機也可以表示計算機處理。
神經網絡與感知機:感知機使用階躍函數做激勵,人工調權重。神經網絡使用平滑激勵函數,從數據中學習權重參數。感知機中流動的是0,1二元信號。激勵函數使神經網絡實現平滑性,流動連續的實值信號。
激勵函數的選擇:激勵函數如果使用線性函數,不管如何加深層數,總存在與之等效的無隱藏層神經網絡,使加深網絡失去意義。關於輸出層的激活函數,迴歸問題用恆等函數,分類問題用softmax函數。
其它:層號從零開始,便於Python實現。輸入到輸出的(前向)運算。前向表示輸入到輸出的方向的傳遞處理。神經網絡的推理處理也叫神經網絡的前向傳播。神經網絡可以用在分類和迴歸問題上,根據需要改變輸出層的激活函數。