深度学习入门笔记1 感知器

简介: 深度学习入门笔记1 感知器

深度学习

基本概念

  • 深度学习是机器学习算法中的一类,其源于人工神经网络的研究。
  • 深度学习广泛应用在计算机视觉,音频处理,自然语言处理等诸多领域。
  • 深度可以理解为数据计算转换的层数。

机器学习&深度学习

深度学习可以看做是机器学习的一个研究领域(没有严格的定义)。目前,机器学习主要处理结构化数据,而深度学习主要处理非结构化数据。

神经元

深度学习从生物学中受到启发,其灵感来自于人脑的神经网络。 神经网络可以看做是由若干神经元构成。

神经元是大脑中相互连接的神经细胞。其可以处理和传递化学与电信号。

其中,树突用来接收信号(可能包含多个信号),如果累加的信号超过一定的阈值,经过细胞体的整合,就会生成一个输出信号,经过轴突传递给下一个神经元。也就是说,如果输入的信号超过一定的阈值,我们就可以认为神经元被激活,否则,我们可以认为神经元被抑制。

感知器

算法说明

1957年,美国学者Frank Rossenblatt(弗兰克·罗森布拉特)提出了感知器(感知机)算法。感知器用来接收多个信号,输出一个信号(由多个神经元组成)。每个输入信号具有一定的权重,计算多个输入信号的值与权重的乘积和,根据该结果(和)与指定的阈值进行比较,来决定该神经元是否被激活。

说明:

  • 感知器是神经网络起源的算法,该思想对于学习神经网络是非常具有指导意义的。

算法公式

根据感知器的定义可知,感知器可以实现二分类的任务。感知器的计算方式如下:


image.png


image.png

更新原则

感知器的权重更新依据是:如果预测准确,则权重不进行更新,否则,增加权重,使其更趋向于正确的类别。

实现步骤

  1. 对权重进行初始化。(初始化为0或者很小的数值。)
  2. 对训练集中每一个样本进行迭代,计算输出值y。
  3. 根据输出值y与真实值,更新权重。
  4. 循环步骤2。直到达到指定的次数(或者完全收敛)。

说明:

  • 如果两个类别线性可分,则感知器一定会收敛。
  • 如果两个类别线性不可分,则感知器一定不会收敛。

程序示例

参考之前感知器的实现步骤,使用感知器实现与门与或门的计算。

与门

x0 x1 x2 y
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1

或门

x0 x1 x2 y
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

练习

  1. 使用感知器实现或门的运算。
  2. 对上例使用不同的初始化权重,会得到什么结果?
import numpy as np
# 定义数据集
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
# 定义标签(每个样本所属的分类)。
y = np.array([0, 0, 0, 1])
# 定义权重。对于单层感知器,权重通常初始化为0或者很小的数值。
# w = np.zeros(3)
w = np.random.random(3)
# 定义学习率。
eta = 0.1
for epoch in range(7):
    for x, target in zip(X, y):
        # 计算净输入 
        z = np.dot(w, x)
        # 根据净输入,计算分类值。
        y_hat = 1 if z >= 0 else 0
        # 根据预测值与真实值,进行权重调整。
        w = w + eta * (target - y_hat) * x
        # 注意数组的矢量化计算,相当于执行了以下的操作。
    #     w[0] = w[0] + eta * (y - y_hat) * x[0]
    #     w[1] = w[1] + eta * (y - y_hat) * x[1]
    #     w[2] = w[2] + eta * (y - y_hat) * x[2]
        print(target, y_hat)
        print(w)

感知器的局限

尝试使用感知器实现异或门,会得到怎样的结果。

b x1 x2 y
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 0
# 使用单层感知器无法实现异或门。
# 感知器的局限:如果两个类别的样本在空间中线性不可分,则感知器永远也不会收敛。
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
y = np.array([0, 1, 1, 0])
# w = np.zeros(3)
w = np.random.random(3)
eta = 0.1
for epoch in range(70):
    for x, target in zip(X, y):
        z = np.dot(w, x)
        y_hat = 1 if z >= 0 else 0
        w = w + eta * (target - y_hat) * x
        print(target, y_hat)
        print(w)

算法的Python实现

现在,我们使用Python语言来实现感知器算法,进行鸢尾花的分类。

