keras Conv2D参数详解

Conv2D layer 二维卷积层

本文是对keras的英文API DOC的一个尽可能保留原意的翻译和一些个人的见解,会补充一些对个人对卷积层的理解。这篇博客写作时本人正大二,可能理解不充分。

Conv2D class

tf.keras.layers.Conv2D(
    filters,
    kernel_size,
    strides=(1, 1),
    padding="valid",
    data_format=None,
    dilation_rate=(1, 1),
    groups=1,
    activation=None,
    use_bias=True,
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs
)

二维卷积层(例如空间卷积图像)。

这一层创建了一个卷积核,它与这一层的输入卷积以产生一个输出张量。
如果 use_bias为真,则创建一个偏差向量并添加到输出中。
最后,如果activation不是None,它也应用于输出。

当使用此层作为模型的第一层时,提供关键字参数input_shape(整数元组,不包括样本轴(不需要写batch_size)),例如。
input_shape=(128, 128, 3)表示 128x128的 RGB 图像data_format="channels_last"

这个data_format参数是这样影响input_shape工作的如果不填写,默认是channels_last,否则可以填写channels_first。前者的会把input_shape这个三元组给识别成(batch_size, height, width, channels),后者则会识别成(batch_size, channels, height, width)不过样本轴不需要自己填写(不然反而会报错)

Examples

>>> # The inputs are 28x28 RGB images with `channels_last` and the batch   
>>> # size is 4.  
>>> input_shape = (4, 28, 28, 3) 
>>> x = tf.random.normal(input_shape) 
>>> y = tf.keras.layers.Conv2D( ...
                               2,3,activation='relu',input_shape=input_shape[1:])(x) 
>>> print(y.shape) (4, 26, 26, 2) 
>>> # With `dilation_rate` as 2.   
>>> input_shape = (4, 28, 28, 3) 
>>> x = tf.random.normal(input_shape) 
>>> y = tf.keras.layers.Conv2D( ... 
                   2,3,activation='relu',dilation_rate=2,input_shape=input_shape[1:])(x) 
>>> print(y.shape) (4, 24, 24, 2) 
>>> # With `padding` as "same".   
>>> input_shape = (4, 28, 28, 3) 
>>> x = tf.random.normal(input_shape) 
>>> y = tf.keras.layers.Conv2D( ... 
2, 3, activation='relu', padding="same", input_shape=input_shape[1:])(x) 
>>> print(y.shape) (4, 28, 28, 2) 
>>> # With extended batch shape [4, 7]:   
>>> input_shape = (4, 7, 28, 28, 3) 
>>> x = tf.random.normal(input_shape) 
>>> y = tf.keras.layers.Conv2D( ... 
2, 3, activation='relu', input_shape=input_shape[2:])(x) 
>>> print(y.shape) (4, 7, 26, 26, 2) 

参数[以下方框内注释内容为个人理解,仅供参考]

  • filters: 整数,输出空间的维数(即在卷积中输出滤波器的数量)。[注:此处认为是与input_shape的通道数一样,比如是RGB就是3,是灰度图就是1]

  • kernel_size:一个整数或2个整数的元组/列表,指定二维卷积窗口的高度和宽度。
    可以是单个整数,为所有空间维度指定相同的值。

  • strides: 一个整数或两个整数的元组/列表,指定沿高度和宽度的卷积的步长。可以是单个整数,为所有空间维度指定相同的值。
    指定任何strides值!= 1与指定任何dilation_rate值!= 1是不兼容的。

  • padding: one of "valid" or "same" (不区分大小写).[注:卷积会导致输出图像越来越小,图像边界信息丢失,若想保持卷积后的图像大小不变,需要设置padding参数为same]

  • data_format: 一个字符串参数, 要么是 channels_last (默认) ,要么就是 channels_first. 是输入的维度顺序排列理解。 channels_last 对应着 (batch_size, height, width, channels) ,而 channels_first 对应的输入为 (batch_size, channels, height, width). 他默认为 在~/.keras/keras.json.中的image_data_format 的值 如果你不设置这个地方,它就会是channels_last.

  • dilation_rate: 一个整数或两个整数的元组/列表,指定用于扩展卷积的扩展率。可以是单个整数,为所有空间维度指定相同的值。该参数定义了卷积核处理数据时各值的间距。 在相同的计算条件下,该参数提供了更大的感受野。该参数经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑使用。

    ​ 下图为卷积核为3,扩展率为2的和没有padding的二维卷积

    img

  • groups: A positive integer specifying the number of groups in which the input is split along the channel axis. Each group is convolved separately with filters / groups filters. The output is the concatenation of all the groups results along the channel axis. Input channels and filters must both be divisible by groups.

  • activation: 使用激活函数。 如果不特别指定,将不会使用任何的激活函数 ( 具体的可选项可以参考keras.activations).

  • use_bias: Boolean类型, 这一层是否有bias单元.

  • kernel_initializer: 默认是GlorotUniform ,通过输入和输出单元个数来推演权重矩阵尺寸 ( 可选项在 keras.initializers).

  • bias_initializer: kernel bias单元的初始化器,默认是0 ( 可选项在 keras.initializers).

  • kernel_regularizer: Regularizer function applied to the kernel weights matrix (see keras.regularizers).

  • bias_regularizer: Regularizer function applied to the bias vector ( see keras.regularizers).

  • activity_regularizer: Regularizer function applied to the output of the layer (its “activation”) ( see keras.regularizers).

  • kernel_constraint: Constraint function applied to the kernel matrix ( see keras.constraints).

  • bias_constraint: Constraint function applied to the bias vector ( see keras.constraints).

