0

次のような 3 チャネルの 5 x 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
4

1 に答える 1

1

これが畳み込みの定義です。単一の 1 を除いてゼロのみで構成される画像を畳み込む場合、畳み込みによってその位置にフィルターのコピーが配置されるという利点があります。

Theano は、数学的に定義されているように、まさにこれらの畳み込みを行います。これはfilter[:, :, ::-1, ::-1]、画像パッチでドット積を取得する前にフィルターを反転することを意味します (操作は です)。少なくとも一般的には、これらは 180 度の回転ではないことに注意してください。

あなたが探しているのは相互相関であると思われます。これは、画像の各ポイントで反転されていないバージョンのフィルターでドット積を取っていることです。

対応するものとまったく同じことを行うことが示されているこの回答も参照してください。theano.tensor.nnet.conv2dscipy

于 2016-01-13T09:10:30.353 に答える