【问题标题】:How to change the tensor shape in middle layers?如何改变中间层的张量形状?
【发布时间】:2018-12-07 04:31:53
【问题描述】:

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

【问题讨论】:

  • 是的,你可以同时使用 tensorflow 和 keras。你的结构不清楚。我的建议是从一些预先实现的小示例开始,然后针对您的场景提出具体问题。 github上有很多代码。只需谷歌它..

标签: tensorflow keras nlp embedding word-embedding


【解决方案1】:

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

这是 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 包括第一个维度(批量大小) - 在这里您必须记住上面的警告:您需要在某个地方撤消此更改,以便您最终得到与输入相同的批量大小。

【讨论】:

  • 是的,我从 2000 个样本开始。因为我想通过嵌入层,所以我将这些矩阵形成为向量。通过嵌入传递它,我再次转换为原始形状。
  • 我还有一个问题。如果每个样品的形状不同怎么办?说第一个例子有 (​​10,100),第二个例子有 (​​5,100)?
  • 您可以在输入形状中使用None 来获得不同的维度,但是您需要单独训练,因为您不能将所有样本放在同一个数组中。此外,您的图层和计算必须支持可变维度。
  • 实际上,我已经固定了一个维度。只有一个维度变化。你知道我可以使用哪个功能吗?
  • 我不知道你想做什么。
猜你喜欢
  • 2019-07-19
  • 2020-10-04
  • 2022-01-16
  • 1970-01-01
  • 2021-10-22
  • 2018-12-13
  • 1970-01-01
  • 2018-06-16
  • 2021-07-22
相关资源
最近更新 更多