咱們用正則化來緩解泛化效果差的問題,就是給權重一個矩陣,加在loss上。python
如圖所示,正則化後的loss,是原來的loss再加上正則化項,正則化項就是正則化參數*loss(w),這個,跟吳恩達講的如出一轍。數組
正則化項的表示代碼爲tf.contrib.layers.l2_regularizer(lambda)(w),其中lambda是正則化參數,w是權重網絡
tf.add_to_collection("losses",tf.contrib.layers.l2_regularizer(lambda)(w)) #把正則化項放入一個名爲"losses"的集合器裏面,咱們打算用這個losses來表示整個正則化項了。dom
loss=cem+tf.add_n(tf.get_collection("losses")) #cem是原來的loss,如今把正則化項和以前的最原始的loss加在一塊兒,就獲得了正則化後的loss函數
ok,你可能看不懂,問「爲何要這麼麻煩?直接把正則化項加進cem不就好了嗎?」是的,我也不懂爲何,但就是這樣的一環套一環,你還就真得按照這個代碼去操做,否則你作不出來。code
下面看代碼orm
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt #設置batch(臨時樣本) step=30 #產生輸入數據 x_data=np.random.randn(300,2) #產生輸入數據集的標籤(正確答案) y_data=[int(x0*x0+x1*x1<2) for (x0,x1) in x_data] #遍歷y_data中的每一個元素,1賦值red,其他賦值blue,這樣可視化顯示時容易區分 y_s=[["red" if y else "blue"] for y in y_data] #數據變形,按行堆疊成一個新數組 x_data=np.vstack(x_data).reshape(-1,2)#numpy中,shape裏寫-1,至關於tensorflow裏寫None y_data=np.vstack(y_data).reshape(-1,1) print(x_data) print(y_data) print(y_s) #用plt.scatter畫出數據集x_data各行中第0列元素和第一列元素的點即各行的(x0,x1),用各行y_s對應的值表示顏色 plt.scatter(x_data[:,0],x_data[:,1],c=np.squeeze(y_s)) plt.show() #定義神經網絡的輸入、參數和輸出,定義前向傳播 def get_weight(shape,regularizer): w=tf.Variable(tf.random_normal(shape),dtype=tf.float32) tf.add_to_collection("losses",tf.contrib.layers.l2_regularizer(regularizer)(w)) return w def get_bias(shape): b=tf.Variable(tf.constant(0.01,shape=shape)) return b #輸入層輸入 x=tf.placeholder(tf.float32,shape=(None,2)) y_=tf.placeholder(tf.float32,shape=(None,1)) #輸入層到隱藏層 w1=get_weight([2,11],0.01) b1=get_bias([11]) y1=tf.nn.relu(tf.matmul(x,w1)+b1) #隱藏層到輸出層 w2=get_weight([11,1],0.01) b2=get_bias([1]) y=tf.matmul(y1,w2)+b2#輸出層不激活(僅限這個代碼不激活) #定義損失函數 loss_mse=tf.reduce_mean(tf.square(y-y_)) loss=loss_mse + tf.add_n(tf.get_collection("losses")) #定義反向傳播 optimizer=tf.train.AdamOptimizer(0.0001).minimize(loss) #初始化 init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for i in range(40000): start=(i*step)%300 end=start+step sess.run(optimizer,feed_dict={x:x_data[start:end],y_:y_data[start:end]}) if i%2000==0: loss_mse_val=sess.run(loss_mse,feed_dict={x:x_data,y_:y_data}) print(f"通過{i}步,loss現爲:{loss_mse_val}") # xx在-3到3之間以步長爲0.01,yy在-3到3之間以步長0.01,生成二維網格座標點 xx, yy = np.mgrid[-3:3:.01, -3:3:.01] # 將xx , yy拉直,併合併成一個2列的矩陣,獲得一個網格座標點的集合 grid = np.c_[xx.ravel(), yy.ravel()] # 將網格座標點喂入神經網絡 ,probs爲輸出 probs = sess.run(y, feed_dict={x: grid}) # probs的shape調整成xx的樣子 probs = probs.reshape(xx.shape) print("w1:\n", sess.run(w1)) print("b1:\n", sess.run(b1)) print("w2:\n", sess.run(w2)) print("b2:\n", sess.run(b2)) plt.scatter(x_data[:, 0], x_data[:, 1], c=np.squeeze(y_s)) plt.contour(xx, yy, probs, levels=[.5]) plt.show()