當神經網路得到的是乙個過擬合模型時,這個模型基本是沒什麼應用價值的,因為它的泛化效能非常不好(泛化即是,機器學習模型學習到的概念在它處於學習的過程中時模型沒有遇見過的樣本時候的表現,簡單理解為**能力),對一些」異常」資料過分的估計,而忽視了問題的整體規律。
為避免過擬合,常採用的方式是新增正則化項,正則化通過限制權重大小,使得模型不能任意擬合訓練資料中的隨機雜訊。一般有兩種正則化方式:
兩種方式的區別參考l1、l2範數的比較
當然,正則化也可以是多種方式的組合,如r(
w)=∑
iα|w
i|+(
1−α)
w2i
所以,損失函式轉換成j(
θ)+λ
r(w)
,在tensorflow中實現正則項
在多層神經網路中,這樣對每層的weights都進行正則化的處理會顯得繁瑣臃腫,tensorflow也提供了一種集合weights = tf.constant([[1, 2],[3, 4]])
lambda = 0.2
# l1範數,regu=(|1|+|2|+|3|+|4|)*0.2
regu1 = tf.contrib.layers.l1_regularizer(lambda)(weights)
# l2範數(tf會將l2的結果除2,使得求導的結果更簡潔),regu=(|1|^2+|2|^2+|3|^2+|4|^2)*0.2/2
regu2 = tf.contrib.layers.l2_regularizer(lambda)(weights)
collection
的概念,它在乙個計算圖tf.graph
中儲存一組實體。
example:
import tensorflow as tf
# 定義乙個獲取權重並自動加入正則項到損失的函式
defget_weight
(shape, lambda1):
# 生成變數
var = tf.variable(tf.random_normal(shape), dtype=tf.float32)
# 將變數var的l2正則損失加入名為'losses'的collection中
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var))
# 返回所生成的變數
return var
# 載入訓練資料
data =
label =
...
data_len = len(data)
# 定義網路
x = tf.placeholder(tf.float32, shape=(none, 2))
y_ = tf.placeholder(tf.float32, shape=(none, 1))
batch_size = 8
# 定義每層的節點的個數
layer_dimension = [2,8,8,8,1]
# 網路的層數
n_layers = len(layer_dimension)
# 開始為輸入層,中間層時作為下層的輸入層
cur_layer = x
# 當前層的節點數
in_dimension = layer_dimension[0]
# 生成網路結構
for i in range(1, n_layers):
# 下層的節點數
out_dimension = layer_dimension[i]
# 當前層與下層間中權值,並將其加入到l2正則項losses中
weight = get_weight([in_dimension, out_dimension], 0.003)
# 偏置
bias = tf.variable(tf.constant(0.1, shape=[out_dimension]))
# 經過relu啟用函式
cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias)
# 進入下層之前,更新為當前層輸出節點數
in_dimension = layer_dimension[i]
y= cur_layer
# 損失函式的定義
mse_loss = tf.reduce_sum(tf.square(y_ - y)) / sample_size
# 將均方誤差新增到損失集合
tf.add_to_collection('losses', mse_loss)
# get_collection 返回乙個列表,它包含這個集合中的所有元素,在該例子中也就是
# 損失函式的各個部分,將它們加起來得到最終的損失函式
loss = tf.add_n(tf.get_collection('losses'))
# 定義訓練次數及訓練模型
train_op = tf.train.adamoptimizer(0.001).minimize(loss)
training_steps = 40000
with tf.session() as sess:
tf.global_variables_initializer().run()
for i in range(training_steps):
start = (i*batch_size) % data_len
end = (i*batch_size) % data_len + batch_size
sess.run(train_step, feed_dict=)
if i % 2000 == 0:
print("after %d steps, loss: %f" % (i, sess.run(loss, feed_dict=)))
tensorflow框架基礎之Session
會話持有並管理tensorflow程式執行時的所有資源 呼叫會話的兩種方式 方式一 明確的呼叫會話的生成函式和關閉會話函式 create a session sess tf.session use this session to run a result sess.run close this se...
TensorFlow框架 tensorflow基礎
1 圖預設已經註冊,一組表示 tf.operation計算單位的物件和tf.tensor,表示操作之間流動的資料單元的物件 2 獲取呼叫 tf.get default graph op sess或者tensor 的graph屬性 3 圖的建立和使用 執行tensorflow操作圖的類,使用預設註冊的...
Tensorflow之基礎函式解析1
1.tf.argmax tf.argmax就是返回最大的那個數值所在的下標,axis 0 按列比較 axis 1 按行比較 2.tf.equal tf.equal a,b 是對比這兩個矩陣或者向量的相等的元素,如果是相等的那就返回true,反之返回false,返回的值的矩陣維度和a是一樣的 3.tf...