深度学习笔记:卷积层与反卷积层解析

需积分: 0 1 下载量 181 浏览量 更新于2024-08-05 收藏 1.02MB PDF 举报
"深度学习笔记1" 深度学习是现代人工智能领域中的关键组成部分,它主要通过模拟人脑神经网络的方式来处理和学习数据。在深度学习中,卷积层是构成卷积神经网络(Convolutional Neural Networks, CNNs)的核心组件,用于特征提取。本笔记将深入探讨卷积层的输出计算及其在实际应用中的处理方式。 卷积层的输出大小取决于输入尺寸、卷积核(滤波器)尺寸、步长(strides)以及填充(padding)设置。假设输入尺寸为WxHxC,卷积核尺寸为FxF,步长为SxS,填充为PxP,那么卷积层的输出尺寸(W2xH2xO)可以通过以下公式计算: \[ W2 = \frac{W - F + 2P}{S} + 1 \] \[ H2 = \frac{H - F + 2P}{S} + 1 \] 其中,O表示输出通道数,通常与卷积核的数量相同。当W2或H2不为整数时,意味着卷积核无法整齐对齐地覆盖整个输入,这种情况称为"not an integer"。这时,深度学习库如TensorFlow可能会抛出异常,或者采取零填充(zero padding)使输入适应,或者裁剪输入以使其适合卷积操作。 在TensorFlow中,`tf.nn.conv2d`和`tf.layers.conv2d`都是进行卷积操作的函数。`padding`参数决定了如何处理边缘情况,其可取值为"VALID"(无填充)或"SAME"(保持输入尺寸)。若设为"SAME",库会自动添加合适的填充以保持输出尺寸与输入尺寸相同。 以解决Flappybird游戏的DQN网络为例,其中可能使用了卷积和池化操作,且通常会使用"SAME"填充来保持每一层的尺寸。例如,输入为80x80x4的张量,使用8x8的卷积核和4的步长,激活函数为ReLU,代码实现如下: 使用`tf.nn.conv2d`: ```python input = tf.placeholder(tf.float32, shape=[None, 80, 80, 4]) kernel = tf.truncated_normal([8, 8, 4, 32], stddev=0.01) h1 = tf.nn.conv2d(input, kernel, strides=[1, 4, 4, 1], padding="SAME") h_conv1 = tf.nn.relu(h1) ``` 使用`tf.layers.conv2d`(等价形式): ```python h_conv1 = tf.layers.conv2d(input, 32, (8, 8), strides=(4, 4), padding="SAME", activation=tf.nn.relu) ``` 反卷积(也称为转置卷积)是卷积层的逆操作,用于上采样和特征映射的恢复。反卷积的输出尺寸同样可以由卷积层的输入输出关系推导得出。在处理非整数情况时,反卷积同样会受到padding设置的影响,需要根据之前卷积层的padding策略来确定反卷积层的输入尺寸。 总结来说,理解和掌握卷积层的输出计算、padding的运用以及如何在TensorFlow中实现这些操作是深度学习实践中的重要步骤。正确配置这些参数对于构建有效且高效的卷积神经网络至关重要。