当过滤器大小为 1 时,TensorFlow 中更高效的一维卷积

More efficient 1d convolution in TensorFlow when filter size is 1

我想要一个过滤器大小为 1 的 "convolutional" 层。我可以使用(选项 1)

实现此目的
tflearn.layers.conv.conv_1d( input, n_output_channels, 1 )

或者我自己使用(选项 2)

tf.matmult( input, tf.tile( weights, [batch_size, 1, 1] ) )

其中输入的维度为 [batch,sequence,n_input_channels],权重为 [1,n_input_channels,n_output_channels]。

这两个选项的性能似乎大致相当,但我猜想两者都效率低下:选项 1 可能会因期望 "real" 卷积而产生开销,并且平铺操作似乎在选项中是不必要的2. 有没有更聪明的方法可以做到这一点?

如果您打算使用 GPU,最好的方法可能是坚持原生 cuDNN 操作,在这种情况下是卷积。

NVIDIA 没有提供有关其实现的太多细节,但令我感到惊讶的是,他们没有针对 NN 中使用的常见小尺寸的专用实现,包括具有 1x1 空间范围的内核。这很可能也适用于其他神经网络专用库,例如​​ CPU 上的英特尔 MKL-DNN。

只有在使用通用的、非 NN 卷积库或优化不佳的库时,您的问题才适用。我认为 tensorflow 或任何其他主要的 DL 库及其依赖项都不是这种情况。 (查看 Eigen 可能会很有趣。)