日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統 1911 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條評論
主站蜘蛛池模板: 临武县| 博乐市| 哈密市| 彭山县| 水富县| 桐梓县| 兴仁县| 长沙县| 永清县| 瑞昌市| 泰州市| 会昌县| 太谷县| 油尖旺区| 正蓝旗| 嘉荫县| 衢州市| 越西县| 珠海市| 白城市| 广平县| 静宁县| 阳信县| 曲周县| 兴义市| 白银市| 丰顺县| 平昌县| 浙江省| 锡林郭勒盟| 和平区| 枝江市| 仲巴县| 怀仁县| 额济纳旗| 宝坻区| 东阳市| 曲麻莱县| 杭锦旗| 临沭县| 伊春市|