【头歌】重生之CNN图片分类基础

本文介绍了深度学习中的基础操作,包括卷积、池化和dropout的实现。首先,详细讲解了如何使用Python实现卷积操作,包括创建输出矩阵、计算每个点的卷积值等步骤。接着,讨论了池化操作的实现,根据输入矩阵大小和池化步长计算输出矩阵尺寸。最后,阐述了dropout操作的实现,通过随机丢弃神经元来防止过拟合。这些基础知识对于理解和实现深度学习模型至关重要。

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

创作不易,参考之前,点个赞,收藏,关注一下不过分吧,家人们

第1关:卷积操作

任务描述

本关任务:本关的小目标是编写一个实现卷积操作的函数

编程要求

根据提示,在右侧编辑器补充代码,计算输入矩阵在指定卷积核下的输出。

其中,测试输入格式如下:第一行为输入矩阵大小 n ,后 n 行为输入矩阵。

输出格式如下:输入矩阵经过给定卷积核的卷积操作后得到的输出矩阵,为 numpy 的 ndarray 格式。

#根据输入矩阵的大小创建输出的大小
#input:输入矩阵,类型为munpy
#output:全0的输出矩阵,类型为numpy
def generate_dst(srcImg):
    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    row, col = np.shape(srcImg)
    kr,kc = np.shape(test_kernel)

    dst = np.zeros((row-kr+1,col-kc+1))
    return dst
    # ********** End **********#

# 调用generate_dst函数,预分配输出,并调用_con_each计算输出矩阵中每个点的值
# input:src为输入矩阵,类型为munpy;kernel为卷积核,类型为numpy;k_size为卷积核的维度
# output:输出矩阵,类型为numpy
def conv_2d(src, kernel, k_size):
    dst = generate_dst(src)
    for i in range(dst.shape[0]):
        for j in range(dst.shape[1]):
            value = _con_each(src[i:i + k_size, j:j + k_size], kernel)
            dst[i, j] = value
    return dst.astype(int)

# 供conv_2d调用,计算输出矩阵中每个点的值
# input:src为输入矩阵中被卷积的部分,类型为munpy;kernel为卷积核,类型为numpy
# output:输入矩阵中被卷积的部分与卷积核的结果
def _con_each(src, kernel):
    pixel_count = kernel.size;
    pixel_sum = 0;
    _src = src.flatten();
    _kernel = kernel.flatten();

    for i in range(pixel_count):
        pixel_sum += _src[i] * _kernel[i];

    return pixel_sum

第2关:池化操作

任务描述

本关任务:本关的小目标是编写一个实现池化操作的函数。

编程要求

根据提示,在右侧编辑器的 begin-end 间补充代码,实现基本的池化操作。

其中,测试输入的第一行为输入矩阵的尺寸 n,后 n 行为输入矩阵。

测试输出为池化后的输出矩阵,为 numpy 的 ndarray 格式。

   # outputMap sizes
    #根据inputMap的大小,poolStride大小算出输出大小,并用np.zeros()进行预分配
    #其中,变量名定义如下:
    # out_row为输出的行数,out_col为输出的列数,outputMap为预分配内存的输出矩阵
    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    out_row, out_col = int(np.floor(in_row / poolStride)), int(np.floor(in_col / poolStride))
    row_remainder, col_remainder = np.mod(in_row,
poolStride), np.mod(in_col, poolStride)
    if row_remainder != 0:
        out_row += 1
    if col_remainder != 0:    
        out_col += 1
    outputMap = np.zeros((out_row, out_col))
    # ********** End **********#

第3关:dropout与正则化

任务描述

本关任务:编写一个实现按概率进行 dropout 的函数。

编程要求

根据提示,在右侧编辑器的 begin-end 间补充代码,实现模拟网络中节点按指定概率进行 dropout。

测试输入的第一行为一个向量,模拟网络中的节点。第二行为被 dropout 的比例。

测试输出为一个向量,模拟被按概率 dropout 后的网络节点。

  # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
    # 硬币 正面的概率为p,n表示每个神经元试验的次数
    # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
    # 生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
    # 并屏蔽某些神经元,让它们的值变为0

    # 请在此添加代码 完成本关任务
    # ********** Begin *********#
    sample = np.random.binomial(n=1, p=retain_prob, size=x.shape)
    x *= sample
    # ********** End **********#
    return x


注:内容只做参考和分享,未经允许不可传播,侵权立删

### 卷积运算在深度学习中的应用 卷积运算是深度学习领域的重要工具之一,在图像识别、自然语言处理以及语音信号处理等方面具有广泛的应用。它通过局部感知和参数共享机制,能够有效提取输入数据的空间特征。 #### 应用场景 1. **图像分类** 在卷积神经网络(CNN)中,卷积层通过对输入图像执行滑动窗口操作来捕获局部模式,从而实现高效的特征提取[^1]。这些特征随后被传递到后续的池化层和全连接层以完成最终的任务预测。 2. **目标检测与分割** 利用多尺度卷积核设计,模型可以捕捉不同大小的目标对象并标记其位置或范围。例如 Faster R-CNN 和 Mask R-CNN 都依赖于复杂的卷积结构来进行精确的对象定位与像素级标注[^3]。 3. **超分辨率重建** 反卷积(也称为转置卷积)技术允许从较低维度表示恢复原始尺寸的数据样本。这种能力特别适用于生成清晰度更高的图片版本[^2]。 4. **风格迁移** 结合多个层次上的抽象信息,可以通过调整权重系数让一张照片呈现出另一种艺术风格的效果。 --- ### 实现方式 以下是基于 Python 的 TensorFlow/Keras 平台构建简单 CNN 模型的一个例子: ```python import tensorflow as tf from tensorflow.keras import layers, models def create_cnn_model(input_shape=(28, 28, 1)): model = models.Sequential() # 添加第一个卷积层 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape)) model.add(layers.MaxPooling2D((2, 2))) # 下采样 # 第二个卷积层 model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) # 展平层 model.add(layers.Flatten()) # 全连接层 model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10)) # 输出层 return model model = create_cnn_model() print(model.summary()) ``` 上述代码展示了如何定义一个基础的二维卷积神经网络架构。每一层都经过精心配置以便逐步减少空间复杂度的同时增加通道数量,进而增强表达力[^5]。 --- ### 数学原理概述 假设有一个 \( m \times n \) 大小的输入矩阵 X 和一个 \( k \times l \) 尺寸的小型过滤器 W,则两者之间的标准离散形式下的二维卷积计算如下所示: \[ Y[i,j]=\sum_{u=0}^{k-1}\sum _{v=0}^{l-1}{X}[i+u,\ j+v]*W[u,v] \] 其中 Y 表示输出结果集的一部分;\( i,j \) 定义了当前正在考虑的位置索引;而 u 和 v 控制着遍历整个滤波器的过程。 此外还存在其他变体如分组卷积、深度可分离卷积等优化方法进一步提升效率或者降低内存消耗需求[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值