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
定义为数字将确保输出的长度为固定数字。
我正在尝试使用 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
定义为数字将确保输出的长度为固定数字。