为什么在keras tensorflow中嵌入层需要输入长度?

为什么在keras tensorflow中嵌入层需要输入长度?,tensorflow,keras,reshape,tensorflow2.0,tf.keras,Tensorflow,Keras,Reshape,Tensorflow2.0,Tf.keras,layers.embedding有一个参数(输入长度),描述如下: input_length:输入序列的长度,当其为常数时。如果要将“展平然后密集层”连接到上游,则需要此参数(如果没有此参数,则无法计算密集输出的形状) 为什么不能计算密集输出的形状。对我来说,flatte似乎很容易做到。它只是一个tf.rehshape(输入,(-1,1)),后面是一个密集层,我们可以选择任何输出形状 你能帮我指出我在理解entir逻辑方面的失误吗?通过指定尺寸,你可以确保模型接收到固定长度的输入 从技术上讲,您

layers.embedding有一个参数(输入长度),描述如下:

input_length:输入序列的长度,当其为常数时。如果要将“展平然后密集层”连接到上游,则需要此参数(如果没有此参数,则无法计算密集输出的形状)

为什么不能计算密集输出的形状。对我来说,
flatte
似乎很容易做到。它只是一个
tf.rehshape(输入,(-1,1))
,后面是一个密集层,我们可以选择任何输出形状


你能帮我指出我在理解entir逻辑方面的失误吗?

通过指定尺寸,你可以确保模型接收到固定长度的输入

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

您只需确保指定了层参数(输入尺寸、输出尺寸)、内核尺寸(用于conv层)、单位(用于FC层)

如果使用
输入
并指定张量的形状将通过网络,则可以计算形状

例如,以下模型完全有效:

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()
这里,我没有指定输入长度,但它是从
input
层推断出来的

问题在于顺序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\u length
参数。input\u length相当于
input(shape=(10))
,我展示了一个函数API模型,由于我之前在输入层中指出了形状,我不必在嵌入中再次指定长度,我添加了一个连续的示例,如果我不指定输入长度,模型将抛出错误,因为无法为模型选择权重形状。归根结底,NN是一组带有数字的矩阵,在建立模型之前,你需要知道每个矩阵的维数。这很有意义。但是,我们不是懒洋洋地在
build
方法中构建层吗?权重将根据第一个输入批次计算?每次实例化层对象时,它要么直接获取形状(输入层),要么从上一层推断,如果未找到相关形状信息,则抛出错误。这样想,稠密层是一个完全连接的层,所以它需要知道前一层中有多少个输入(因为在稠密层中,每个输入都连接到每个输出),否则它无法初始化权重矩阵。哦,是的!我懂了。这类似于不指定前一个密集层的输出形状,然后期望下一个层创建其权重。但是,我还是有一条皱纹。。即使第一批通过网络后,未指定前一密集层的输出形状的情况仍然不明确。但是这种情况可以通过在
build
方法中创建权重来轻松处理。我认为在编译模型时不会初始化模型权重。第二个网络的所有权重在第一批数据通过时就已确定
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()