【参考资料】
【1】《人工神经网络教程》
【2】《matlab 2015b 神经网络技术》
单层感知器可以看成一个线性累加器和一个二值化阈值元器件,通常会在累加一个偏移量。由公式表达为: o j = s g n ( ∑ i = 1 n w i j x i + b ) o_j= sgn(\sum_{i=1}^n w_{ij}x_i+b) oj=sgn(∑i=1nwijxi+b)
其中
o j = { 1 , s g n ( ∑ i = 1 n w i j x i + b ) ≥ 0 − 1 , s g n ( ∑ i = 1 n w i j x i + b ) < 0 o_j = \begin{cases} 1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) \ge 0 \\ -1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) < 0 \end{cases} oj={1,−1,sgn(∑i=1nwijxi+b)≥0sgn(∑i=1nwijxi+b)<0
实时上对于单层感知机而言,是根据输入的x和o值,估计了参数w,而构筑了一个 ∑ i = 1 n w i j x i + b = 0 \sum_{i=1}^n w_{ij}x_i+b = 0 ∑i=1nwijxi+b=0的超平面。
单层感知机的模型相当于是求解n元线性非齐次方程的逆过程,前者是已知阈值和输出求x,后者是已经输入x和输出y估计参数。在估计的判断机制里,神经网络是期望有更多的输入样本符合判断,而支持向量机则是让超片面与各个样本点有最远的距离。
此步骤描述只考虑一个输出
对于 w 1 j w_{1j} w1j等所有权值赋予一个较小的随机数
输入训练样本 ( x p , d p ) (x^p, d^p) (xp,dp),前者为输入,后者为期望输出
计算实际输出 o j p = ∑ i = 1 n w i j x p + b o_j^p=\sum_{i=1}^n w_{ij}x^p+b ojp=∑i=1nwijxp+b
调整权值参数 w 1 j t + 1 = w 1 j t + η ( o j p − d p ) x p w_{1j}^{t+1} = w_{1j}^t + \eta(o_j^p-d^p)x^p w1jt+1=w1jt+η(ojp−dp)xp,这里 η \eta η又称为学习率
重复步骤2,直到所有的样本(满足要求数量)都符合期望的输出
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
def _test_signle_perceptron():
x_train = np.array([[-1, 1, -2, 0],[-1, 0, 1.5, -0.5],[-1, -1, 1, 0.5]], dtype=float);
y_train = np.array([[-1], [-1], [1]])
"""
Sequential 序贯模型是多个网络层的线性堆叠
"""
model = Sequential()
"""
Dense 为常用的全连接层,主要参数:
units:该层输出的维度
input_dim:输入的维度
activation:激活函数
use_bias:是否有偏移量
"""
model.add(Dense(units=1, input_dim=4, activation='linear', use_bias=False))
#设置一个初始化的权值
model.set_weights([np.array([[0.5], [1], [-1], [0.]], dtype = float), np.array([0.], dtype=float)])
"""
compile 为编译整个模型
loss 损失函数 mae 为mean_absolute_error
optimizer 优化器 SGD 为梯度下降法
metrics: 列表,显示训练时的一些性能指标
"""
model.compile(loss='mae',
optimizer='SGD',
metrics=['accuracy'])
"""
fit 为实际的训练模型方法
epochs 训练的轮数
batch_size 在做梯度下降时每次用到的样本
"""
model.fit(x_train, y_train,
epochs=3,
batch_size=3)
print(model.get_weights())
"""
说明:
单层感知器线性模型,验证《人工神经网络教程》例 3.2
这个例子主要是梳理Keras模型的基础函数,对神经网络训练本身意义不大:)
作者:fredric
日期:2018-8-18
"""
if __name__ == "__main__":
print("sigle perceptron test>>>>>>>>")
_test_signle_perceptron()