自己动手写深度学习框架(感知机)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

所谓的感知机,其实本质上就是一个分类问题。假设一个事物有两个feature,那么可以根据这两个feature,来判断当前物体属于哪一个类别。判断的时候,有两种情况,一种是线性可分,一种是线性不可分。

1、or的情况

所谓的or,就是假设希望在1、0,0、1,1、1的时候,输出都是1。只有等到0、0的时候,才输出为0。这样讲起来,可能不是很直观,可以用一个图来表示,

如果是转换成python代码的形式,一般是这样的,

复制代码
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(w*x)+b
    if tmp <= 0:
        return 0
    else:
        return 1

这里的参数0.5、0.5、-0.2只是为了说明问题而存在的。实际开发过程中,比如深度学习,这些参数最终都是通过算法和大量的数据,迭代训练出来的。这里只是为了演示挑选出来的。

2、and的情况

有了or的情况,那么and也比较好理解了。那就是在0、0,1、0,0、1的时候都输出为0,只有等到1、1的时候,才输出为1。如果用上面的图形表示,就是左下方三个点属于一个类别,右上方的一个点属于一个类别。目测一下来,它也是可以找到这样一根判别线的。

3、nand的情况

nand和and是一样的,只是0、0,1、0,0、1的时候输出为1,只有等到1、1的时候,输出为0。看上出输出结果有点奇怪,但还是可以通过一根判别线进行线性可分的。

4、xor的情况

一切看上去都没有问题,也很完美。但是如果遇到异或这样的计算,问题就来了。因为,出现0、0,1、1的时候,输出为0。而只有等到0、1,1、0的时候,结果才是1。画成二维曲线的时候,就是这样的一种形式,

如果是这种情况,不管用什么直线,都是没有办法进行区分的。如果要区分的话,只能想办法构建非线性函数才能去区分。

5、怎么构建非线性函数

前面我们构建曲线的时候,都是直接在输入和输出之间,通过映射的方法去解决。其实还有一种办法,就是通过中间层的办法来解决,比如像这样,

复制代码
def XOR(x1,x2): # very important, similar to neuron network
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

对于输入的x1、x2,我们先计算s1、s2中间数据,然后再通过s1、s2去输出最终的结果。这样就可以达到我们的目的,即非线性分解,

这也就是多层网络的由来。感知机是神经网络的基础。里面的一些基本概念,比如激励函数,比如多层网络,这些和神经网络都是通用的。大家可以先理解一下感知机的概念,自己去写一些对应的python代码,这样或许印象会更加深刻一点。

相关推荐
喵叔哟3 分钟前
02-YOLO-v8-v9-v10工程差异对比
人工智能·yolo·机器学习
玄同7655 分钟前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
心疼你的一切5 分钟前
模态交响:CANN驱动的跨模态AIGC统一架构
数据仓库·深度学习·架构·aigc·cann
L、2186 分钟前
CANN 内存管理深度解析:高效利用显存,突破 AI 推理瓶颈
人工智能
聊聊科技7 分钟前
原创音乐人使用AI编曲软件制作伴奏,编曲用什么音源好听
人工智能
爱吃烤鸡翅的酸菜鱼7 分钟前
CANN ops-nn卷积算子深度解析与性能优化
人工智能·性能优化·aigc
向哆哆7 分钟前
CANN生态安全保障:cann-security-module技术解读
人工智能·安全·cann
The Straggling Crow9 分钟前
模型全套服务 cube-studio
人工智能
User_芊芊君子10 分钟前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
小羊不会打字12 分钟前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习