单层感知机

http://c.biancheng.net/view/1914.html

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt


def threshold(x):
    cond=tf.less(x,tf.zeros(tf.shape(x),dtype=x.dtype))
    out=tf.where(cond,tf.zeros(tf.shape(x)),tf.ones(tf.shape(x)))
    return out

#Hyper parameters
eta=0.4
epsilon=1e-3
max_epochs=100


#Y=AB+BC

T,F=1.,0.
X_in=[
    [T,T,T,T],
    [T,T,F,T],
    [T,F,T,T],
    [T,F,F,T],
    [F,T,T,T],
    [F,T,F,T],
    [F,F,T,T],
    [F,F,F,T],
]
Y=[
    [T],
    [T],
    [F],
    [F],
    [T],
    [F],
    [F],
    [F],
]

W=tf.Variable(tf.random_normal([4,1],stddev=2,seed=0))
h=tf.matmul(X_in,W)

Y_hat=threshold(h)
error=Y-Y_hat
mean_error=tf.reduce_mean(tf.square(error))
dW=eta*tf.matmul(X_in,error,transpose_a=True)
train=tf.assign(W,W+dW)

init=tf.global_variables_initializer()
err=1
epoch=0
with tf.Session() as sess:
    sess.run(init)
    while err>epsilon and epoch<max_epochs:
        epoch+=1
        err,_=sess.run([mean_error,train])
        print('epoch:{0}  mean error: {1}'.format(epoch,err))
    print('Training complete')

 

参照博客https://www.jianshu.com/p/d7189cbd0983?from=groupmessage

 

单层感知器图片:

 

 

    本程序当中刚好就是这个图,四个输入然后Σ。四个列向量的一行,分别和权值的

一维乘积,之后求和,得到Σ的一维。

  Y_hat就是Σ值在触发函数作用之后得到的最终值。

 

  那么触发函数threshold的作用机理是怎么样的呢?

  tf.shape()返回张量的形状,比如A=[[1,2,3]],那么tf.shape(A)返回[1,3]

  tf.less()返回两个张量之间各元素比较之后的布尔值张量。前面的张量严格小为真。

  tf.where(A,B,C)根据A布尔张量的对应位置值,若为True,返回B中对应值。若为False,返回C中

对应值。

  可以看出这是写的很好的一个触发函数,能够判断出输入X_in在参数W的作用下,是否能够

拟合感知器的预期生成结果。

 

  QQQQQQQQ

  那么为什么训练函数dW要这样推导呢?

  推导如下,还没看懂。

  

  

 

 

   使用神经元期望的输出值Y减去实际的输出值Y_hat,求得差值error,再和设定的学习率eta相乘后,再和输入向量X_in相乘,求得权值变化的向量。(也就是得到对输入向量的调整后的向量)将权值向量W和得到的变化向量相加,重复以上动作,直到期望输出和实际输出相等。

 

 那么   神经元期望的输出值Y   ,这个东西有何实际意义?

  单层感知器解决线性可分问题,非true,即false。

  所以,这里的单层感知器是针对每一次输入的X0,X1,X2,X3这四个输入,通过W的加权,

最终通过触发函数决定输出的是T或者F。也就是把向量[X0,X1,X2,X3]成功地进行了一次

分类操作。

  所以!!!

  这实际上就是针对四维空间上的一个点[X0,X1,X2,X3]成功地找到了一个向量W,能够成功地

将四维空间上的点区分为两类!!!!

 

  可能四维空间不太好直观表示。

  我们用二维空间的单层感知器。二维空间上有许多点,(X0,X1),(Y0,Y1).......可能有无穷多的点,但是

他们都必须是线性可分的,不然不能用单层感知器来解决这个问题。

  触发函数就是针对X0*W1+X1*W2这个加权后得到的值,X0*W1+X1*W2>1触发函数取值T,X0*W1+X1*W2<0

触发函数取值F。显然分界线就是X0*W1+X1*W2=0。怎么样,实际意义它不就出来了吗。训练得到的参数W1和W2

实际上就在平面上为两类线性可分的点之间寻找到了一条分界线。

 

   在本程序中的X_in就是8个四维空间上的点,Y就是这些点分别的分类归属。本单层感知器

的最终目的就是要在四维空间上训练出W,使得这8个四维空间上的点线性可分。

 

 

  OVER

  




 

posted @ 2021-09-22 19:31  TheDa  阅读(210)  评论(0编辑  收藏  举报