1. 程式人生 > >tensorflow學習之路---解決過擬合

tensorflow學習之路---解決過擬合

應該 神經元 drop 想去 var ram 常用 圖片 result

‘‘‘

思路:
1、調用數據集 2、定義用來實現神經元功能的函數(包括解決過擬合) 3、定義輸入和輸出的數據
4、定義隱藏層(函數)和輸出層(函數) 5、分析誤差和優化數據(改變權重)
6、執行神經網絡

‘‘‘
import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer


#調用數據
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 = 0.3)#分配數據
‘‘‘

擴展知識點
train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取train data和test data,形式為:
X_train,X_test, y_train, y_test = cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)
參數代表含義:
train_data:所要劃分的樣本特征集


train_target:所要劃分的樣本結果
test_size:樣本占比,如果是整數的話就是樣本的數量
random_state:是隨機數的種子。
‘‘‘
print(len(X_train))

#定義用來實現神經元功能的函數
def add_layer(inputs,in_size,out_size,keep_prob,layer_name,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_Bx = tf.matmul(inputs,Weights)+biases
#在這裏處理過擬合


  Wx_plus_b = tf.nn.dropout(Wx_plus_Bx,keep_prob)
  if activation_function==None:
    outputs = Wx_plus_b
  else:
    outputs = activation_function(Wx_plus_b)

  tf.summary.histogram(layer_name+‘/outputs‘,outputs)
  return outputs

#定義輸入和輸出的數據

x_data = tf.placeholder(tf.float32,[None,64])#這是因為sklearn中的手寫圖片的像素和、為8*8
y_data = tf.placeholder(tf.float32,[None,10])#數字只有10個
keep_prob = tf.placeholder(tf.float32)#定義過擬合數

#定義隱藏層和輸出層
layer = add_layer(x_data,64,50,keep_prob,‘l1‘,tf.nn.tanh)#隱藏層
prediction = add_layer(layer,50,10,keep_prob,‘l2‘,tf.nn.softmax)#輸出層

#分析誤差和優化數據
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_data*tf.log(prediction),reduction_indices=[1]))

scalar_loss = tf.summary.scalar(‘loss‘,cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.6).minimize(cross_entropy)

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

merged = tf.summary.merge_all()#定義一個圖框

‘‘‘
因為sess是在sess的時候才出現的,所以應該寫在sess的面
train_writer = tf.summary.FileWriter(‘logs/train‘,sess.graph)
test_writer = tf.summary.FileWriter(‘logs/test‘,sess.graph)
‘‘‘

#執行
with tf.Session()as sess:
  sess.run(init)
  #寫入網頁,這當中只有histogram和scaler同時出現才能寫入網頁
  train_writer = tf.summary.FileWriter(‘Logs/train‘,sess.graph)
  test_writer = tf.summary.FileWriter(‘Logs/test‘,sess.graph)
  for i in range(1000):
    sess.run(train_step,feed_dict = {x_data:X_train,y_data:y_train,keep_prob:0.6})
    if i%50==0:
      train_result = sess.run(merged,feed_dict={x_data:X_train,y_data:y_train,keep_prob:1})
‘‘‘
這個merged會自動的將預測值的精確度求出來
‘‘‘
      test_result = sess.run(merged,feed_dict={x_data:X_test,y_data:y_test,keep_prob:1})
      train_writer.add_summary(train_result,i)#將數據劃入圖中
      test_writer.add_summary(test_result,i)#將數據劃入圖中

‘‘‘
這裏出現一個錯誤:就是test_result = sess.run(scalar_loss,feed_dict={x_data:X_test,y_data:y_test,keep_prob:1})
train_result = sess.run(scalar_loss,feed_dict={x_data:X_train,y_data:y_train,keep_prob:1})中的scalar_loss
改為merged的時候,再次執行就會報錯
解決辦法
1、我們可以關機,然後把logs文件裏面的東西刪除,然後在執行一次。因為他是系統日誌文件
2、由於我,這裏只是想損失函數loss通過tensorboard顯示出來而已,並且字典表也正常賦值了:
result = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
一切都很正常,想來想去感覺這個函數應該可以采用其他方式替換:
merged = tf.summary.merge_all()
這是tensorflow提供的合並所有summary信息的api,但是我只是想合並損失函數loss的summary
‘‘‘

tensorflow學習之路---解決過擬合