cnn 系列文章三 ----strides,padding详解,基于andrew ng的DeepLearning

本文详细解析卷积神经网络(CNN)中的strides(步长)和padding(填充),探讨如何使用padding避免边缘信息损失,以及在卷积操作中不同padding模式的影响。此外,介绍了多通道图像卷积和单层卷积的概念,结合实例阐述了卷积神经网络的基本构造。

cnn系列文章二 –初识滤波器

惯例,还是分享一句歌词呢。

《诗话小镇》
岁月如流沙苍老了风华
那誓言未长大
流年斑驳眉心朱砂
你画上哪个她
繁华褪尽薄了红纱

约定符号:

  • 输入图像: n×n n × n
  • 过滤器: f×f f × f
  • paddig(填充): p p
  • stride(步长): s

    padding

1. padding概念引入

这里写图片描述
当使用一个 3×3 3 × 3 的过滤器对 6×6 6 × 6 的图像进行卷积操作后,会得到 4×4 4 × 4 的输出图像。
此时输出图像大小为:

(nf+1)×(nf+1) ( n − f + 1 ) × ( n − f + 1 )

但是这样会带来两个缺点:

  1. 图像会越来越小
  2. 如上图,原图像左上角绿色区域纸杯一个过滤器使用,而中间红色区域会被多个过滤器使用,这就意味着边缘信息的丢失

为此引入padding(填充)的操作,即在卷积操作之前,先在图像边缘进行像素填充,像素值可以是0也可以是图像边缘像素,填充宽度为p,例如在上图中使用像素0对图像边缘填充,宽度p=1,此时输出图像和输入图像维度相等,并且图像左上角的像素被多个过滤器使用,边缘信息丢失的更少。
此时,输出图像的维度为:

(nf+2p+1)×(nf+2p+1) ( n − f + 2 p + 1 ) × ( n − f + 2 p + 1 )

2. padding填充模式

  1. padding=’VALID’

    此时 p=0 p = 0 ,即不填充, 输出图像为 (nf+1)×(nf+1) ( n − f + 1 ) × ( n − f + 1 )

  2. padding=’SAME’

    此时输入和输出图像维度相同,此时:

    p=f12 p = f − 1 2

    因为 nf+2p+1=n n − f + 2 p + 1 = n

    注意: 一般 f f 为奇数,主要有两个好处:

    • p可以取整数
    • 奇数过滤器有一个中点,也称锚点(anchor),便于确认过滤器的位置

stride (卷积步长)

这里写图片描述
不同于之前一次想左移动一格,此时向左移动两格,
这里写图片描述
同样的,也是向下移动两格
这里写图片描述

最终的输出图像大小为3×3

假设stride移动步长为s,则最后的输出图像为:

(n+2pfs+1)×(n+2pfs+1) ⌊ ( n + 2 p − f s + 1 ) ⌋ × ⌊ ( n + 2 p − f s + 1 ) ⌋

其中, ⌊ ⌋ 为向下取整

比如上图中:

(7+2×032+1)×(7+2×032+1)=3×3 ⌊ ( 7 + 2 × 0 − 3 2 + 1 ) ⌋ × ⌊ ( 7 + 2 × 0 − 3 2 + 1 ) ⌋ = 3 × 3

GRB多通道图像的卷积

比如在 6×6×3 6 × 6 × 3 ,过滤器的大小不在是 3×3 3 × 3 而是 3×3×3 3 × 3 × 3 ,最后的3对应为通道数(channels)。

这里写图片描述

卷积过程:比如第一个 3×3 3 × 3 与R通道卷积,会得到一个数,同理,第二个 3×3 3 × 3 与G通道卷积,第三个 3×3 3 × 3 与B通道卷积,然后将三个数累加,作为 4×4 4 × 4 的左上角第一个位置值,接下来依次在图像上滑动,最终得到 4×4 4 × 4 的输出。

我们肯定不能只在图像中检测一种特征,而是同时要检测水平,垂直,45度边缘等特征,此时就要使用多个过滤器了。假设我们使用两个过滤器,最终的输出为 4×4×2 4 × 4 × 2 ,这里的2是使用两过滤器的结果,同样,若是使用5个过滤器呢?输出结果就是 4×4×5 4 × 4 × 5 了。下面是计算的例子:

这里写图片描述

单层卷积

上一节,得到两个 4×4 4 × 4 的矩阵,通过python的广播机制在两个矩阵上加入偏差bias,然后经过非线性函数relu,即可得到单层卷积网络的输出。
图示如下:

这里写图片描述
公示表示如下:

z[l]=a[l1]f[l]+b[l] z [ l ] = a [ l − 1 ] ∗ f [ l ] + b [ l ]

a[l]=Relu(z[l]) a [ l ] = R e l u ( z [ l ] )

式子中 a[l] a [ l ] 标识第 l l 层的输出,f[l]标识第 l l 层的过滤器,b[l]标识第 l l 层的偏差

下面是动态计算的例子,跑的有点快,得计算一下,
这里写图片描述
比如:输出O[:,:,0]的左上角第一个值:

