我想要一个“卷积”图层,其中滤镜大小为1.我可以使用(选项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可能会产生预期“真实”卷积的开销,并且tile操作似乎在选项2中应该是不必要的。是否存在我能做到这一点更聪明吗?
答案 0 :(得分:1)
如果您计划使用GPU,最好的方法可能是坚持使用原生的cuDNN操作,在这种情况下是卷积。
NVIDIA没有提供有关其实现的详细信息,但我很惊讶他们没有针对NN中常用的小尺寸的专用实现,包括具有1x1
空间范围的内核。这很可能适用于其他NN专用库,例如CPU上的Intel MKL-DNN。
只有在使用通用的,非NN卷积库或经过严格优化的卷积库时,您的问题才适用。我认为这不是tensorflow或任何其他主要的DL库及其依赖的情况。 (检查Eigen可能会很有趣。)