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

时间:2018-12-07 04:31:54

标签: tensorflow keras nlp embedding word-embedding

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

1 个答案:

答案 0 :(得分:0)

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

这是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包括第一维(批处理大小)-在这里您必须记住上面的警告:您需要撤消某些操作此更改使您最终获得与输入相同的批次大小。