Как реализовать пользовательский слой с несколькими выходами в Keras - PullRequest
0 голосов
/ 10 января 2020

Я попытался реализовать пользовательский слой с несколькими выходами в Керасе.

Пользовательский слой находится ниже:

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

как мне решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...