【问题标题】:Why is input_length needed in layers.Embedding in keras tensorflow?为什么layers中需要input_length。在keras tensorflow中嵌入?
【发布时间】:2020-09-03 00:36:55
【问题描述】:

layers.embedding 有一个参数 (input_length),documentation 描述为:

input_length :输入序列的长度,当它是常数时。如果您要在上游连接 Flatten 然后 Dense 层,则此参数是必需的(没有它,密集输出的形状无法计算)。

为什么无法计算密集输出的形状。对我来说,Flatten 似乎很容易做到。它只是一个tf.rehshape(input,(-1,1)),后跟一个密集层,无论我们选择什么输出形状。

你能帮我指出我对整个逻辑理解的失误吗?

【问题讨论】:

    标签: tensorflow keras reshape tensorflow2.0 tf.keras


    【解决方案1】:

    通过指定维度,您可以确保模型接收固定长度的输入。

    从技术上讲,您可以将None 放在您想要的任何输入维度上。形状将在运行时推断。

    您只需要确保指定层参数(input_dim、output_dim)、kernel_size(用于 conv 层)、units(用于 FC 层)。

    如果您使用Input 并指定将通过网络传递的张量形状,则可以计算形状。

    例如以下模型是完全有效的:

    from tensorflow.keras import layers
    from tensorflow.keras import models
    
    ip = layers.Input((10))
    emb = layers.Embedding(10, 2)(ip)
    flat = layers.Flatten()(emb)
    out = layers.Dense(5)(flat)
    
    model = models.Model(ip, out)
    
    model.summary()
    
    Model: "model"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_2 (InputLayer)         [(None, 10)]              0         
    _________________________________________________________________
    embedding (Embedding)        (None, 10, 2)             20        
    _________________________________________________________________
    flatten (Flatten)            (None, 20)                0         
    _________________________________________________________________
    dense (Dense)                (None, 5)                 105       
    =================================================================
    Total params: 125
    Trainable params: 125
    Non-trainable params: 0
    

    这里,我没有指定 input_length,但它是从Input 层推断出来的。

    问题在于 Sequential API,如果您没有在输入层和嵌入层中指定输入形状,则无法使用正确的参数集构建模型。

    例如,

    from tensorflow.keras import layers
    from tensorflow.keras import models
    
    model = models.Sequential()
    model.add(layers.Embedding(10, 2, input_length = 10)) # will be an error if I don't specify input_length here as there is no way to know the shape of the next layers without knowing the length
    
    model.add(layers.Flatten())
    model.add(layers.Dense(5))
    
    
    model.summary()
    

    本例中必须指定input_length,否则模型会报错。

    【讨论】:

    • 感谢热心朋友的帮助!我是否理解正确:“input_length:输入序列的长度,当它是常数时。如果您要在上游连接 Flatten 然后 Dense 层,则需要此参数(没有它,密集输出的形状无法计算)。”意味着如果我要附加flatten 然后密集到embeddings 层的输出,那么我必须指定input_length 参数。我想最好是你给我一个例子,有必要提供input_length参数。
    • input_length 相当于Input(shape = (10)),我展示了一个功能性 API 模型,由于我之前在输入层中指出了形状,我不必再次在嵌入中指定长度,我添加了一个顺序示例,如果我不指定 input_lenth,模型将抛出错误,因为无法为模型选择权重形状。归根结底,NN 是一堆带有数字的矩阵,在构建模型之前,您需要知道每个矩阵的维数。
    • 这是有道理的。但是,我们不是懒惰地在build 方法中构建层吗?权重将根据第一个输入批次计算?
    • 每次实例化一个图层对象,要么直接获取形状(输入图层),要么从上一层推断,如果没有找到相关的形状信息,则抛出错误。 tensorflow.org/api_docs/python/tf/keras/layers/Layer这样想,Dense是全连接层,所以需要知道上一层有多少输入(因为在dense中,每个输入都连接到每个输出),否则无法初始化权重矩阵。
    • 哦,是的!我知道了。这类似于不指定前一个密集层的输出形状,然后期望下一层创建其权重。但是,我仍然有一个皱纹。即使在第一批通过网络之后,没有指定前一个密集层的输出形状的情况仍然模棱两可。但是这种情况可以通过在build 方法中创建权重来轻松处理。我认为无论如何编译模型时都不会初始化模型权重。当第一批通过时,您的第二个网络的所有权重都已确定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2018-11-26
    相关资源
    最近更新 更多