我将项目从Keras 1.x迁移到2.x。
在代码中,1.x中正常运行的keras.backend.conv2d
操作现在在2.x中崩溃。
convs = K.conv2d(a, b, padding='valid', data_format='channels_first')
输入张量形状a
和b
都是(1024, 4, 1, 1)
,输出张量形状在1.x中为(1024, 1024, 1, 1)
。
使用2.x我收到以下错误:
ValueError: CorrMM: impossible output shape
bottom shape: 1024 x 4 x 1 x 1
weights shape: 1 x 1 x 1024 x 4
top shape: 1024 x 1 x -1022 x -2
Apply node that caused the error: CorrMM{valid, (1, 1), (1, 1), 1 False}(Print{message='a', attrs=('__str__',), global_fn=<function DEBUG_printTensorShape at 0x00000272EF1FAD08>}.0, Subtensor{::, ::, ::int64, ::int64}.0)
Toposort index: 30
Inputs types: [TensorType(float32, (False, False, True, True)), TensorType(float32, (True, True, False, False))]
Inputs shapes: [(1024, 4, 1, 1), (1, 1, 1024, 4)]
我正在使用Theano后端,并在channels_first
和K.set_image_data_format
中设置conv2d
。
答案 0 :(得分:1)
在conv2D
方法中,a
是实际图片,b
是内核。
a
的预期形状是(&#34; channels_first&#34;):
(batchSize, channels, side1, side2)
所以,你的输入有:
但是虽然使用'channels_last'
,但b
的预期形状为:
(side1,side2, inputChannels,outputChannels)
这似乎有点误导,因为在过滤器中,它仍然是最后的通道。 (在我的keras上测试,版本2.0.4)
因此,如果您的输出为(1024,1024,1,1)
,我认为b
应该有1024个输出过滤器,因此它的形状应为:
(1,1,4,1024)
您应该使用某种方法来置换尺寸,而不仅仅是重塑。 Numpy有swapaxes
,keras有K.permute_dimensions
。