黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

利用python和TensorFlow構建神經網絡解決二分類問題

系統 2060 0

關于神經網絡結構的軟件設計和分類曲線的繪制,本文主要參考了以下文章:

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

輸出圖形:

利用python和TensorFlow構建神經網絡解決二分類問題_第1張圖片

注:

由于兩類點的互相干擾,如果訓練的損失較高,有時會無法繪制出一條較好的等高線。可通過打印步驟6中的probs觀察訓練后的輸出結果進行確認。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論