python - Keras 模型的输出张量必须是 Keras `Layer` 的输出(因此保存过去层元数据)

标签 python tensorflow keras deep-learning

我正在尝试在 Keras 中实现非池化掩码。我有一个 VGG 编码器,可以输出特定的特征图(例如 relu5_1)和反池化掩码列表。

def VGG19(input_tensor=None, input_shape=None, target_layer=1):
    """
    VGG19, up to the target layer (1 for relu1_1, 2 for relu2_1, etc.)
    """
    if input_tensor is None:
        inputs = Input(shape=input_shape)
    else:
        inputs = Input(tensor=input_tensor, shape=input_shape)

    layer, unpooling_masks = vgg_layers(inputs, target_layer)

    model = Model(inputs, [layer, unpooling_masks], name='vgg19')
    load_weights(model)
    return model, unpooling_masks


def vgg_layers(inputs, target_layer):
    unpooling_masks = []
    # Block 1
    x_b1 = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(inputs)    
    x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x_b1)
    before_pooling = x     
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)
    unpooling_masks.append(make_unpooling_mask(x, before_pooling))

    # Block 2
    x_b2 = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
    x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x_b2)
    before_pooling = x 
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)
    unpooling_masks.append(make_unpooling_mask(x, before_pooling))

    # Block 3
    x_b3 = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)

    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x_b3)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
    x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv4')(x)
    before_pooling = x 
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)
    unpooling_masks.append(make_unpooling_mask(x, before_pooling))

    # Block 4
    x_b4 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)

    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x_b4)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
    x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv4')(x)
    before_pooling = x 
    x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)
    unpooling_masks.append(make_unpooling_mask(x, before_pooling))

    # Block 5
    x_b5 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)

    if target_layer == 5:
        return x_b5, unpooling_masks
    elif target_layer == 4:
        return x_b4, unpooling_masks
    elif target_layer == 3:
        return x_b3, unpooling_masks
    elif target_layer == 2:
        return x_b2, unpooling_masks
    elif target_layer == 1:
        return x_b1, unpooling_masks

这是unpooling函数

def make_unpooling_mask(x, before_pooling):
    t = UpSampling2D()(x)

    mask = Lambda(lambda x: K.cast(K.greater(x[0],x[1]), dtype='float32'))([t, before_pooling])

    return mask 

我收到此错误

Exception has occurred: ValueError Output tensors to a Model must be the output of a Keras Layer (thus holding past layer metadata). Found: [<tf.Tensor 'lambda_1/Cast:0' shape=(?, 256, 256, 64) dtype=float32>, <tf.Tensor 'lambda_2/Cast:0' shape=(?, 128, 128, 128) dtype=float32>, <tf.Tensor 'lambda_3/Cast:0' shape=(?, 64, 64, 256) dtype=float32>, <tf.Tensor 'lambda_4/Cast:0' shape=(?, 32, 32, 512) dtype=float32>]

在编译模型的行 model = Model(inputs, [layer, unpooling_masks], name='vgg19') 时会发生这种情况

可以做什么?

最佳答案

调用模型 API 时,输出参数的值应该是张量(或张量列表),在本例中它是张量列表的列表,因此存在问题。只需在调用 Model 时解压 unpooling_masks 列表(*unpooling_masks)即可。

model = Model(inputs, [layer, *unpooling_masks], name='vgg19')

关于python - Keras 模型的输出张量必须是 Keras `Layer` 的输出(因此保存过去层元数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55133051/

相关文章:

tensorflow - 如何找到 Tensorflow 最大值索引,但该值是重复的

Tensorflow 对象检测 API 教程错误

python - tf.data.Dataset.from_tensor_slices,张量和急切模式

tensorflow - Tensorflow 和 Theano 中图像数据集表示之间的差异

python - 如何连接列表元素

python 如何在Windows系统中构建scrapy.exe、pip.exe、virtualenv.exe等exe文件?

python - 如何在 Python 包中正确导入子模块?

python - 全类异常(exception)

python - 使用深度学习从序列中预测子序列

python - Keras 序列模型输入形状