【问题标题】:building keras Model ValueError构建 keras 模型 ValueError
【发布时间】:2019-11-24 09:53:41
【问题描述】:

这是一个基于一些简单块设计 Keras deep Model() 的 sn-p 代码:

def conv_bn_activation(x, filters, kernel_size, strides, data_format, is_training, activation=relu,
                       name=None):
    """

    Parameters
    ----------
    x
    filters
    kernel_size
    strides
    data_format
    activation
    is_training
    name

    Returns
    -------

    """
    conv = tks.Conv2D(filters=filters,
                      kernel_size=kernel_size,
                      strides=strides,
                      padding='same',
                      data_format=data_format,
                      activation=None,
                      use_bias=False,
                      name=name)(x)
    bn = batch_norm(x=conv, is_training=is_training, data_format=data_format)
    if activation is not None:
        return activation(bn)
    else:
        return bn

def basic_block(x, filters, is_training, data_format):
    """
    Basic block function
    Parameters
    ----------
    x
    filters
    data_format
    is_training
    Returns
    -------

    """
    conv = conv_bn_activation(x=x, filters=filters, kernel_size=3, strides=1,
                              is_training=is_training, data_format=data_format)
    conv = conv_bn_activation(x=conv, filters=filters, kernel_size=3, strides=1,
                              is_training=is_training, data_format=data_format)
    axis = 3 if data_format == 'channels_last' else 1

    input_channels = x.get_shape().as_list()[axis]

    if input_channels == filters:
        short_cut = x
    else:
        short_cut = conv_bn_activation(x=x, filters=filters, kernel_size=1, strides=1,
                                       is_training=is_training, data_format=data_format)
    return conv + short_cut


img_input_shape = [None, None, 3]
inputs = []
img_input = Input(shape=img_input_shape)
inputs.append(img_input)

conv = conv_bn_activation(x=img_input, filters=16,
                          kernel_size=7, strides=1,
                          data_format="channels_last",
                          is_training=True,
                          name="base_layer_conv_1")

conv = conv_bn_activation(x=conv, filters=16, kernel_size=3, strides=1,
                          data_format="channels_last",
                          is_training=True, name="base_layer_conv_2")
out = basic_block(conv, 64, True, data_format="channels_last")

# outputs = [conv] this work fine

outputs = [out]

model = Model(inputs=inputs, outputs=outputs)

我收到此错误 ValueError: Output tensors to a Model must be the output of a TensorFlow Layer (因此保存过去的层元数据)。找到:Tensor("add:0", shape=(?, ?, ?, 64), dtype=float32)

问题出在 basic_block() 函数中,但我找不到!

【问题讨论】:

  • 我解决的问题是在添加conv + short_cut
  • 请编辑您的问题并修正缩进。这样读起来很难。

标签: python tensorflow keras tf.keras


【解决方案1】:

问题出在加法conv + short_cut

def conv_bn_activation(x, filters, kernel_size, strides, data_format, is_training, activation=relu,
                       name=None):
    """

    Parameters
    ----------
    x
    filters
    kernel_size
    strides
    data_format
    activation
    is_training
    name

    Returns
    -------

    """
    conv = tks.Conv2D(filters=filters,
                      kernel_size=kernel_size,
                      strides=strides,
                      padding='same',
                      data_format=data_format,
                      activation=None,
                      use_bias=False,
                      name=name)(x)
    bn = batch_norm(x=conv, is_training=is_training, data_format=data_format)
    if activation is not None:
        return activation(bn)
    else:
        return bn

def basic_block(x, filters, is_training, data_format):
    """
    Basic block function
    Parameters
    ----------
    x
    filters
    data_format
    is_training
    Returns
    -------

    """
    conv = conv_bn_activation(x=x, filters=filters, kernel_size=3, strides=1,
                              is_training=is_training, data_format=data_format)
    conv = conv_bn_activation(x=conv, filters=filters, kernel_size=3, strides=1,
                              is_training=is_training, data_format=data_format)
    axis = 3 if data_format == 'channels_last' else 1

    input_channels = x.get_shape().as_list()[axis]

    if input_channels == filters:
        short_cut = x
    else:
        short_cut = conv_bn_activation(x=x, filters=filters, kernel_size=1, strides=1,
                                       is_training=is_training, data_format=data_format)
    return tks.Add()([conv,  short_cut])


img_input_shape = [None, None, 3]
inputs = []
img_input = Input(shape=img_input_shape)
inputs.append(img_input)

conv = conv_bn_activation(x=img_input, filters=16,
                          kernel_size=7, strides=1,
                          data_format="channels_last",
                          is_training=True,
                          name="base_layer_conv_1")

conv = conv_bn_activation(x=conv, filters=16, kernel_size=3, strides=1,
                          data_format="channels_last",
                          is_training=True, name="base_layer_conv_2")
out = basic_block(conv, 64, True, data_format="channels_last")

# outputs = [conv] this work fine

outputs = [out]

model = Model(inputs=inputs, outputs=outputs)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多