1=(0×1+0×1+0×1+0×1+0×0+1×1+0×1+0×1+1×0)+()+()+1=1+1+0+1

本系列课程的符号约束

  1. 过滤器需要四个参数确定:

    ××× 宽 度 × 高 度 × 通 道 数 × 过 滤 器 个 数

    其中,通道数与上一层图像输入的通道数相同,过滤器个数与本层输出图像的通道数相同。这一部分在下面的例子中会有深刻体现,并且在tensorflow函数调用中要明确指明的参数。

  2. 符号约定
    对于第 l l 层神经网络层:

    • f[l]:第 l l 层过滤器大小,f×f

    • p[l] p [ l ] :第 l l 层填充数量 p
    • s[l] s [ l ] : 第 l l 层步长大小 s
    • nlC n C l : 过滤器的个数

    • input:

      nl1H×nl1W×nl1C n H l − 1 × n W l − 1 × n C l − 1 : l1 l − 1 层输入图像的高宽以及通道数

    • output:

      nlH×nlW×nlC n H l × n W l × n C l : 输出图像的高、宽以及通道数

    • 输出图像的大小:
      • nlH=nl1H+2×p[l]f[l]s[l]+1 n H l = ⌊ n H l − 1 + 2 × p [ l ] − f [ l ] s [ l ] + 1 ⌋
      • nlW=nl1W+2×p[l]f[l]s[l]+1 n W l = ⌊ n W l − 1 + 2 × p [ l ] − f [ l ] s [ l ] + 1 ⌋
      • 输出图像通道数就是过滤器个数: nlC n C l

将输出的图像加上Bias然后经过非线性函数Relu即可完成一层卷积神经网络的构建了。

简单卷积神经网络实例

建议在此部分自己找张纸推导一遍,我当时跟着课程推导了两三个网络实例。
这里写图片描述
最后将第三层的输出通过softmax或logistic来进行相应的操作

这里写图片描述

在这个网络结构中,有两个参数的变化值得注意:

  • 图像宽度变化 3937177 39 → 37 → 17 → 7
  • 图像通道数变化 3102040 3 → 10 → 20 → 40

图像宽度逐层减半而图像通道逐层增加,关于这些超参数的确定,后边会给出一些建议

接下来讲解池化层以及卷积神经网络的架构

### 基于RNN和CNN的变分自编码器(VAE)实现与应用 #### RNN-VAE结构特点 对于序列数据,采用循环神经网络(RNN)作为编码器能够捕捉时间依赖关系。在解码阶段同样利用RNN逆向重建输入序列。这种架构特别适合处理文本、语音等时序特征明显的信息。 ```python from keras.layers import Input, LSTM, RepeatVector, Dense from keras.models import Model def build_rnn_vae(input_dim, timesteps, latent_dim): inputs = Input(shape=(timesteps, input_dim)) # 编码过程 encoded = LSTM(latent_dim)(inputs) # 解码过程 decoded = RepeatVector(timesteps)(encoded) decoded = LSTM(input_dim, return_sequences=True)(decoded) sequence_autoencoder = Model(inputs, decoded) encoder = Model(inputs, encoded) return sequence_autoencoder, encoder ``` 此代码片段展示了如何创建一个简单的基于LSTM单元的VAE框架[^4]。 #### CNN-VAE设计思路 卷积神经网络(CNN)擅长提取局部模式,在图像压缩领域表现优异。当应用于VAE时,通常会先用几层卷积操作降低维度至瓶颈层;再经反卷积逐步还原成原图尺寸。这种方式有助于保持空间位置不变性的同时减少参数量级。 ```python from keras.layers import Conv2DTranspose, Reshape, Flatten, BatchNormalization def build_cnn_vae(img_shape, intermediate_dim, batch_size, latent_dim): x_input = Input(batch_shape=(batch_size,) + img_shape) # 卷积编码路径 conv_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(x_input) pool_1 = MaxPooling2D((2, 2))(conv_1) ... flat = Flatten()(pool_n) hidden = Dense(intermediate_dim, activation='relu')(flat) z_mean = Dense(latent_dim)(hidden) z_log_var = Dense(latent_dim)(hidden) def sampling(args): z_mean_, z_log_var_ = args epsilon = K.random_normal(shape=K.shape(z_mean_), mean=0., stddev=1.) return z_mean_ + K.exp(z_log_var_/2)*epsilon z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var]) decoder_hid = Dense(intermediate_dim, activation='relu') decoder_upsample = Dense(... ,activation='relu') ... h_decoded = decoder_hid(z) up_decoded = decoder_upsample(h_decoded) reshape_decoded = Reshape(target_shape=(...,...,...))(up_decoded) deconv_1 = Conv2DTranspose(filters=..., kernel_size=(3, 3), strides=(2, 2),padding='valid', activation='relu')(reshape_decoded) ... outputs = Conv2DTranspose(filters=img_shape[-1],kernel_size=(3, 3), strides=(2, 2),padding='valid', activation='sigmoid')(deconv_n) vae = Model(x_input, outputs) encoder = Model(x_input,z_mean) return vae, encoder ``` 上述Python脚本定义了一个完整的二维图片用CVAE模型构建流程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值