阅读(8.3k) 书签 (0)

TensorFlow函数教程:tf.nn.convolution

2019-01-31 13:45 更新

tf.nn.convolution函数

tf.nn.convolution(
    input,
    filter,
    padding,
    strides=None,
    dilation_rate=None,
    name=None,
    data_format=None
)

定义在:tensorflow/python/ops/nn_ops.py.

请参阅指南:神经网络>卷积运算

计算ND卷积的总和(实际上是互相关).

这也支持通过可选的strides参数进行输出跨步或者通过可选的dilation_rate参数(也称为带孔的卷积或扩张卷积).然而,目前不支持对异常卷积的输出跨步.

具体地说,在data_format不以“NC”开头的情况下,给出秩为(N + 2)的input张量,其形状如下:

[num_batches, input_spatial_shape[0], ..., input_spatial_shape[N-1], num_input_channels]

秩为(N + 2)的filter张量,其形状为:

[spatial_filter_shape[0], ..., spatial_filter_shape[N-1], num_input_channels, num_output_channels]

一个可选的dilation_rate张量,其形状为[N](默认为[1] N),指定滤波器上采样/输入下采样率,以及一个N strides的可选列表(默认[1] N),这计算每个N-D空间输出位置(x[0], ..., x[N-1]):

output[b, x[0], ..., x[N-1], k] =
    sum_{z[0], ..., z[N-1], q}
        filter[z[0], ..., z[N-1], q, k] *
        padded_input[b,
                     x[0]*strides[0] + dilation_rate[0]*z[0],
                     ...,
                     x[N-1]*strides[N-1] + dilation_rate[N-1]*z[N-1],
                     q]

其中b是批次的索引,k是输出通道编号,q是输入通道编号,z是过滤器内的N-D空间偏移.这里,padded_input通过使用一个形状为(spatial_filter_shape-1) * dilation_rate + 1的有效的空间过滤器,和输出跨步strides来对输入进行零填充获得的.

在这种情况下,data_format不以"NC"开头,在input与输出(但不是filter)被简单地调换,如下所示:

convolution(input, data_format, kwargs) = tf.transpose(convolution(tf.transpose(input, [0] + range(2,N+2) + [1]), kwargs), [0, N+1] + range(1, N+1))

这要求:1 <= N <= 3.

参数:

  • input:一个类型为T的ND Tensor,其中,如果data_format不以“NC”(默认值)开头,则形状为[batch_size] + input_spatial_shape + [in_channels];或者data_format以“NC”开头,则形状为[batch_size, in_channels] + input_spatial_shape.
  • filter:与input具有相同类型的N-D Tensor,它的形状为spatial_filter_shape + [in_channels, out_channels].
  • padding:一个字符串,可以是"VALID"或者"SAME";填充算法.
  • strides: 可选的.N int的顺序> = 1.指定输出步幅.默认为[1] * N. 如果步幅的任何值> 1,则dilation_rate的所有值必须为1.
  • dilation_rate: 可选,N ints> = 1的序列,指定滤波器上采样/输入下采样率.在文献中,相同的参数有时称为input stride或dilation;用于卷积的有效滤波器大小将是spatial_filter_shape + (spatial_filter_shape - 1) * (rate - 1),通过在每个空间维度 i 中在原始滤波器的连续元素之间插入(dilation_rate [i] -1)零来获得.如果dilation_rate的任何值> 1,则步幅的所有值必须为1.
  • name:返回张量的可选名称.
  • data_format:字符串或None,指定input和输出的通道维度是否是最后一个维度(默认,或者data_format不是以“NC”开头),还是第二个维度(如果data_format以“NC”开头)
    对于N = 1,有效值是“NWC”(默认)和“NCW”;
    对于N = 2,有效值是“NHWC”(默认)和“NCHW”;
    对于N = 3,有效值为“NDHWC”(默认)和“NCDHW”.

返回:

一个Tensor,与形状如下的input具有相同的类型:

`[batch_size] + output_spatial_shape + [out_channels]`

如果data_format为None或者不以“NC”开头,或者:

`[batch_size, out_channels] + output_spatial_shape`

如果data_format以“NC”开头,则output_spatial_shape取决于值padding,padding值如下:

如果padding ==“SAME”:output_spatial_shape [i] = ceil(input_spatial_shape [i] / strides [i])

如果padding ==“VALID”:output_spatial_shape [i] = ceil((input_spatial_shape [i] - (spatial_filter_shape [i] -1)* dilation_rate [i])/ strides [i]).

可能引发的异常:

  • ValueError:如果输入/输出深度与filter形状不匹配,填充不是"VALID"或者"SAME",或者data_format无效.