深度学习入门(一):感知器
学习资料来源:零基础入门深度学习(1) - 感知器
目录
一、了解深度学习概念
二、感知器(神经元)
2.1 感知器的定义
2.2 感知器的训练
2.3、感知器的实现
一、了解深度学习概念
人工智能 > 机器学习 > 深度学习
神经网络如下图所示:

注意:每个圆圈都是一个神经元。层与层之间的神经元有连接,而层内之间的神经元没有连接。
输入层(负责输入数据) -- 隐藏层 -- 输出层(获取神经网络输出数据)
深度神经网络:隐藏层>2的神经网络
深度学习:使用深层架构(如深度神经网络)的机器学习方法
二、感知器(神经元)
2.1 感知器的定义
一个感知器如下图所示:

一个感知器由以下三部分组成:
- 输入权值:一个感知器可以接收多个输入,即{x1,x2,...,xn},每个输入上有一个权值wi,还有一个偏置项b(即w0,可以假设该权重对应的输入是1)
- 激活函数:有很多选择,这里以阶跃函数f举例:

- 输出:用下面这个公式来计算:

2.2 感知器的训练
权重项目和偏置项获得需要使用感知器训练算法:
将权重项和偏置项初始化为0,然后利用感知器规则迭代wi和b,直到训练完成:

其中,t是训练样本的实际值,一般称之为label。而y是感知器的输出值,它是根据公式(1)计算得出。η是学习速率,作用是控制每一步调整权的幅度。
训练流程如下:
每次从训练数据中取出一个样本的输入向量x,使用感知器计算其输出y,再根据上面的规则来调整权重。每处理一个样本就调整一次权重。经过多轮迭代后(即全部的训练数据被反复处理多轮),就可以训练处感知器的权重,使之实现目标函数。
2.3、感知器的实现
class Perceptron(object):def __init__(self, input_num, activator_fun):self.activator = activator_funself.weights = [0.0] * input_numself.bias = 0.0print("initial weight:{0}, bias:{1}".format(self.weights, self.bias))def __str__(self):'''打印学习到的权重、偏置项'''return 'weights: {0} ' \'bias: {1}\n'.format(self.weights, self.bias)def predict(self, input_vec):'''输入向量,输出感知器的计算结果'''# 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起# 变成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用map函数计算[x1*w1, x2*w2, x3*w3]# 最后利用sum求和zipped = list(zip(input_vec, self.weights))sum_total = sum(list(map(lambda x_y: x_y[0] * x_y[1], zipped)))return self.activator(sum_total + self.bias)def train(self, input_vecs, labels, iteration, rate):'''输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率'''for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):'''一次迭代,把所有的训练数据过一遍'''# 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]# 而每个训练样本是(input_vec, label)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):'''按照感知器规则更新权重'''# 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起# 变成[(x1,w1),(x2,w2),(x3,w3),...]# 然后利用感知器规则更新权重print(input_vec, output, label, "rate", rate)delta = label - outputself.weights = list(map(lambda x_w: rate * delta * x_w[0] + x_w[1],zip(input_vec, self.weights)))# 更新biasself.bias += rate * deltaprint(self.weights, self.bias, delta)def f_active_function(x):'''定义激活函数f'''return 1 if x > 0 else 0def get_training_dataset():'''基于and真值表构建训练数据'''# 构建训练数据# 输入向量列表input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]# 期望的输出列表,注意要与输入一一对应# [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0labels = [1, 0, 1, 1]return input_vecs, labelsdef train_and_perceptron():'''使用and真值表训练感知器'''# 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为fp = Perceptron(2, f_active_function)# 训练,迭代10轮, 学习速率为0.1input_vecs, labels = get_training_dataset()p.train(input_vecs, labels, 10, 0.1)# 返回训练好的感知器return pif __name__ == '__main__':# 训练and感知器and_perception = train_and_perceptron()print(and_perception)print("input value{0}, predict:{1}".format([0, 0], and_perception.predict([0, 0])))print(and_perception.predict([1, 0]))print(and_perception.predict([0, 1]))print(and_perception.predict([1, 1]))
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
