深度学习基础-感知器
感知器-神经网络的组成单元-神经元(神经元也叫做感知器),感知机是所有神经网络的基础,主要由全连接层组成,下面是感知机示意图。

-
输入一个感知器可以接收多个输入
,每个输入上有对应权值
,此外还有一个偏置项
。
-
激活函数 感知器的激活函数可以有很多选择,比如我们可以选择relu这个阶跃函数来作为激活函数:
- 输出 感知器的输出由下面这个公式来计算
感知机的应用 其可以拟合任何的线性函数,任何线性分类或线性回归问题都可以用感知器来解决。但是感知机无法拟合非线性函数,比如异或。
感知机的训练 将权重项和偏置项初始化为0,然后,利用下面的感知机规则迭代的修改和
,直到训练完成。
- 感知机和线性单元对比
| 模型 | 感知器 | 线性单元 |
| | | |
| 训练规则 | | |
是与输入
对应的权重项,
是偏置项。事实上,可以把
看作是值永远为1的输入
所对应的权重。
是训练样本的实际值,一般称之为label。而
是感知器的输出值,它是根据公式
计算得出。
是一个称为学习速率的常数,其作用是控制每一步调整权的幅度。
每次从训练数据中取出一个样本的输入向量,使用感知器计算其输出
,再根据上面的规则来调整权重。每处理一个样本就调整一次权重。经过多轮迭代后(即全部的训练数据被反复处理多轮),就可以训练出感知器的权重,使之实现目标函数。
实战:用感知机实现and运算
and运算训练集
| x1 | x2 | y |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
训练代码
class Perceptron:def __init__(self, input_num):self.activator_fun = lambda x: 1 if x > 0 else 0 # reluself.weights = [0.0] * input_numself.bias = 0.0def __str__(self):return f'weights = {self.weights}, bias = {self.bias}'def predict(self, input_vec):"""y_pred = x1*w1 + x2*w2 + x3*w3 + ... + xn*wn + b:param input_vec: 输入向量:return:"""total = sum(list(map(lambda x: x[1] * self.weights[x[0]], list(enumerate(input_vec)))))y_pred = self.activator_fun(total + self.bias)# print(input_vec, self.weights, total, y_pred)return y_preddef train(self, input_vecs, labels, iteration, rate):""":param input_vecs: 输入特征:param labels::param iteration::param rate::return:"""for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):""":param input_vecs::param labels::param rate::return:"""samples = list(zip(input_vecs, labels))# 对每个样本,按照感知器规则更新权重for (input_vec, label) in samples:# 计算感知器在当前权重下的输出output = self.predict(input_vec)# 更新权重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):"""感知器权重更新wi = wi + learn_rate * (y_true - y_pred) * xib = b + learn_rate * (y_true - y_pred):param input_vec::param output::param label::param rate::return:"""delta = label - output # 误差# 更新weightsself.weights = list(map(lambda x_w: rate * delta * x_w[0] + x_w[1],zip(input_vec, self.weights)))# 更新biasself.bias += rate * deltadef load_data():# 训练集 [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]labels = [1, 0, 1, 1]return input_vecs, labelsdef train():X, y = load_data()# 创建感知器model = Perceptron(len(X[0]))# 训练,迭代10轮, 学习速率为0.1model.train(X, y, 1, 5e-1)return modelif __name__ == '__main__':perception_model = train()print(perception_model)print(perception_model.predict([0, 0]))print(perception_model.predict([1, 0]))print(perception_model.predict([0, 1]))print(perception_model.predict([1, 1]))
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
