Tensorflow 如何在Keras中实现具有多个输出的自定义层

Tensorflow 如何在Keras中实现具有多个输出的自定义层,tensorflow,keras,deep-learning,Tensorflow,Keras,Deep Learning,我试图实现在Keras中具有多个输出的自定义层 自定义图层如下所示: class DFConv2D(Layer): def __init__(self, **kwargs): super(DFConv2D, self).__init__(**kwargs) def build(self, input_shape): self._conv2d = Conv2D(input_shape[3], (3, 3), padding='same') super(DFConv

我试图实现在Keras中具有多个输出的自定义层

自定义图层如下所示:

class DFConv2D(Layer):
  def __init__(self, **kwargs):
    super(DFConv2D, self).__init__(**kwargs)

  def build(self, input_shape):
    self._conv2d = Conv2D(input_shape[3], (3, 3), padding='same')
    super(DFConv2D, self).build(input_shape)

  def call(self, x):
    x_shape = x.get_shape()
    offsets = self._conv2d(x)
    ###################
    x = tf.reshape(offsets, (-1, int(x_shape[3]), int(x_shape[1]), int(x_shape[2])))
    x = tf.transpose(x, [0, 2, 3, 1])
    ###################
    x = tf.transpose(x, [0, 3, 1, 2])
    x = tf.reshape(x, (-1, int(x_shape[1]), int(x_shape[2])))
    ###################
    x, coords = tf_batch_map_offsets(x, offsets)
    ####################
    x = tf.reshape(x, (-1, int(x_shape[3]), int(x_shape[1]), int(x_shape[2])))
    x_offset = tf.transpose(x, [0, 2, 3, 1])
    ####################
    return [x_offset, coords]

    def compute_output_shape(self, input_shape):
        return [input_shape, (None, input_shape[1]*input_shape[2], 2)]
模型如下:

inputs = l = Input((28, 28, 1), name='input')
trainable = True
# conv11
l = Conv2D(32, (3, 3), padding='same', name='conv11', trainable=trainable)(l)
l = Activation('relu', name='conv11_relu')(l)
l = BatchNormalization(name='conv11_bn')(l)

# conv12
l = DFConv2D(name='conv12_offset')(l)
l_offset_1 = l[0]
l_coords_1 = l[1]
l = Conv2D(64, (3, 3), padding='same', strides=(2, 2), name='conv12', trainable=trainable)(l_offset_1)
l = Activation('relu', name='conv12_relu')(l)
l = BatchNormalization(name='conv12_bn')(l)
运行此代码会出现以下错误:

output_tensors[i]._keras_shape = output_shapes[i]
IndexError: list index out of range

如何解决此问题?

也许您必须在
build
方法中调用
self.\u conv2d.build(input\u shape)
。您是否注意到您的
def compute\u output\u shape
(至少在问题中)是“内部”
def call
?感谢您的支持!我已经解决了这个问题。