将张量的各个通道传递给 Keras 中的层

Posted

技术标签:

【中文标题】将张量的各个通道传递给 Keras 中的层【英文标题】:Passing Individual Channels of Tensors to Layers in Keras 【发布时间】:2016-08-23 20:36:40 【问题描述】:

我正在尝试为 theano 后端模拟与 SeparableConvolution2D 层等效的东西(它已经存在于 TensorFlow 后端)。作为第一步,我需要做的是将一个通道从张量传递到下一层。假设我有一个名为 conv1 的 2D 卷积层,它有 16 个过滤器,它产生的输出形状为: (batch_size, 16, height, width) 我需要选择形状为 (: , 0, : , : ) 的子张量并将其传递给下一层。够简单吧?

这是我的代码:

from keras import backend as K

image_input = Input(batch_shape = (batch_size, 1, height, width ), name = 'image_input' )

conv1 = Convolution2D(16, 3, 3, name='conv1', activation = 'relu')(image_input)

conv2_input = K.reshape(conv1[:,0,:,:] , (batch_size, 1, height, width))

conv2 = Convolution2D(16, 3, 3, name='conv1', activation = 'relu')(conv2_input)

这会抛出:

Exception: You tried to call layer "conv1". This layer has no information about its expected input shape, and thus cannot be built. You can build it manually via: layer.build(batch_input_shape)

为什么图层没有所需的形状信息?我正在使用 theano 后端的 reshape 。这是将单个通道传递到下一层的正确方法吗?

【问题讨论】:

【参考方案1】:

我在 keras-user 组上问了这个问题,我在那里得到了答案:

https://groups.google.com/forum/#!topic/keras-users/bbQ5CbVXT1E

引用它:

您需要使用 lambda 层,例如: Lambda(x: x[:, 0:1, :, :], output_shape=lambda x: (x[0], 1, x[2], x[ 3]))

请注意,这种手动实现可分离卷积的效率会非常低。正确的解决方案是使用 TensorFlow 后端。

【讨论】:

您应该引用该链接的相关部分,以便此答案是独立的。

以上是关于将张量的各个通道传递给 Keras 中的层的主要内容,如果未能解决你的问题,请参考以下文章

Keras官方中文文档:融合层Merge

理解keras中的数据表示形式:张量

在 Keras 中,如何任意调整一维张量的大小?

如何将稀疏张量传递给 TF 2.0 中的密集层?

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

从keras中的扩展张量制作输入特征图