關(guān)于神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的軟件設(shè)計(jì)和分類曲線的繪制,本文主要參考了以下文章:
https://blog.csdn.net/lilong117194/article/details/79130032
構(gòu)建的具體步驟如下:
步驟1. 建立數(shù)據(jù)源(樣本庫(kù))——使用隨機(jī)初始化的方式。由于需要進(jìn)行邏輯分類,需要建立2個(gè)數(shù)據(jù)類,并合并在一起。如下:
num_points=1000? # 樣本數(shù)目 vectors_set=[] x1_PlotData=[]? # 用于后期繪圖的數(shù)據(jù) y1_PlotData=[] x2_PlotData=[] y2_PlotData=[] for i in range(int(num_points/2)): ??? x1=np.random.normal(0.0,0.55)?? #橫坐標(biāo),進(jìn)行隨機(jī)高斯處理化,以0為均值,以0.55為標(biāo)準(zhǔn)差 ??? y1=x1*0.1+0.3+np.random.normal(-0.03,0.03)?? #縱坐標(biāo),數(shù)據(jù)點(diǎn)在y1=x1*0.1+0.3上小范圍浮動(dòng) ??? 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轉(zhuǎn)化為numpy中的矩陣格式 x2_data=[v[1] for v in vectors_set] y_data=[v[2] for v in vectors_set] |
?
步驟2.建立數(shù)據(jù)流圖:新建變量theta(同時(shí)建立正則項(xiàng)),假設(shè)函數(shù)tf.nn.relu ,代價(jià)函數(shù)(同時(shí)添加正則項(xiàng)),優(yōu)化算法選擇梯度下降法,并設(shè)置步長(zhǎng):
def get_weight(shape, lambda1):? # 定義一個(gè)獲取權(quán)重,并自動(dòng)加入正則項(xiàng)到損失的函數(shù)。 ??? var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) # 生成一個(gè)變量 ??? tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lambda1)(var)) # add_to_collection()函數(shù)將新生成變量的L2正則化損失加入集合losses ??? return var # 返回生成的變量 ? x_input=tf.placeholder(tf.float32,shape=[None,2])? # 定義神經(jīng)網(wǎng)絡(luò)輸入和輸出 y_input=tf.placeholder(tf.float32) ? layer_dimension = [2,8,1]? # 定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),即各個(gè)層的節(jié)點(diǎn)數(shù)目 n_layers = len(layer_dimension)? # 獲取神經(jīng)網(wǎng)絡(luò)的層數(shù) cur_layer = x_input? # 這個(gè)變量維護(hù)前向傳播時(shí)最深層的節(jié)點(diǎn),開(kāi)始的時(shí)候就是輸入層 in_dimension = layer_dimension[0]? # 當(dāng)前層的節(jié)點(diǎn)個(gè)數(shù) ? for i in range(1, n_layers):? # 循環(huán)生成網(wǎng)絡(luò)結(jié)構(gòu) ??? out_dimension = layer_dimension[i] # layer_dimension[i]為下一層的節(jié)點(diǎn)個(gè)數(shù) ??? weight = get_weight([in_dimension, out_dimension], 0.0001)? # 生成當(dāng)前層中權(quán)重的變量 ??? bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) # 偏置 ??? cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias) # 使用Relu激活函數(shù) ??? in_dimension = layer_dimension[i]? # 進(jìn)入下一層之前將下一層的節(jié)點(diǎn)個(gè)數(shù)更新為當(dāng)前節(jié)點(diǎn)個(gè)數(shù) ? y= cur_layer? # 最后一層的輸出值即是總的輸出值 ? mse_loss = tf.reduce_mean(tf.square(y_input - y)) # 在定義神經(jīng)網(wǎng)絡(luò)前向傳播的同時(shí)已經(jīng)將所有的L2正則化損失加入了圖上的集合,這里是損失函數(shù)的定義。 tf.add_to_collection('losses', mse_loss) # 將均方誤差損失函數(shù)加入損失集合 loss = tf.add_n(tf.get_collection('losses'))? # get_collection()返回一個(gè)列表,這個(gè)列表是所有這個(gè)集合中的元素,在本樣例中這些元素就是損失函數(shù)的不同部分,將他們加起來(lái)就是最終的損失函數(shù) optimizer = tf.train.GradientDescentOptimizer(0.1)? # 選擇梯度下降法,并設(shè)置步長(zhǎng)。 train_step = optimizer.minimize(loss) |
?
步驟3.初始化流圖:
sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) |
?
步驟4.開(kāi)始訓(xùn)練,同時(shí)記錄訓(xùn)練過(guò)程:
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.輸出訓(xùn)練結(jié)果,主要為訓(xùn)練參數(shù)theta和損失值(代價(jià)值):
print("Finnally Result") print("Loss: %f" % sess.run(loss, feed_dict=feed)) |
?
步驟6.在樣本集中繪制訓(xùn)練后的分類線(采用繪制等高線的方式),和“訓(xùn)練次數(shù)-損失”曲線,以便觀察訓(xùn)練結(jié)果:
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() |
?
輸出結(jié)果:
Finnally Result Loss: 0.055836 |
輸出圖形: |
注:
由于兩類點(diǎn)的互相干擾,如果訓(xùn)練的損失較高,有時(shí)會(huì)無(wú)法繪制出一條較好的等高線??赏ㄟ^(guò)打印步驟6中的probs觀察訓(xùn)練后的輸出結(jié)果進(jìn)行確認(rèn)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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