如何改变中间层的张量形状?

How to change the tensor shape in middle layers?

说我有一个 2000x100 矩阵,我将它放入 10 维嵌入层,这给了我 2000x100x10 张量。所以它有 2000 个示例,每个示例都有一个 100x10 矩阵。然后,我将它传递给 conv1d 和 KMaxpolling 以获得 2000x24 矩阵,这是 2000 个示例,每个示例都有一个 24 维向量。现在,我想在应用另一层之前重新组合这些示例。我想将前 10 个示例组合在一起,等等,所以我得到一个元组。然后我将该元组传递给下一层。 我的问题是,我可以用 Keras 做到这一点吗?以及如何做的任何想法?

使用"samples"的想法是这些样本应该是唯一的并且彼此不相关。

这是 Keras 对您的模型的要求:如果它以 2000 个样本开始,则必须以 2000 个样本结束。理想情况下,这些样本不会相互交谈,但您可以使用自定义层来解决这个问题,但只能在中间进行。无论如何,您都需要以 2000 个样本结束。

我相信你将以 200 个组结束你的模型,所以也许你应该已经开始使用形状 (200,10,100) 并使用 TimeDistributed 包装器:

inputs = Input((10,100))                       #shape (200,10,100)
out = TimeDistributed(Embedding(....))(inputs) #shape (200,10,100,10)
out = TimeDistributed(Conv1D(...))(out)        #shape (200,10,len,filters)

#here, you use your layer that will work on the groups without TimeDistributed.

要在不改变批量大小的情况下重塑张量,请使用 Reshape(newShape) 层,其中 newShape 不包括第一个维度(批量大小)。

要重塑包含批量大小的张量,请使用 Lambda(lambda x: K.reshape(x,newShape)) 层,其中 newShape 包含第一个维度(批量大小) - 在这里你必须记住上面的警告:某处你需要撤消此更改,以便最终获得与输入相同的批次大小。