TensorFlow之卷积函数(conv2d、depthwise_conv2d、separable_conv2d)

本文详述了TensorFlow中的卷积函数,包括tf.nn.conv2d的基本使用,如输入参数、卷积核、步长和填充方式,强调了卷积在卷积神经网络中的核心地位。

卷积函数是卷积神经网络(CNN)非常核心和重要的函数,在搭建CNN时经常会用到,因此较为详细和深入的理解卷积函数具有十分重要的意义。

1、tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None):在给定4维的输入和过滤器的张量时,计算一个2维卷积。

参数详解:

input:输入的参数或者说是图像tenors,input=[batch,in_height,in_width,in_channels],batch为图像数量,in_height和in_width分别为图像的长和宽,in_channels为图像的颜色通道(彩色为3,黑白为1)。一般我们在定义图像信息时,x都是1维的,比如x= tf.placeholder(tf.float32,[None,784]),None表示不限制输入数量,784表示一个784维的向量;在x传入conv2d之前需要对x进行变形,即将x变为input的形式,比如说x_image=tf.reshape(x,[-1,28,28,1]),其中-1代表样本数不确定,经过变形后x_image就可以被conv2d函数使用了。

filter:卷积核(滤波器),filter应该输入的是卷积的参数,filter=[filter_height, filter_width, in_channels, out_channels],其中filter_height和filter_width表示卷积核的尺寸,这里的in_channels与input中

TensorFlow 中,空洞卷积(Dilated Convolution)的输出尺寸计算与普通卷积有所不同,因为其引入了 **`dilation_rate`** 参数,该参数控制卷积核之间的采样间隔。空洞卷积的输出尺寸计算公式如下: ### 输出尺寸计算公式 对于输入尺寸为 $ W \times W $、卷积核大小为 $ F \times F $、步长(stride)为 $ S $、padding 的像素数为 $ P $、空洞率(dilation rate)为 $ D $,输出尺寸 $ W_{out} $ 可以通过以下公式计算: $$ W_{out} = \frac{W + 2P - D(F - 1) - 1}{S} + 1 $$ 其中: - $ W $:输入特征图的宽度(或高度,假设为正方形输入)。 - $ F $:卷积核的宽度(或高度)。 - $ S $:步长(stride)。 - $ P $:填充的像素数(padding size)。 - $ D $:空洞率(dilation rate)[^4]。 需要注意的是,公式中的 $ D(F - 1) $ 表示由于空洞卷积的采样间隔扩大后,卷积核实际覆盖的输入区域大小。当 $ D = 1 $ 时,空洞卷积等同于普通卷积。 ### 示例代码 以下是一个使用 `tf.nn.atrous_conv2d` 实现空洞卷积并计算输出尺寸的示例: ```python import tensorflow as tf # 定义输入参数 input_size = 32 # 输入特征图的尺寸 (假设为 32x32) filter_size = 3 # 卷积核尺寸 (3x3) stride = 1 # 步长 padding = 'SAME' # 填充方式 dilation_rate = 2 # 空洞率 # 计算输出尺寸 def calculate_output_size(input_size, filter_size, stride, dilation_rate, padding): effective_filter_size = dilation_rate * (filter_size - 1) + 1 if padding == 'SAME': output_size = (input_size + stride - 1) // stride elif padding == 'VALID': output_size = (input_size - effective_filter_size + 1 + stride - 1) // stride return output_size # 调用计算函数 output_size = calculate_output_size(input_size, filter_size, stride, dilation_rate, padding) # 构建空洞卷积操作 input_tensor = tf.random.normal([1, input_size, input_size, 3]) # 输入张量 [batch, height, width, channels] filter_tensor = tf.random.normal([filter_size, filter_size, 3, 16]) # 卷积核 [height, width, in_channels, out_channels] output_tensor = tf.nn.atrous_conv2d(input_tensor, filter_tensor, rate=dilation_rate, padding=padding) print("输出特征图尺寸:", output_size) print("输出张量形状:", output_tensor.shape) ``` ### 公式解析 - **有效卷积核大小**:空洞卷积卷积核实际覆盖的区域大小为 $ D(F - 1) + 1 $,这是因为卷积核的元素之间插入了 $ D - 1 $ 个零,从而扩大了感受野。 - **Padding**:如果使用 `'SAME'` 填充,输出尺寸与输入尺寸保持一致;如果使用 `'VALID'` 填充,则不进行额外填充,输出尺寸会减小。 ### 相关问题 1. 如何在 TensorFlow 中实现深度可分离卷积Depthwise Separable Convolution)? 2. 空洞卷积与普通卷积相比有哪些优势和应用场景? 3. 如何理解 TensorFlow 中 `tf.nn.conv2d_transpose` 的输出尺寸计算? 4. 深度卷积Depthwise Convolution)的计算过程是怎样的? 5.TensorFlow 中,如何通过 `tf.nn.conv2d` 实现普通卷积的输出尺寸计算?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值