TensotFlow 應用實例:10-Overfitting 過擬合介紹及解決過擬合的方法
本文是我在學習TensotFlow 的時候所記錄的筆記崇决,共享出來希望能夠幫助一些需要的人岁疼。
過擬合
什么是過擬合餐禁? 過擬合就是機器過于自信传睹,已經(jīng)到了自負的階段了
自負的壞處就是在自己的小圈子里表現(xiàn)非凡乾戏,但是在現(xiàn)實的大圈子里往往處處碰壁
自負 = 過擬合
我們做人可不要"過擬合"哦蹲诀!
import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelBinarizer
# 過擬合
# 什么是過擬合斑粱? 過擬合就是機器過于自信,以及到了自負的階段了
# 自負的壞處就是在自己的小圈子里表現(xiàn)非凡脯爪,但是在現(xiàn)實的大圈子里往往處處碰壁
# 自負 = 過擬合
# 結果過擬合的方法
# 1. 增加數(shù)據(jù)量
# 大多數(shù)過擬合的原因是因為數(shù)據(jù)量太少了
# 如果有足夠多的數(shù)據(jù)就可以減少過擬合
# 2. 運用正規(guī)化
# L1, L2.. regularization
# y = Wx :其中 W是機器學習要學到的參數(shù)
# 在過擬合中W往往變化過大则北,為了防止W變化過大,可以通過懲罰參數(shù)的方式來減小W的變化
# 原來的誤差是 cost = (Wx - real y)^2
# 可以通過將cost的計算公式中加上 W的絕對值的方式來懲罰W過大的情況
# 既:cost = (Wx - real y)^2 + abs(W), 這樣使得當W過大的時候cost也隨之變大
# cost變大就證明此時的W不是一個很好的參數(shù)值痕慢。這種是L1的正規(guī)化方式
# L2 的方式是將L1中的絕對值換成平方
# 既:cost = (Wx - real y)^2 + (W)^2
# L3尚揣,L4...
# 3. Dropout regularization
# 這種方式專門用在神經(jīng)網(wǎng)絡中,既:在訓練的過程中掖举,隨機忽略一些神經(jīng)元和神經(jīng)的連接
# 這個時候神經(jīng)網(wǎng)絡就會變得不完整快骗,用一個不完整的神經(jīng)網(wǎng)絡訓練一次,而在下一次
# 又去忽略一些其他的神經(jīng)元塔次,變成另一個不完整的神經(jīng)網(wǎng)絡方篮,通過這種隨機Dropout的規(guī)則,
# 就會使得每一次訓練和預測的結果都不會特別依賴于某一部分特定的神經(jīng)元励负。
# load data 加載數(shù)據(jù)
digits = load_digits()
x = digits.data
y = digits.target
y = LabelBinarizer().fit_transform(y)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.3)
# 添加神經(jīng)層
def add_layer(inputs, in_size, out_size, layer_name, activation_function=None):
# Weights define
# 權重藕溅,盡量要是一個隨機變量
# 隨機變量在生成初始變量的時候比全部為零效果要好的很多
with tf.name_scope('layer'):
with tf.name_scope('weights'):
Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
# histogram 直方圖;柱狀圖 總結weights
tf.summary.histogram(layer_name + '/weights', Weights)
# biases define
# 偏值項继榆,是一個列表巾表,不是矩陣,默認設置為0 + 0.1
with tf.name_scope('biases'):
biases = tf.Variable(tf.add(tf.zeros([1, out_size]), 0.1), name='b')
# histogram 直方圖裕照;柱狀圖 總結biases
tf.summary.histogram(layer_name + '/biases', biases)
# W * x + b
with tf.name_scope('Wx_plus_b'):
Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)
# add drop out function
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob=keep_prob)
# 如果activation_function是空的時候就表示是一個線性關系直接放回即可
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
# histogram 直方圖攒发;柱狀圖 總結biases
tf.summary.histogram(layer_name + '/outputs', outputs)
return outputs
# placeholder
# 輸入是64個單位8*8 輸出是10個單位[0,1,2,.....9]
xs = tf.placeholder(tf.float32, [None, 64])
ys = tf.placeholder(tf.float32, [None, 10])
# drop define
# keep_prob 是你至少需要保持的連接比例,不被drop的比例
keep_prob = tf.placeholder(tf.float32)
# add output layer
# hidden layer
# 這里使用tanh可以防止報錯
l1 = add_layer(xs, 64, 100, 'l1', activation_function=tf.nn.tanh)
# output layer
#
prediction = add_layer(l1, 100, 10, 'l2', activation_function=tf.nn.softmax)
# the error between prediction and real data
# loss function
# cross_entropy 分類的時候經(jīng)常使用softmax + cross_entropy來計算的
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
reduction_indices=[1]))
tf.summary.scalar('loss', cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.6).minimize(cross_entropy)
sess = tf.Session()
merged = tf.summary.merge_all()
# summary writer goes in here
train_writer = tf.summary.FileWriter("logs/train", sess.graph)
test_writer = tf.summary.FileWriter("logs/test", sess.graph)
# init variables
sess.run(tf.global_variables_initializer())
for i in range(500):
# 訓練的時候drop 40%
sess.run(train_step, feed_dict={xs: x_train, ys: y_train, keep_prob: 0.6})
if i % 50 is 0:
# record loss
# 記錄的時候不drop
train_result = sess.run(merged, feed_dict={xs: x_train, ys: y_train, keep_prob: 1})
test_result = sess.run(merged, feed_dict={xs: x_test, ys: y_test, keep_prob: 1})
# writer file
train_writer.add_summary(train_result, i)
test_writer.add_summary(test_result, i)
# ps
# tensorboard 當中要有 history summary
#
本文代碼GitHub地址 tensorflow_learning_notes