Returns

一个四阶张量 activation(conv2d(inputs, kernel) + bias).

Raises

  • ValueError: if padding is "causal".
  • ValueError: 当 strides > 1 而且 dilation_rate > 1.

img

卷积层的卷积核大小为什么要大于1?

为了有感受野这一个东西存在。

为什么卷积核都是奇数的?

因为即使有padding=same的情况下,他不能保证输入的尺寸等于输出的尺寸

是不是越大的卷积核大小越好?

在达到相同感受野的情况下,卷积核越小,计算量越小,一般用的都是3X3


I n p u t = ( C i n ( 通 道 数 ) , H i n ( 高 ) , W i n ( 宽 ) ) Input=(Cin(通道数),Hin(高),Win(宽)) Input=(CinHinWin)

K e r n e l = ( K w ( 卷 积 核 的 宽 ) , K h ( 高 ) ) Kernel=(Kw(卷积核的宽),Kh(高)) Kernel=(Kw,Kh)

P a d d i n g = ( 0 ∣ 1 ) Padding=(0|1) Padding=(01)

$Strides= $ 这个定不了所以留空


H o u t ( 输 出 层 图 像 的 高 ) = H i n − K h + 2 P S + 1 Hout(输出层图像的高)=\displaystyle\frac{Hin-Kh+2P}{S}+1 Hout(=SHinKh+2P+1

输出层图像的宽可以类比。

C o u t ( 输 出 的 通 道 数 ) = 上 面 f l i t e r s 参 数 的 个 数 Cout(输出的通道数)=上面fliters参数的个数 Cout=fliters


W e i g h t s   P a r a m s = K w ∗ K h ∗ C i n ∗ C o u t Weights\ Params=Kw* Kh *Cin*Cout Weights Params=KwKhCinCout

B i a s   P a r a m s = C o u t Bias\ Params=Cout Bias Params=Cout


F e a t u r e   m a p : i n p u t = H i n ∗ W i n ∗ C i n Feature \ map:input=Hin*Win*Cin Feature map:input=HinWinCin

O u t p u t = H o u t ∗ W o u t ∗ C o u t Output=Hout*Wout*Cout Output=HoutWoutCout

<think>好的,我现在需要帮助用户理解PyTorch中的Conv1d参数含义及用法。首先,我应该回顾Conv1d的基本定义,确保自己理解正确。用户提到了PyTorch和TensorFlow,但问题更偏向PyTorch,因为引用资料中有PyTorch的文档和示例。不过可能需要简要对比,但用户主要关注参数详解,所以重点放在PyTorch上。 接下来,我应该逐个参数解析Conv1d的参数包括in_channels、out_channels、kernel_size、stride、padding等。每个参数的作用是什么?比如in_channels是输入数据的通道数,比如在文本处理中可能对应词向量的维度。out_channels则是卷积后输出的通道数,也就是滤波器的数量。kernel_size是卷积核的大小,这里是一维的,所以可能是一个整数,比如3,表示长度为3的窗口。 然后要考虑参数之间的相互关系,比如输入和输出的形状变化。用户可能想知道如何计算输出长度,这里需要引入公式。输出长度的计算涉及输入长度、kernel_size、padding、stride和dilation。公式应该是:输出长度 = (输入长度 + 2*padding - dilation*(kernel_size-1) -1 ) // stride + 1。这个公式是否正确?需要核对PyTorch的官方文档确认,确保准确。 另外,参数如dilation和groups可能比较复杂。dilation控制卷积核元素之间的间隔,比如dilation=2会让卷积核每隔一个元素采样一次,增加感受野。groups参数涉及分组卷积,比如将输入通道和输出通道分成多组,减少参数量,但需要确保in_channels和out_channels能被groups整除。 用户可能还需要示例代码来理解参数如何影响实际结果。例如,构造一个简单的输入张量,应用Conv1d并观察输出形状。比如输入形状为(batch_size, in_channels, length),经过Conv1d后变为(batch_size, out_channels, new_length)。需要展示具体的例子,比如输入长度5,kernel_size3,stride1,padding1,输出长度如何计算。 还要注意常见应用场景,比如文本分类或时间序列分析,Conv1d在这些场景下的使用方式。引用中的资料提到文本分类中使用一维卷积,可能涉及词嵌入后的卷积操作,这里可以举例说明。 用户可能混淆Conv1d和Conv2d的区别,需要指出Conv1d处理一维数据,如信号、文本,而Conv2d处理图像等二维数据。但不需要深入,除非用户提问。 需要检查是否有遗漏的参数,如bias、padding_mode。Bias决定是否添加偏置项,默认是True。padding_mode则决定了填充的方式,比如'zeros'表示用零填充,其他可能选项有'reflect'等。 最后,生成相关问题时要覆盖参数影响、输出计算、应用场景、不同框架对比等。确保问题有助于用户进一步学习,如参数调整对模型的影响,输出形状计算,与全连接层的区别,实际应用案例等。 总结步骤:解释每个参数,给出计算公式,提供代码示例,说明应用场景,列举相关问题。同时确保引用正确,如引用官方文档和用户提供的参考资料。</think>### Conv1d参数详解及使用指南 在PyTorch中,`torch.nn.Conv1d` 是用于一维卷积操作的核心类,广泛应用于时间序列分析、自然语言处理(NLP)和信号处理等领域[^3]。以下是对其参数及用法的详细说明: --- #### 一、核心参数解析 1. **`in_channels`** - 含义:输入数据的通道数。 - 示例: - 文本处理中,若词向量维度为300,则 `in_channels=300`。 - 时间序列中,若单变量序列(如温度),则 `in_channels=1`。 2. **`out_channels`** - 含义:输出通道数(即卷积核的数量)。 - 作用:控制特征的丰富程度,每个通道对应一个独立的卷积核。 3. **`kernel_size`** - 含义:卷积核的尺寸(长度)。 - 示例:`kernel_size=3` 表示每次卷积操作覆盖3个时间步或位置。 4. **`stride`** - 含义:卷积核滑动的步长,默认为1。 - 影响:步长越大,输出特征图的长度越小。 5. **`padding`** - 含义:在输入两端填充的零值数量,默认为0。 - 公式:输出长度与填充的关系见下文。 6. **`dilation`** - 含义:卷积核元素之间的间隔(膨胀率),默认为1。 - 示例:`dilation=2` 时,卷积核实际覆盖范围为 `kernel_size + (kernel_size-1)*(dilation-1)`。 7. **`groups`** - 含义:输入与输出通道的分组数,用于实现分组卷积,默认为1。 - 限制:需满足 `in_channels` 和 `out_channels` 均可被 `groups` 整除[^2]。 8. **`bias`** - 含义:是否添加偏置项,默认为 `True`。 --- #### 二、输出长度计算公式 输出特征图的长度由以下公式确定: $$ L_{\text{out}} = \left\lfloor \frac{L_{\text{in}} + 2 \times \text{padding} - \text{dilation} \times (\text{kernel\_size} - 1) - 1}{\text{stride}} + 1 \right\rfloor $$ 其中,$L_{\text{in}}$ 为输入长度,$\lfloor \cdot \rfloor$ 表示向下取整。 --- #### 三、代码示例 ```python import torch import torch.nn as nn # 定义Conv1d层 conv = nn.Conv1d( in_channels=2, # 输入通道数(如双变量时间序列) out_channels=5, # 输出通道数(5个滤波器) kernel_size=3, # 卷积核长度 stride=2, # 步长 padding=1 # 填充 ) # 输入数据:(batch_size=1, in_channels=2, length=10) input = torch.randn(1, 2, 10) output = conv(input) # 输出形状:(1, 5, 5) ``` --- #### 四、应用场景 1. **文本分类** - 对词嵌入后的文本(形状为 `[batch, embedding_dim, sequence_length]`)进行特征提取。 2. **时间序列预测** - 从单变量或多变量序列中捕捉局部模式。 3. **音频信号处理** - 分析声波或频谱特征。 --- #### 五、与TensorFlow的对比 TensorFlow中的 `tf.keras.layers.Conv1D` 参数与PyTorch类似,但输入形状格式为 `(batch, length, channels)`(通道在后),而PyTorch为 `(batch, channels, length)`(通道在前)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值