将 keras.backend.conv2d 从 Keras 1.x 迁移到 2.x
Migrating keras.backend.conv2d from Keras 1.x to 2.x
我正在将一个项目从 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 后端,并在 K.set_image_data_format
和 conv2d
中设置 channels_first
。
conv2D
方法中,a
为实际图像,b
为内核
a
的预期形状是("channels_first"):
(batchSize, channels, side1, side2)
因此,您的输入有:
- 1024 张图片
- 4 个通道
- 图像 1 x 1
但是尽管使用 '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
。
我正在将一个项目从 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 后端,并在 K.set_image_data_format
和 conv2d
中设置 channels_first
。
conv2D
方法中,a
为实际图像,b
为内核
a
的预期形状是("channels_first"):
(batchSize, channels, side1, side2)
因此,您的输入有:
- 1024 张图片
- 4 个通道
- 图像 1 x 1
但是尽管使用 '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
。