Tensorflow 如何在Keras中实现具有多个输出的自定义层
我试图实现在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
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
?感谢您的支持!我已经解决了这个问题。