我正在尝试在Keras(具有tensorflow后端)中创建一个Conv2D
层,我注意到它的输出按升序排序。
例如,考虑一个简单的输入,例如:
_input = np.arange(2 * 2).reshape(2, 2)
结果为:
[[0 1]
[2 3]]
如果我们将_input
变量传递给像这样的卷积层:
from keras.layers import Input, Conv2D
from keras.activations import relu
from keras import Model
import numpy as np
filters = 2
filter_size = 1
_weights = [np.reshape([[2 for _ in range(filters)] for _ in range(filter_size*filter_size)], (filter_size, filter_size, 1, filters)), np.reshape([0 for _ in range(filters)], (filters,))] # weights for Keras, main weight is array of 2`s while bias weight is array of 0's
keras_input = Input(shape=(2, 2, 1), dtype='float32')
keras_conv = Conv2D(filters=filters, kernel_size=filter_size, strides=(1, 1), activation=relu, padding='valid')(keras_input)
model = Model(inputs=[keras_input], outputs=keras_conv)
model.layers[1].set_weights([_weights[0], _weights[1]])
print(model.predict([_input.reshape(1, 2, 2, 1)]))
我们将获得有序的输出:
[[[[0. 0.]
[2. 2.]]
[[4. 4.]
[6. 6.]]]]
看起来tensorflow做了这样的事情:
我想取消第三步步骤,以便获得如下信息:
[[[[0. 2.]
[4. 6.]]
[[0. 2.]
[4. 6.]]]]
例如,Caffe将跳过订购部分,其输出将与上面的输出完全相同。
这是Caffe进行“卷积”的方式:
[[[[(0*2) + 0 (1*2) + 0]
[(2*2) + 0 (3*2) + 0]]
[[(0*2) + 0 (1*2) + 0]
[(2*2) + 0 (3*2) + 0]]]]
等于:
[[[[0. 2.]
[4. 6.]]
[[0. 2.]
[4. 6.]]]]
完成此操作,如您所见,不会改变我们的输入顺序。
如何阻止Tensorflow(或Keras)命令激活卷积层?我可以传递任何参数来消除这种升序吗?
非常感谢您!