我有两种形式的4D张量:(1, num_channels, r, c)
。
我假设这里有1个迷你批次,而num_channels_a!= num_channels_b
我想将张量A的每个通道与张量B的每个通道卷积并收集结果: result =(num_channels_a,num_channel_b,result_r,result_c)
在普通的老蟒蛇中,这是直截了当的:
result = np.zeros((tensorA.shape[1], tensorB.shape[1], result_shape_r, result_shape_c))
for channelA in xrange(0, tensorA.shape[1]):
for channelB in xrange(0, tensorB.shape[1]):
result[channelA, channelB] = scipy.signal.convolve2d(tensorA[0][channelA], tensorB[0][channelB], mode='valid')
这显然是非常缓慢和低效的。它确实应该是并行化的主要候选者,因为每个通道组合的卷积独立于任何其他通道组合。
我尝试使用theano.tensor.nnet.conv2d实现基于Theano的功能。此theano函数假定其输入格式为:(batch size, input channels, input rows, input columns)
与(output channels, input channels, filter rows, filter columns)
显然,形状对应于“输入通道”,并且是神经网络中常见的卷积方法,将输入数据与一组与输入数据匹配相同通道深度的滤波器进行卷积。这并不是我想要实现的目标。
我尝试使用th.scan循环遍历B的通道,然后复制此通道[r,c] vals a_num_channels次以使用张量A进行卷积,但这不正确。
例如,我的张量可以是A(1,40,19,19)和B(1,100,10,10)。在这种情况下,我想得到(40,100,10,10)
的结果关于我如何能够完成我在Theano函数中描述的内容的任何想法?