不用框架入门与进阶深度学习(1)-手写感知器

转自公众号-AI圈终身学习,深度学习零基础入门与面试必会
致力于提供一个有情怀的集训互享开源平台,欢迎关注。


文集介绍

不用框架,代码手撸深度神经网络,系列文章。适合零基础入门,更适合进阶。系列文章,提前关注不迷路。适宜人群:

  • 深度学者初学者
  • 深度学习面试进阶者
  • 有意向转行AI的IT从业者
  • 对深度学习感兴趣的在校大学生

纸上得来终觉浅,文集所有代码地址:https://github.com/AIGroup-Z/deep-neural-network

这是本文集暂定要写的内容:

image

写在前面

上篇文章我们解释了什么是深度学习,以及神经网络。当然您可能觉得一头雾水,那是很正常的,因为我们还没有介绍神经网络的基本组成单元-感知器。

一、感知器是什么?

如图,红色加粗部分就是一个感知器:


image

我们把它抠出来,就变成了这个样子:


image

感知器为框里的部分,它不包括输入层。因此,其组成如下:

  • 权重与偏置项 一个感知器有多个输入(x_1, x_2, ...,x_n|x_i \in \mathbb R),每个输入有对应权重(w_1, w_2, ...,w_n|w_i \in \mathbb R),此外还有个b\in\mathbb R的偏置项。
  • 激活函数 感知器有很多种激活函数可选,我们暂时选择阶跃函数f做为激活函数:
image

所以我们的感知器最后得到的输出结果是:


image

可能您看得有点晕,俗话说代码胜千言,接下来我们用感知器实现一个与门(and)或门(or)函数。

二、动手实现感知器

2.1 任务与数据介绍

这一节我们实现一个and函数。and函数非常简单,只有当两个输入都为1的时候,它的输出才为1,真值表如下:


image

因此我们的训练数据如下:

# 数据准备
def get_and_training_dataset():
    x_train = [[0, 0], [0, 1], [1, 0], [1, 1]]
    y_train = [0, 0, 0, 1]
    return x_train, y_train

现在,我们有两个输入x_1=1和x_2=1,我们获得的权重值是w_1=0.2;w_2=0.1与b=-0.2。这个时候它就是and感知机。为什么?我们以输入x_1=1,x_2=1进行验证,其他输入请读者自己验算,结果如下:

image

那么这个权重值是怎么来的呢?这是一种叫梯度下降的训练方式更新出来的,流程如下:

  • 第一步 初始化权重w_i和偏置项b为0.
  • 第二步 迭代更新权重w_i和偏置项b,规则如下:
image

其中\delta读(delta)叫学习率,y为正确的输出,\widehat{y}(读yhat)为预测的输出。如果这些符号看不懂没关系,直接看下一节的代码就明白了。

为什么是这样的更新规则,我们留在下一节讲,这里您只需要知道流程即可。

2.2 代码实现

文集所有代码地址:https://github.com/AIGroup-Z/deep-neural-network

import numpy as np

class Perceptron(object):
    def __init__(self, input_feature_num, activation=None):
        self.activation = activation if activation else self.sign
        self.w = [0.0] * input_feature_num
        self.b = 0.0

    def sign(self, z):
        # 阶跃激活函数:
        # sign(z) = 1 if z > 0 
        # sign(z) = 0 otherwise
        return int(z>0)
    
    def predict(self, x):
        # 预测输出函数
        # y_hat = f(wx + b)
        return self.activation(
            np.dot(self.w, x) + self.b)
    
    def fit(self, x_train, y_train, iteration, learning_rate):
        # 训练函数
        for _ in range(iteration):
            for x, y in zip(x_train, y_train):
                y_hat = self.predict(x)
                self._update_weights(x, y_hat, y, learning_rate)
    
    def _update_weights(self, x, y_hat, y, learning_rate):
        # 权重更新, 对照公式查看
        delta = y - y_hat
        self.w = np.add(self.w,
                        np.multiply(learning_rate * delta, x))
        self.b += learning_rate * delta
    
    def __str__(self):
        return 'weights: {}\tbias: {}'.format(self.w, self.b)

模型和数据我们都有了,接下来直接训练即可获得and感知器:

# 模型训练
x_train, y_train = get_and_training_dataset()
and_p = Perceptron(2)
and_p.fit(x_train, y_train, iteration=5, learning_rate=0.1)

最终预测输出如下:

# 预测数据
print('and 感知机权重:\n', and_p, '\n')
print('1 & 1 = %d' % and_p.predict([1, 1]))
print('1 & 0 = %d' % and_p.predict([1, 0]))
print('0 & 1 = %d' % and_p.predict([0, 1]))
print('0 & 0 = %d' % and_p.predict([0, 0]))
image
2.3 作业:实现一个or感知机

在这里(https://github.com/AIGroup-Z/deep-neural-network) 查看代码您会发现,我们在Jupyter Notebook上留了这个作业,你可以在我们的代码基础上实现它,以确认自己已经掌握了感知机。

三、结语

本节主要介绍了神经网络中的元单元-感知机,并且使用它做了一个与门与或门,不知道您觉得这节难度如何?好消息是恭喜你走出了深度学习的第一步,后面我们会介绍更加有趣的部分,并且将感知器用于实战当中,敬请期待。

参考资料:

文集所有代码地址:https://github.com/AIGroup-Z/deep-neural-network


如果有任何问题,你不是一个人。可以在公众号首页找到我们的组队学习群。

公众号修饰图pure.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容