python中的一维卷积conv1d和二维卷积conv2d

先来看二维卷积conv2d

conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC", dilations=[1, 1, 1, 1], name=None)

"""Computes a 2-D convolution given 4-D `input` and `filter` tensors."""

给定4维的输入张量和滤波器张量来进行2维的卷积计算。

input:4维张量,形状:[batch, in_height, in_width, in_channels]

filter:滤波器(卷积核),4维张量,形状:[filter_height, filter_width, in_channels, out_channels]

strides:滤波器滑动窗口在input的每一维度上,每次要滑动的步长,是一个长度为4的一维张量。

padding:边界填充算法参数,有两个值:‘SAME’、‘VALID’。具体差别体现在卷积池化后,特征图的大小变化上面。卷积池化后特征矩阵的大小计算参见https://blog.csdn.net/qq_26552071/article/details/81171161

return:该函数返回一个张量,其类型与input输入张量相同。

再看一维卷积conv1d,python中的一维卷积最终还是通过二维卷积实现的,先将输入张量和滤波器的维度扩展,再调用二维卷积conv2d来实现。

def conv1d(value,filters, stride, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

"""Computes a 1-D convolution given 3-D input and filter tensors."""

给定三维的输入张量和滤波器来进行1维卷积计算。

input:3维张量,形状shape和data_format有关:

    (1)data_format = "NWC", shape = [batch, in_width, in_channels]

    (2)data_format = "NCW", shape = [batch, in_channels, in_width]

filters:3维张量,shape = [filter_width, in_channels, out_channels],

stride:滤波器窗口移动的步长,为一个整数。

padding:与上文一致。

由conv1d源码可以看出,一维卷积的实现,是先对输入张量和filter扩展了一维,然后调用二维卷积进行运算的:

    value = array_ops.expand_dims(value, spatial_start_dim)  # 输入张量
    filters = array_ops.expand_dims(filters, 0)  # 滤波器
    result = gen_nn_ops.conv2d(
        value,
        filters,
        strides,
        padding,
        use_cudnn_on_gpu=use_cudnn_on_gpu,
        data_format=data_format)
    return array_ops.squeeze(result, [spatial_start_dim])

下面为conv1d完整源码:

def conv1d(value,
           filters,
           stride,
           padding,
           use_cudnn_on_gpu=None,
           data_format=None,
           name=None): 
  with ops.name_scope(name, "conv1d", [value, filters]) as name:
    # Reshape the input tensor to [batch, 1, in_width, in_channels]
    if data_format is None or data_format == "NHWC" or data_format == "NWC":
      data_format = "NHWC"
      spatial_start_dim = 1
      strides = [1, 1, stride, 1]
    elif data_format == "NCHW" or data_format == "NCW":
      data_format = "NCHW"
      spatial_start_dim = 2
      strides = [1, 1, 1, stride]
    else:
      raise ValueError("data_format must be \"NWC\" or \"NCW\".")
    value = array_ops.expand_dims(value, spatial_start_dim)
    filters = array_ops.expand_dims(filters, 0)
    result = gen_nn_ops.conv2d(
        value,
        filters,
        strides,
        padding,
        use_cudnn_on_gpu=use_cudnn_on_gpu,
        data_format=data_format)
    return array_ops.squeeze(result, [spatial_start_dim])

猜你喜欢

转载自blog.csdn.net/qq_26552071/article/details/81178932