为什么在keras tensorflow中嵌入层需要输入长度?
layers.embedding有一个参数(输入长度),描述如下: input_length:输入序列的长度,当其为常数时。如果要将“展平然后密集层”连接到上游,则需要此参数(如果没有此参数,则无法计算密集输出的形状) 为什么不能计算密集输出的形状。对我来说,为什么在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逻辑方面的失误吗?通过指定尺寸,你可以确保模型接收到固定长度的输入 从技术上讲,您
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()