【问题标题】:Does convolution in Theano rotate the filters?Theano 中的卷积会旋转过滤器吗?
【发布时间】:2016-01-13 07:25:05
【问题描述】:

我有一个这样的 3 通道 5×5 图像:

1 1 1 1 1    2 2 2 2 2    3 3 3 3 3
1 1 1 1 1    2 2 2 2 2    3 3 3 3 3
1 1 1 1 1    2 2 2 2 2    3 3 3 3 3
1 1 1 1 1    2 2 2 2 2    3 3 3 3 3
1 1 1 1 1    2 2 2 2 2    3 3 3 3 3

还有一个像这样的 3 通道 3×3 过滤器:

10 20 30   0.1 0.2 0.3   1 2 3
40 50 60   0.4 0.5 0.6   4 5 6
70 80 90   0.7 0.8 0.9   7 8 9

当用过滤器对图像进行卷积时,我期待这个输出:

369.6  514.8  316.8
435.6  594.   356.4
211.2  277.2  158.4

但是,Theano(使用 keras)给了我这个输出:

158.4   277.2  211.2
356.4   594.   435.6 
316.8   514.8  369.6

输出似乎旋转了 180 度,我想知道为什么会发生这种情况,我怎样才能得到正确的答案。这是我的测试代码:

def SimpleNet(weight_array,biases_array):
    model = Sequential()
    model.add(ZeroPadding2D(padding=(1,1),input_shape=(3,5,5)))
    model.add(Convolution2D(1, 3, 3, weights=[weight_array,biases_array],border_mode='valid',subsample=(2,2)))

    return model
im = np.asarray([
        1,1,1,1,1,
        1,1,1,1,1,
        1,1,1,1,1,
        1,1,1,1,1,
        1,1,1,1,1,
        2,2,2,2,2,
        2,2,2,2,2,
        2,2,2,2,2,
        2,2,2,2,2,
        2,2,2,2,2,
        3,3,3,3,3,
        3,3,3,3,3,
        3,3,3,3,3,
        3,3,3,3,3,
        3,3,3,3,3])

weight_array = np.asarray([
                10,20,30,
                40,50,60,
                70,80,90,
                0.1,0.2,0.3,
                0.4,0.5,0.6,
                0.7,0.8,0.9,
                1,2,3,
                4,5,6,
                7,8,9])

im = np.reshape(im,[1,3,5,5])
weight_array = np.reshape(weight_array,[1,3,3,3])
biases_array = np.zeros(1)

model = SimpleNet(weight_array,biases_array)

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy')
out = model.predict(im)
print out.shape
print out

【问题讨论】:

    标签: theano keras


    【解决方案1】:

    这是卷积的定义。它的优点是,如果您对仅由零组成的图像进行卷积,除了某个地方的单个 1,卷积将在该位置放置一个过滤器的副本。

    Theano 完全按照数学定义进行这些卷积。这意味着在使用图像补丁获取点积之前翻转过滤器(操作为filter[:, :, ::-1, ::-1])。请注意,这些不是 180 度的旋转,至少一般情况下是这样。

    您正在寻找的似乎是互相关,它在图像的每个点上使用非翻转版本的过滤器进行点积。

    另请参阅this answer,其中显示theano.tensor.nnet.conv2dscipy 对应物完全相同。

    【讨论】:

    • 谢谢。您对互相关是正确的,这正是我正在寻找的。我通过首先反转权重解决了这个问题。例如,通道中的一个权重被反转为 [90,80,70,60,50,40,30,20,10],这样就可以得到互相关。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多