卷积-池化-激活

本文介绍了卷积神经网络(CNN)中的卷积、池化和激活过程。通过Python和Torch实现,展示了如何在图像上应用这些操作,并通过实验结果分析其效果。同时,讨论了CNN为何能有效保留图像空间信息,提高图像识别性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01 实现卷积-池化-激活

CNN 会比较图片里的各个局部信息。在相似的位置上进行特征特征比对,会更好地分辨两张图片是否相同。

  • 卷积
    CNN提取局部信息的方式是通过卷积来实现的。具体的操作流程为
    1. 对于位置做乘法,得到 9 个值
    2. 9 个值进行相加
    3. 得到的值在除以 9

eg:
在这里插入图片描述

  • 池化
    池化层的主要作用是压缩特征,或者说是降低维度。当数据的维度比较高时,计算难度会急剧上升,可以通过降低维度的方法来降低所需算力。
    步骤:

    1. 选择窗口大小 (usually 2 or 3).
    2. 选择间隔 (usually 2).
    3. 使用窗口遍历特征图.
    4. 每个窗口取最大值.

    此时大图就变小了。
    在这里插入图片描述

  • 激活
    激活层的作用是微调数据,避免梯度消失。
    eg: ReLU()
    在这里插入图片描述

1.1 python实现

import numpy as np


x = np.array([[-1, -1, -1, -1, -1, -1, -1, -1, -1],
              [-1, 1, -1, -1, -1, -1, -1, 1, -1],
              [-1, -1, 1, -1, -1, -1, 1, -1, -1],
              [-1, -1, -1, 1, -1, 1, -1, -1, -1],
              [-1, -1, -1, -1, 1, -1, -1, -1, -1],
              [-1, -1, -1, 1, -1, 1, -1, -1, -1],
              [-1, -1, 1, -1, -1, -1, 1, -1, -1],
              [-1, 1, -1, -1, -1, -1, -1, 1, -1],
              [-1, -1, -1, -1, -1, -1, -1, -1, -1]])
print("x=\n", x)

# 初始化卷积核
Kernel = [[0 for i in range(0, 3)] for j in range(0, 3)]
Kernel[0] = np.array([[1, -1, -1], [-1, 1, -1], [-1, -1, 1]])
Kernel[1] = np.array([[1, -1, 1], [-1, 1, -1], [1, -1, 1]])
Kernel[2] = np.array([[-1, -1, 1], [-1, 1, -1], [1, -1, -1]])
print(Kernel)

# -----------卷积-----------
stride = 1
feature_map_h = 7
feature_map_w = 7
feature_map = [0 for i in range(0, 3)]
for i in range(0, 3):
    feature_map[i] = np.zeros((feature_map_h, feature_map_w))  
for h in range(feature_map_h):
    for w in range(feature_map_w):
        v_start = h * stride
        v_end = v_start + 3
        h_start = w * stride
        h_end = h_start + 3
        window = x[v_start:v_end, h_start:h_end]
        for i in range(0, 3):
            feature_map[i][h, w] = np.divide(np.sum(np.multiply(window, Kernel[i])), 9)
print(np.around(feature_map, decimals=2))

# -------------池化--------------
pooling_stride = 2
pooling_h = 4
pooling_w = 4
feature_map_pad_0 = [0 for j in range(0, 3)]
for i in range(0, 3):
    feature_map_pad_0[i] = np.pad(feature_map[i], ((0, 1), (0, 1))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值