關于神經網絡結構的軟件設計和分類曲線的繪制,本文主要參考了以下文章:
https://blog.csdn.net/lilong117194/article/details/79130032
構建的具體步驟如下:
步驟1. 建立數據源(樣本庫)——使用隨機初始化的方式。由于需要進行邏輯分類,需要建立2個數據類,并合并在一起。如下:
num_points=1000? # 樣本數目 vectors_set=[] x1_PlotData=[]? # 用于后期繪圖的數據 y1_PlotData=[] x2_PlotData=[] y2_PlotData=[] for i in range(int(num_points/2)): ??? x1=np.random.normal(0.0,0.55)?? #橫坐標,進行隨機高斯處理化,以0為均值,以0.55為標準差 ??? y1=x1*0.1+0.3+np.random.normal(-0.03,0.03)?? #縱坐標,數據點在y1=x1*0.1+0.3上小范圍浮動 ??? vectors_set.append([x1,y1,0]) ??? x2 = np.random.normal(0.0, 0.55) ??? y2 = x2 * 0.1 + 0.4 + np.random.normal(-0.03, 0.03) ??? vectors_set.append([x2, y2,1]) ??? x1_PlotData.append(x1) ??? y1_PlotData.append(y1) ??? x2_PlotData.append(x2) ??? y2_PlotData.append(y2) x1_data=[v[0] for v in vectors_set]? # 使用np.mat將list轉化為numpy中的矩陣格式 x2_data=[v[1] for v in vectors_set] y_data=[v[2] for v in vectors_set] |
?
步驟2.建立數據流圖:新建變量theta(同時建立正則項),假設函數tf.nn.relu ,代價函數(同時添加正則項),優化算法選擇梯度下降法,并設置步長:
def get_weight(shape, lambda1):? # 定義一個獲取權重,并自動加入正則項到損失的函數。 ??? var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) # 生成一個變量 ??? tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) # add_to_collection()函數將新生成變量的L2正則化損失加入集合losses ??? return var # 返回生成的變量 ? x_input=tf.placeholder(tf.float32,shape=[None,2])? # 定義神經網絡輸入和輸出 y_input=tf.placeholder(tf.float32) ? layer_dimension = [2,8,1]? # 定義神經網絡結構,即各個層的節點數目 n_layers = len(layer_dimension)? # 獲取神經網絡的層數 cur_layer = x_input? # 這個變量維護前向傳播時最深層的節點,開始的時候就是輸入層 in_dimension = layer_dimension[0]? # 當前層的節點個數 ? for i in range(1, n_layers):? # 循環生成網絡結構 ??? out_dimension = layer_dimension[i] # layer_dimension[i]為下一層的節點個數 ??? weight = get_weight([in_dimension, out_dimension], 0.0001)? # 生成當前層中權重的變量 ??? bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) # 偏置 ??? cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias) # 使用Relu激活函數 ??? in_dimension = layer_dimension[i]? # 進入下一層之前將下一層的節點個數更新為當前節點個數 ? y= cur_layer? # 最后一層的輸出值即是總的輸出值 ? mse_loss = tf.reduce_mean(tf.square(y_input - y)) # 在定義神經網絡前向傳播的同時已經將所有的L2正則化損失加入了圖上的集合,這里是損失函數的定義。 tf.add_to_collection('losses', mse_loss) # 將均方誤差損失函數加入損失集合 loss = tf.add_n(tf.get_collection('losses'))? # get_collection()返回一個列表,這個列表是所有這個集合中的元素,在本樣例中這些元素就是損失函數的不同部分,將他們加起來就是最終的損失函數 optimizer = tf.train.GradientDescentOptimizer(0.1)? # 選擇梯度下降法,并設置步長。 train_step = optimizer.minimize(loss) |
?
步驟3.初始化流圖:
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) |
?
步驟4.開始訓練,同時記錄訓練過程:
x_plot=[] y_plot=[] steps = 2000 for i in range(steps): ??? xs=np.column_stack(( np.mat(x1_data).T,np.mat(x2_data).T)) ??? ys = np.mat(y_data).T ??? feed = { x_input: xs, y_input: ys } ??? sess.run(train_step, feed_dict=feed) ??? if i % 100 == 0 : ??????? print("After %d iteration:" % i) ??????? print("Cost: %f" % sess.run(loss, feed_dict=feed)) ??????? x_plot.append(i) ??????? y_plot.append(sess.run(loss, feed_dict=feed)) |
?
步驟5.輸出訓練結果,主要為訓練參數theta和損失值(代價值):
print("Finnally Result") print("Loss: %f" % sess.run(loss, feed_dict=feed)) |
?
步驟6.在樣本集中繪制訓練后的分類線(采用繪制等高線的方式),和“訓練次數-損失”曲線,以便觀察訓練結果:
xx,yy= np.mgrid[-2:2:0.1, 0.:0.8:0.02]? grid = np.c_[xx.ravel(), yy.ravel()] probs = sess.run(y, feed_dict = { x_input: grid }) probs = probs.reshape(xx.shape) plt.subplot(1,2,1) plt.scatter(x1_PlotData,y1_PlotData,c='g') plt.scatter(x2_PlotData,y2_PlotData,c='r') plt.contour(xx, yy, probs, levels=[.5], cmap="Greys", vmin=0, vmax=.1) plt.subplot(1,2,2) plt.plot(x_plot,y_plot,'-') plt.show() |
?
輸出結果:
Finnally Result Loss: 0.055836 |
輸出圖形: |
注:
由于兩類點的互相干擾,如果訓練的損失較高,有時會無法繪制出一條較好的等高線。可通過打印步驟6中的probs觀察訓練后的輸出結果進行確認。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
