ValueError: The last dimension of the inputs to a Dense layer should be defined. Found None

ValueError: The last dimension of the inputs to a Dense layer should be defined. Found None

我正在尝试使用 Tensorflow 2.7.0 及其新的 TextVectorization 层。然而,在这个简单的例子中有些东西不太正确:

import tensorflow as tf
import numpy as np

X = np.array(['this is a test', 'a nice test', 'best test this is'])

vectorize_layer = tf.keras.layers.TextVectorization()
vectorize_layer.adapt(X)
emb_layer = tf.keras.layers.Embedding(input_dim=vectorize_layer.vocabulary_size()+1, output_dim=2, input_length=4)
flatten_layer = tf.keras.layers.Flatten()
dense_layer = tf.keras.layers.Dense(1)


model = tf.keras.models.Sequential()
model.add(vectorize_layer)
model.add(emb_layer)
model.add(flatten_layer)
#model.add(dense_layer)

model(X)

到目前为止这有效。我用文字制作整数,嵌入它们,压扁它们。但是,如果我想在展平后添加一个 Dense 层(即取消注释一行),事情就会中断,我会从问题标题中得到错误消息。我什至使用了 Embedding 层的 input_length 参数,因为文档说我应该在使用 embedding->flatten->dense 时指定它。但这就是行不通。

你知道我如何使用 Flatten 而不是 GlobalAveragePooling1D 之类的东西让它工作吗?

非常感谢!

您需要为序列定义最大长度。

vectorize_layer = tf.keras.layers.TextVectorization(output_mode = 'int',
                                                    output_sequence_length=10)

如果您选中 model.summary()TextVectorization 的输出形状将为 (None, None)

第一个None表示模型可以接受任意batch size,第二个表示任何传给TextVectorization的句子都不会被截断或填充。所以输出的句子可以有可变长度。

示例:

import tensorflow as tf
import numpy as np

X = np.array(['this is a test', 'a nice test', 'best test this is'])

vectorize_layer = tf.keras.layers.TextVectorization(output_mode = 'int')
vectorize_layer.adapt(X)

model = tf.keras.models.Sequential()
model.add(vectorize_layer)

model(np.array(['this is a test']))
>> <tf.Tensor: shape=(1, 4), dtype=int64, numpy=array([[3, 4, 5, 2]])>

model(np.array(['this is a longer test sentence']))
>> <tf.Tensor: shape=(1, 6), dtype=int64, numpy=array([[3, 4, 5, 1, 2, 1]])>

重新定义它:

vectorize_layer = tf.keras.layers.TextVectorization(output_mode = 'int',
                                                    output_sequence_length = 5)

model(np.array(['this is a longer test sentence']))
>> <tf.Tensor: shape=(1, 5), dtype=int64, numpy=array([[3, 4, 5, 1, 2]])>

model(np.array(['this is']))
>> <tf.Tensor: shape=(1, 5), dtype=int64, numpy=array([[3, 4, 0, 0, 0]])>

output_sequence_length 定义为数字将确保输出的长度为固定数字。