當前位置:
首頁 > 知識 > 基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

作者 | beyond_LH

責編 | 胡雪蕊

出品 | CSDN博客

對於「XOR」大家應該都不陌生,我們在各種課程中都會遇到,它是一個數學邏輯運算符號,在計算機中表示為「XOR」,在數學中表示為「」,學名為「異或」,其來源細節就不詳細表明了,說白了就是兩個a、b兩個值做異或運算,若a=b則結果為0,反之為1,即「相同為0,不同為1」。

在計算機早期發展中,邏輯運算廣泛應用於電子管中,這一點如果大家學習過微機原理應該會比較熟悉,那麼在神經網路中如何實現它呢,早先我們使用的是感知機,可理解為單層神經網路,只有輸入層和輸出層(在吳恩達老師的系列教程中曾提到過這一點,關於神經網路的層數,至今仍有異議,就是說神經網路的層數到底包不包括輸入層,現今多數認定是不包括的,我們常說的N層神經網路指的是隱藏層+輸出層),但是感知機是無法實現XOR運算的,簡單來說就是XOR是線性不可分的,由於感知機是有輸入輸出層,無法線性劃分XOR區域,於是後來就有了使用多層神經網路來解決這一問題的想法~~

關於多層神經網路實現XOR運算可大致這麼理解:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

兩個輸入均有兩個取值0和1,那麼組合起來就有四種可能,即[0,0]、[0,1]、[1,0]、[1,1],這樣就可以通過中間的隱藏層進行異或運算了~

咱們直接步入正題吧,對於此次試驗我們只需要一個隱藏層即可,關於神經網路 的基礎知識建議大家去看一下吳恩達大佬的課程,真的很棒,百看不厭,真正的大佬是在認定學生是絕對小白的前提下去講解的,所以一般人都能聽懂~~接下來的圖純手工操作,可能不是那麼準確,但中心思想是沒有問題的,我們開始吧:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

上圖是最基本的神經網路示意圖,有兩個輸入x1、x2,一個隱藏層,只有一個神經元,然後有個輸出層,這就是最典型的「輸入層+隱藏層+輸出層」的架構,對於本題目,我們的輸入和輸出以及整體架構如下圖所示:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

輸入量為一個矩陣,0和0異或結果為0,0和1異或結果為1,依次類推,對應我們的目標值為[0,1,1,0],最後之所以用約等號是因為我們的預測值與目標值之間會有一定的偏差,如果訓練的好那麼這二者之間是無限接近的。

我們直接上全部代碼吧,就不分步進行了,以為這個實驗本身難度較低,且代碼注釋很清楚,每一步都很明確,如果大家有什麼不理解的可以留言給我,看到必回:

1#!/usr/bin/env python
2# -*- coding:utf-8 -*-
3
4import numpy as np
5import tensorflow as tf
6
7#定義輸入值與目標值
8X=np.array([[0,0],[0,1],[1,0],[1,1]])
9Y=np.array([[0],[1],[1],[0]])
10
11#定義佔位符,從輸入或目標中按行取數據
12x=tf.placeholder(tf.float32,[None,2])
13y=tf.placeholder(tf.float32,[None,1])
14
15#初始化權重,使其滿足正態分布,w1和w2分別為輸入層到隱藏層和隱藏層到輸出層的權重矩陣
16w1=tf.Variable(tf.random_normal([2,2]))
17w2=tf.Variable(tf.random_normal([2,1]))
18
19#定義b1和b2,分別為隱藏層和輸出層的偏移量
20b1=tf.Variable([0.1,0.1])
21b2=tf.Variable([0.1])
22
23#使用Relu激活函數得到隱藏層的輸出值
24a=tf.nn.relu(tf.matmul(x,w1)+b1)
25
26#輸出層不用激活函數,直接獲得其值
27out=tf.matmul(a,w2)+b2
28
29#定義損失函數MSE
30loss=tf.reduce_mean(tf.square(out-y))
31
32#優化器選擇Adam
33train=tf.train.AdamOptimizer(0.01).minimize(loss)
34
35#開始訓練,迭代1001次(方便後邊的整數步數顯示)
36with tf.Session as session:
37 session.run(tf.global_variables_initializer) #初始化變數
38 for i in range(1001):
39 session.run(train,feed_dict={x:X,y:Y}) #訓練模型
40 loss_final=session.run(loss,feed_dict={x:X,y:Y}) #獲取損失
41 if i%100==0:
42 print("step:%d loss:%2f" % (i,loss_final))
43 print("X: %r" % X)
44 print("pred_out: %r" % session.run(out,feed_dict={x:X}))

對照第三張圖片理解代碼更加直觀,我們的隱藏層神經元功能就是將輸入值和相應權重做矩陣乘法,然後加上偏移量,最後使用激活函數進行非線性轉換;而輸出層沒有用到激活函數,因為本次我們不是進行分類或者其他操作,一般情況下隱藏層使用激活函數Relu,輸出層若是分類則用sigmode,當然你也可以不用,本次實驗只是單純地做異或運算,那輸出層就不勞駕激活函數了~

對於標準神經元內部的操作可理解為下圖:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

這裡的x和w一般寫成矩陣形式,因為大多數都是多個輸入,而矩陣的乘積要滿足一定的條件,這一點屬於線代中最基礎的部分,大家可以稍微了解一下,這裡對設定權重的形狀還是很重要的;

看下效果吧:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

這是我們在學習率為0.1,迭代1001次的條件下得到的結果

然後我們學習率不變,迭代2001次,看效果:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

沒有改進,這就說明不是迭代次數的問題,我們還是保持2001的迭代數,將學習率改為0.01,看效果:

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

完美~~~最後損失降為0了~~一般來說,神經網路中的超參中最重要的就是學習率了,如果損失一直降不下來,我們首先要想到修改學習率,其他的超參次之……

大家可以觀察一下我們的預測值,四項分別對應[0,1,1,0],已經是相當接近了……

原文:https://blog.csdn.net/beyond9305/article/details/98209549

聲明:本文為 CSDN 博客精選文章,版權歸作者所有。

【END】

基於 Tensorflow 輕鬆實現 XOR 運算!| CSDN 博文精選

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

GitHub 五萬星登頂,程序員命令行最全技巧寶典
沒有授權,Android App 也能獲取你的許可權

TAG:CSDN |