【发布时间】:2019-01-04 13:04:21
【问题描述】:
我正在研究 Keras/TF 背景下的 CNN 模型。在最终卷积层结束时,我需要汇集过滤器的输出图。我没有使用GlobalAveragePooling 或任何其他类型的池化,而是必须根据输出映射宽度上存在的时间范围进行池化。
因此,如果一个过滤器的样本输出是n x m,n 是时间框架,m 是沿特征输出的。在这里,我只需要汇集来自帧n1 to n2 的输出,其中n1 和n2 (n2-n1)*m,我将在上面应用池化。我遇到了 keras 的Lambda Layer 来执行此操作。但我被困在n1 和n2 的每个点都会有所不同。所以我的问题是如何将每个数据点的自定义参数传递给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