class Perceptron:
    """通过Python语言实现感知器类。用来进行二分类任务。"""
    def __init__(self, eta, epoch):
        """初始化方法。
        Parameter:
        -------
        eta: float
            学习率。
        epoch: int
            对训练集训练的轮数。
        """
        self.eta = eta
        self.epoch = epoch
    def step(self, z):
        """阶跃函数。对净输入进行转换。
        Parameter:
        -----
        z: 标量或数组类型
            净输入。
        Return:
        ------
        t: 变量或数组类型。
            分类的结果。0或者1。当z >= 0时,返回1,否则返回0。
        """
#         return 1 if z >= 0 else 0
        return np.where(z >= 0, 1, 0)
    def fit(self, X, y):
        """训练方法。
        Parameter:
        X: 类数组类型。形状为 (样本数量, 特征数量)
            提供的训练集。
        y: 类数组类型。形状为(样本数量,)
            样本对应的标签(分类)
        """
        # 对类型进行转换,不管是什么二维类型,统一转换成二维的ndarray数组类型。
        X = np.asarray(X)
        y = np.asarray(y)
        # 注意:权重的数量要比特征的数量多1。多出来的一个就是偏置。
        self.w_ = np.zeros(X.shape[1] + 1)
        # 定义损失列表。用来存放每个epoch迭代之后,分类错误的数量。
        self.loss_ = []
        # 迭代epoch指定的轮数。
        for i in range(self.epoch):
            # 用来记录单次epoch的损失值(分类错误的数量)
            loss = 0
            for x, target in zip(X, y):
                # 计算净输入
                z = np.dot(x, self.w_[1:]) + self.w_[0]
                # 根据净输入,计算分类。
                y_hat = self.step(z)
#                 if target != y_hat:
#                     loss += 1
                loss += target != y_hat
                # 调整权重
                self.w_[1:] += self.eta * (target - y_hat) * x
                # 调整偏置
                self.w_[0] += self.eta * (target - y_hat)
            # 将损失值加入到损失列表当中。 
            self.loss_.append(loss)
    def predict(self, X):
        """预测方法。根据提供的数据集X,返回每一个样本对应的标签(分类)。
        Parameter:
        -----
        X: 类数组类型。形状为 (样本数量, 特征数量)
            提供预测集。
        Return:
        -----
        label: 类数组类型。形状为:(样本数量,)
            预测的每一个便签分类。
        """
        X = np.asarray(X)
        # 计算净输入。(矢量化计算,没有使用循环分别对每一个样本求净输出)
        z = np.dot(X, self.w_[1:]) + self.w_[0]
        # 获取最终的分类结果。(一维数组类型。)
        result = self.step(z)
        return result
# 感知器类进行测试。
X = np.array([[1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]])
y = np.array([0, 0, 0, 1])
p = Perceptron(0.1, 7)
p.fit(X, y)
print(p.w_)
print(p.loss_)

练习

  • 使用感知器对鸢尾花的后两个类别进行分类。
  • 使用Python实现train_test_split方法的功能。


相关文章
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
1月前
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
85 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
1月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
56 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
将Keras训练好的.hdf5模型转换为TensorFlow的.pb模型,然后再转换为TensorRT支持的.uff格式,并提供了转换代码和测试步骤。
83 3
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习之格式转换笔记(二):CKPT 转换成 PB格式文件
将TensorFlow的CKPT模型格式转换为PB格式文件,包括保存模型的代码示例和将ckpt固化为pb模型的详细步骤。
28 2
深度学习之格式转换笔记(二):CKPT 转换成 PB格式文件
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习之格式转换笔记(一):模型文件pt转onnx转tensorrt格式实操成功
关于如何将深度学习模型从PyTorch的.pt格式转换为ONNX格式,然后再转换为TensorRT格式的实操指南。
96 0
深度学习之格式转换笔记(一):模型文件pt转onnx转tensorrt格式实操成功
|
1月前
|
机器学习/深度学习 数据可视化 Windows
深度学习笔记(七):如何用Mxnet来将神经网络可视化
这篇文章介绍了如何使用Mxnet框架来实现神经网络的可视化,包括环境依赖的安装、具体的代码实现以及运行结果的展示。
50 0
|
1月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
49 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
1月前
|
机器学习/深度学习 并行计算 PyTorch
深度学习环境搭建笔记(一):detectron2安装过程
这篇博客文章详细介绍了在Windows环境下,使用CUDA 10.2配置深度学习环境,并安装detectron2库的步骤,包括安装Python、pycocotools、Torch和Torchvision、fvcore,以及对Detectron2和PyTorch代码的修改。
86 1
深度学习环境搭建笔记(一):detectron2安装过程
|
1月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
159 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现