单层感知机
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