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

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
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STN-CNN-LSTM-CTC是一种基于卷积神经网络(CNN)、长短时记忆网络(LSTM)、空间变换网络(STN)和CTC(连接时序分类)的端到端语音识别模型。它的实现需要使用深度学习框架,如Tensorflow或PyTorch等。 以下是一个Tensorflow实现的代码示例: ```python import tensorflow as tf from tensorflow.contrib.rnn import LSTMCell # 定义STN网络 def stn(image, theta, out_size): # 定义一个空间变换网络层 with tf.name_scope('STN'): # 从theta参数中提取出平移和旋转参数 theta = tf.reshape(theta, (-1, 2, 3)) # 通过theta参数生成变换矩阵 t_g = tf.contrib.image.transform(theta, image, out_size) return t_g # 定义CNN网络 def cnn(inputs, is_training): # 定义卷积层和池化层 conv1 = tf.layers.conv2d(inputs, filters=32, kernel_size=[3, 3], padding='same', activation=tf.nn.relu) pool1 = tf.layers.max_pooling2d(conv1, pool_size=[2, 2], strides=2) conv2 = tf.layers.conv2d(pool1, filters=64, kernel_size=[3, 3], padding='same', activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(conv2, pool_size=[2, 2], strides=2) # 展平卷积层输出 shape = pool2.get_shape().as_list() pool2_flat = tf.reshape(pool2, [-1, shape[1] * shape[2] * shape[3]]) # 定义全连接层 fc1 = tf.layers.dense(pool2_flat, 512, activation=tf.nn.relu) fc1 = tf.layers.dropout(fc1, rate=0.5, training=is_training) fc2 = tf.layers.dense(fc1, 512, activation=tf.nn.relu) fc2 = tf.layers.dropout(fc2, rate=0.5, training=is_training) return fc2 # 定义LSTM网络 def lstm(inputs, num_layers, num_units): # 定义多层LSTM网络 cells = [] for i in range(num_layers): cell = LSTMCell(num_units) cells.append(cell) stacked_lstm = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True) # 运行LSTM网络 outputs, _ = tf.nn.dynamic_rnn(stacked_lstm, inputs, dtype=tf.float32) return outputs # 定义CTC网络 def ctc_loss(inputs, targets, seq_length): # 定义CTC损失函数 ctc_loss = tf.nn.ctc_loss(targets, inputs, seq_length) loss = tf.reduce_mean(ctc_loss) return loss # 定义整个模型 def model(inputs, targets, seq_length, is_training): # 运行STN网络 theta = cnn(inputs, is_training) transformed_inputs = stn(inputs, theta, (32, 100)) # 运行CNN网络 cnn_outputs = cnn(transformed_inputs, is_training) # 运行LSTM网络 lstm_outputs = lstm(cnn_outputs, num_layers=2, num_units=256) # 定义输出层 logits = tf.layers.dense(lstm_outputs, units=26 + 1) # 26个字母和一个空格 # 定义损失函数 loss = ctc_loss(logits, targets, seq_length) # 返回输出和损失函数 return logits, loss ``` 这个代码实现包括STN网络、CNN网络、LSTM网络和CTC损失函数,可以用于端到端语音识别任务。需要注意的是,这个实现只是一个示例,具体的实现细节可能需要根据具体任务和数据集进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值