感知機和單隱藏層網路的模擬「異或運算」(XOR)

2021-09-26 09:02:21 字數 3710 閱讀 6990

異或,英文為exclusive or,縮寫成xor。異或(xor)是乙個數**算符

感知機模型可以簡單的理解為單層的神經網路。感知機接收多個輸入訊號,輸出乙個訊號。下圖展示了乙個簡單的兩個輸入訊號的感知機模型

異或操作直觀來說就是如果兩個輸入的符號相同時(同為正或者同為負)則輸出0,否則(乙個正乙個負)輸出為1。

數學邏輯語言可以表示為:a⊕b

=(¬a

∧b)∨

(a∧¬

b)a \oplus b=(\neg a \land b)\lor(a \land \neg b)

a⊕b=(¬

a∧b)

∨(a∧

¬b)

其中⊕

\oplus

⊕表示異或運算元,¬

\neg

¬表示非(逆)運算,即當a=1

a=1a=

1時,¬a=

0\neg a=0

¬a=0

;而a =0

a=0a=

0時,¬a=

1\neg a=1

¬a=1

。∧

\land

∧和∨\lor

∨分別表示求交集和並集運算。

然而,值的注意的是,感知機是無法模擬異或運算的。這在1969被證明,具體可以了解書籍 perceptrons:an introduction to computational geometry

以下我們基於tensorflow說明這一事實,另外再加入了隱藏層之後,異或運算可以實現模擬。

3.1、perception 模型

import tensorflow as tf

import numpy as np

# init data

x_data=np.array([[

1,1]

,[1,

0],[

0,1]

,[0,

0]],dtype=np.

int)

y_data=np.array([[

0],[

1],[

1],[

0]],dtype=np.

int)

# define tf placeholder

x=tf.placeholder(tf.float32,

[none,2

],name=

'x-input'

)y=tf.placeholder(tf.float32,

[none,1

],name=

'y-input'

)# define parameters

w=tf.variable(tf.random_normal([2

,1])

)b=tf.variable(

[0.1])

# model init

out=tf.nn.relu(tf.matmul(x,w)

+b)loss=tf.reduce_mean(tf.square(y-out)

)# 含隱藏層的網路

opt=tf.train.adamoptimizer(

0.01

).minimize(loss)

init=tf.global_variables_initializer(

)fd=

sess=tf.session(

)sess.run(init)

for i in

range

(2000):

_,per_loss=sess.run(

[opt,loss]

,feed_dict=fd)

if(i%10)

==0:# 10次輸出一下結果

print

('step{},nn loss is:{}'

.format

(i,per_loss)

)

3.2、單隱藏層的nn模型
import tensorflow as tf

import numpy as np

# init data

x_data=np.array([[

1,1]

,[1,

0],[

0,1]

,[0,

0]],dtype=np.

int)

y_data=np.array([[

0],[

1],[

1],[

0]],dtype=np.

int)

# define tf placeholder

x=tf.placeholder(tf.float32,

[none,2

],name=

'x-input'

)y=tf.placeholder(tf.float32,

[none,1

],name=

'y-input'

)# define parameters

w1=tf.variable(tf.random_normal([2

,2])

)w2=tf.variable(tf.random_normal([2

,1])

)b1=tf.variable(

[0.1

,0.1])

b2=tf.variable(

[0.1])

# model init

out1=tf.nn.relu(tf.matmul(x,w1)

+b1)

out2=tf.matmul(out1,w2)

+b2loss=tf.reduce_mean(tf.square(y-out2)

)# 含隱藏層的網路

opt=tf.train.adamoptimizer(

0.01

).minimize(loss)

init=tf.global_variables_initializer(

)fd=

sess=tf.session(

)sess.run(init)

for i in

range

(2000):

_,nn_loss=sess.run(

[opt,loss]

,feed_dict=fd)

if(i%10)

==0:# 10次輸出一下結果

print

('step{},nn loss is:{}'

.format

(i,nn_loss)

)

再附上tensorflow playground的結果:

明顯看到,當沒有隱藏層使用感知機來模擬異或操作效果比較差,損失函式取值表較大。

使用含隱藏層的神經網路模型在合適的引數之下能很好的擬合異或操作,損失函式在很短時間之內接近0

神經網路的隱藏層

通常,卷積神經網路除了輸入和輸出層之外還有四個基本的神經元層,在三層神經網路中,這基層被稱為隱藏層 卷積層 convolution 啟用層 activation 池化層 pooling 完全連線層 fully connected 卷積層在最初的卷積層中,成千上萬的神經元充當第一組過濾器,搜尋影象中的...

單隱藏層神經網路(mnist手寫數字識別

1 載入資料 import numpy as np import tensorflow as tf import tensorflow.examples.tutorials.mnist.input data as input data 讀取mnist資料 mnist input data.read ...

向量機和感知機的相同和不同點 感知機vs支援向量機

感知機 原理 二維空間中找到一條直線可以把所有二元類別分離開,三維或多維空間中,找到乙個分離超平面把所有二元類別分離開。而可把所有二元類別分離開的超平面不止乙個,哪個是最好的呢?損失函式 所有誤分類的點到超平面的總距離,找到損失函式最優化對應的超平面,即誤分類的點到超平面總距離最小的模型引數w,b ...