Tensorflow TextVectorization 在 model.summary() 中带来 None 形状
Posted
技术标签:
【中文标题】Tensorflow TextVectorization 在 model.summary() 中带来 None 形状【英文标题】:Tensorflow TextVectorization brings None shape in model.summary() 【发布时间】:2021-05-13 14:30:45 【问题描述】:我正在使用来自 TextVectorization
类的 TextVectorization
对象的 encoder
。然后我像这样调整我的火车数据:
encoder = tf.keras.layers.experimental.preprocessing.TextVectorization(max_tokens=1000)
encoder.adapt(dataset_all.map(lambda text, label: text))
然后我想运行一个具有密集层的简单神经网络。这是我的模型
model = tf.keras.Sequential([
tf.keras.Input(shape=(1,), dtype=tf.string),
encoder,
tf.keras.layers.Embedding(len(encoder.get_vocabulary())+1
,output_dim=64,mask_zero=True),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(4, activation='softmax')
])
当我打印摘要时,我得到以下信息:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
text_vectorization (TextVect multiple 0
_________________________________________________________________
embedding_39 (Embedding) (None, None, 64) 6142528
_________________________________________________________________
dense_74 (Dense) (None, None, 64) 4160
_________________________________________________________________
dense_75 (Dense) (None, None, 4) 260
=================================================================
Total params: 6,146,948
Trainable params: 6,146,948
Non-trainable params: 0
我不明白每个输出昏暗中的第二个None
代表什么。此外,当我尝试拟合模型时,我收到一条错误消息(正在使用 sparseCategoricalCrossEntropy
loss ):
assertion failed: [Condition x == y did not hold element-wise:] [x (sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/Shape_1:0) = ] [64 1] [y (sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/strided_slice:0) = ] [64 69]
由于我需要最终密集层的二维输出,因此我尝试在嵌入层之后添加一个展平层,但是由于未指定密集输入的第二维,因此它不起作用。
如果我在嵌入层之后添加一个 RNN 层,由于嵌入层的输出是 3D,因此网络可以正确训练,但是,我不明白如何只有密集层。
【问题讨论】:
嵌入后添加GlobalAveragePooling1D
怎么样?
【参考方案1】:
这是因为您没有指定指示encoder
的输出形状的参数,即output_sequence_length
。
output_sequence_length:如果设置,输出的时间维度将被填充或截断为精确的 output_sequence_length 值,导致形状为 [batch_size, output_sequence_length] 的张量,无论拆分产生多少令牌步。默认为无。
如果你把它设置为一个数字,你会看到层的输出形状会被定义:
encoder = tf.keras.layers.experimental.preprocessing.TextVectorization(
max_tokens=1000,
output_sequence_length=200
)
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
text_vectorization_3 (TextVe (None, 200) 0
_________________________________________________________________
embedding_2 (Embedding) (None, 200, 64) 448
_________________________________________________________________
dense_4 (Dense) (None, 200, 64) 4160
_________________________________________________________________
dense_5 (Dense) (None, 200, 4) 260
=================================================================
Total params: 4,868
Trainable params: 4,868
Non-trainable params: 0
_________________________________________________________________
之后,您可以使用GlobalAveragePooling1D
层进行二维输出。
阅读docs
【讨论】:
以上是关于Tensorflow TextVectorization 在 model.summary() 中带来 None 形状的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Tensorflow Profiler 在 Tensorflow 2.5 中使用“tensorflow-macos”和“tensorflow-metal”工作
python [test tensorflow] test tensorflow installation #tensorflow