【问题标题】:Keras - passing different parameter for different data point onto Lambda LayerKeras - 将不同数据点的不同参数传递到 Lambda 层
【发布时间】:2019-01-04 13:04:21
【问题描述】:

我正在研究 Keras/TF 背景下的 CNN 模型。在最终卷积层结束时,我需要汇集过滤器的输出图。我没有使用GlobalAveragePooling 或任何其他类型的池化,而是必须根据输出映射宽度上存在的时间范围进行池化。

因此,如果一个过滤器的样本输出是n x mn 是时间框架,m 是沿特征输出的。在这里,我只需要汇集来自帧n1 to n2 的输出,其中n1n2 (n2-n1)*m,我将在上面应用池化。我遇到了 keras 的Lambda Layer 来执行此操作。但我被困在n1n2 的每个点都会有所不同。所以我的问题是如何将每个数据点的自定义参数传递给Lambda Layer?还是我以错误的方式处理这个问题?

一个示例 sn-p:

# for slicing a tensor
def time_based_slicing(x, crop_at):
    dim = x.get_shape()
    len_ = crop_at[1] - crop_at[0]
    return tf.slice(x, [0, crop_at[0], 0, 0], [1, len_, dim[2], dim[3]])

# for output shape
def return_out_shape(input_shape):
    return tuple([input_shape[0], None, input_shape[2], input_shape[3]])

# lambda layer addition
model.add(Lambda(time_based_slicing, output_shape=return_out_shape, arguments={'crop_at': (2, 5)}))

上述参数crop_at在适合循环时需要为每个数据点自定义。对此的任何指示/线索都会有所帮助。

【问题讨论】:

  • 为什么每个数据点的时间范围不同?你事先知道时间表吗?您可以将时间范围索引存储在文本文件中,并将它们作为附加的 Input 传递给您的模型。
  • 每个点都是一堆帧。从 t1 到 t2,假设我们将其标记为特定类别。是的,我知道这些用于测试数据。我会检查你提到的附加输入部分。
  • @sdcbr 您提到的附加Input 是输入权。它有与之相关的权重吗?我正在搜索 Lambda 层,但不在其中,因为它们确实在反向传播中进行了调整。
  • 是的,没有权重的第二个输入层直接进入 Lambda 加法层
  • @sdcbr 你说的输入层是对的,我根据它完成了切片。如果你能写一个答案,我会接受。谢谢。

标签: python-3.x tensorflow keras conv-neural-network keras-layer


【解决方案1】:

鉴于您知道之前属于每个数据点的时间范围的索引,您可以将它们存储在一个文本文件中,并将它们作为附加的 Input 传递给您的模型:

slice_input = Input((2,))

并在您的 time_based_slicing 函数中使用它们。

【讨论】:

    【解决方案2】:

    从 Sequential API 切换 - 当您需要使用多个输入时,它开始崩溃:使用 Functional API https://keras.io/models/model/

    假设您的 lambda 函数是正确的:

    def time_based_slicing(inputs_list):
        x, crop_at = inputs_list
        ... (will probably need to do some work to subset crop_at since it will be a tensor now instead of constants
    
    inp = Input(your_shape)
    inp_additional = Inp((2,)
    x=YOUR_CNN_LOGIC(inp)
    out = Lambda(time_based_slicing)([x,inp_additional])
    

    【讨论】:

    • 是的,我确实从顺序 api 切换到功能 api 看着乱七八糟的。我认为我需要的只是输入层,因为我不需要将它与权重相乘。如果我成功完成它会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多