【DeepLearning.AI】使用numpy搭建卷积神经网络

本文详细介绍了如何使用numpy搭建卷积神经网络,涵盖了卷积层的0值边界填充、单步卷积、前向传播,以及池化层的前向传播和反向传播过程,同时涉及反向传播中卷积层和池化层的梯度计算。内容基于DeepLearning.AI的课程,旨在帮助理解卷积神经网络的工作原理。

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

使用numpy搭建卷积神经网络

主要内容来自DeepLearning.AI的卷积神经网络

本文使用numpy实现卷积层和池化层,包括前向传播和反向传播过程。

在具体描述之前,先对使用符号做定义。

  • 上标[I]表示神经网络的第Ith层。
    • a [ 4 ] a^{[4]} a[4]表示第4层神经网络的激活值; W [ 5 ] W^{[5]} W[5] b [ 5 ] b^{[5]} b[5]表示神经网络第5层的参数;
  • 上标(i)表示第i个数据样本
    • x ( i ) x^{(i)} x(i)表示第i个输入样本
  • 下标i表示向量的第i个元素
    • a i [ l ] a_i^{[l]} ai[l]表示神经网络第l层的激活向量的第i个元素。
  • n H , n W , n C n_H,n_W,n_C nH,nW,nC表示当前层神经网络的高度、宽度和通道数。
  • n H p r e v , n W p r e v , n C p r e v n_{H_{prev}},n_{W_{prev}},n_{C_{prev}} nHprevnWprevnCprev表示上一层神经网络的高度、宽度和通道数。

1. 导入包


首先,导入需要使用的工具包。

import numpy as np
import h5py
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['figure.figsize'] = (5.0, 4.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

%load_ext autoreload
%autoreload 2

np.random.seed(1) # 指定随机数种子

2. 大纲


本文要实现的卷积神经网络的几个网络块,每个网络包含的功能模块如下。

  • 卷积函数Convolution

    • 0填充边界
    • 卷积窗口
    • 卷积运算前向传播
    • 卷积运算反向传播
  • 池化函数Pooling

    • 池化函数前向传播
    • 掩码创建
    • 值分配
    • 池化的反向传播

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdueA44q-1589298710418)(https://dijvuftadtswhbvbrhckte.coursera-apps.org/notebooks/week1/images/model.png)]

在每个前向传播的函数中,在参数更新时会有一个反向传播过程;此外,在前向传播过程会缓存一个参数,用于在反向传播过程中计算梯度。

3. 卷积神经网络


尽管当下存在很多深度学习框架使得卷积网络使用更为便捷,但是卷积网络在深度学习中仍然是一个难以理解的运算。卷积层能将输入转换为具有不同维度的输出,如下图所示。

image-20200512164859913

接下来,我们自己实现卷积运算。首先,实现两个辅助函数:0填充边界和计算卷积。

3.1 0值边界填充


0值边界填充顾名思义,使用0填充在图片的边界周围。

PAD

使用边界填充的优点:

  • 可以保证使用上一层的输出结果经过卷积运算后,其高度和宽度不会发生变化。这个特性对于构建深层网络非常重要,否则随着网络深度的增加,计算结果会逐步缩水,直至降为1。一种特殊的的“Same”卷积,可以保证计算结果的宽度和高度不发生变化
  • 可以在图像边界保留更多的信息。不适用填充的情况下,图像的边缘像素对下一层结果的影响小(图像的中间像素使用滑动窗口时会遍历多次,而边界元素则比较少,有可能只使用1次)。
# GRADED FUNCTION: zero_pad

def zero_pad(X, pad):
    """
    把数据集X的图像边界用0值填充。填充情况发生在每张图像的宽度和高度上。
    
    参数:
    X -- 图像数据集 (m, n_H, n_W, n_C),分别表示样本数、图像高度、图像宽度、通道数 
    pad -- 整数,每个图像在垂直和水平方向上的填充量
    
    返回:
    X_pad -- 填充后的图像数据集 (m, n_H + 2*pad, n_W + 2*pad, n_C)
    """
    # X数据集有4个维度,填充发生在第2个维度和第三个维度上;填充方式为0值填充
    X_pad = np.pad(X, (
        			(0, 0),# 样本数维度,不填充
        			(pad, pad), #n_H维度,上下各填充pad个像素
        			(pad, pad), #n_W维度,上下各填充pad个像素
        			(0, 0))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值