如何在特征列中填充序列,以及feature_column
中的dimension
是什么意思?
我正在使用Tensorflow 2.0
并实现一个文本摘要的示例。我对机器学习、深度学习和TensorFlow还比较新手。
我遇到了feature_column
,发现它们很有用,因为我认为它们可以嵌入到模型的处理管道中。
在经典场景中,如果不使用feature_column
,我可以预处理文本,对其进行分词,将其转换为一系列数字,然后填充到maxlen
为100个单词的长度。但在使用feature_column
时,我无法实现这一点。
以下是我目前编写的代码。
train_dataset = tf.data.experimental.make_csv_dataset( 'assets/train_dataset.csv', label_name=LABEL, num_epochs=1, shuffle=True, shuffle_buffer_size=10000, batch_size=1, ignore_errors=True)vocabulary = ds.get_vocabulary()def text_demo(feature_column): feature_layer = tf.keras.experimental.SequenceFeatures(feature_column) article, _ = next(iter(train_dataset.take(1))) tokenizer = tf_text.WhitespaceTokenizer() tokenized = tokenizer.tokenize(article['Text']) sequence_input, sequence_length = feature_layer({'Text':tokenized.to_tensor()}) print(sequence_input)def categorical_column(feature_column): dense_column = tf.keras.layers.DenseFeatures(feature_column) article, _ = next(iter(train_dataset.take(1))) lang_tokenizer = tf.keras.preprocessing.text.Tokenizer( filters='') lang_tokenizer.fit_on_texts(article) tensor = lang_tokenizer.texts_to_sequences(article) tensor = tf.keras.preprocessing.sequence.pad_sequences(tensor, padding='post', maxlen=50) print(dense_column(tensor).numpy())text_seq_vocab_list = tf.feature_column.sequence_categorical_column_with_vocabulary_list(key='Text', vocabulary_list=list(vocabulary))text_embedding = tf.feature_column.embedding_column(text_seq_vocab_list, dimension=8)text_demo(text_embedding)numerical_voacb_list = tf.feature_column.categorical_column_with_vocabulary_list(key='Text', vocabulary_list=list(vocabulary))embedding = tf.feature_column.embedding_column(numerical_voacb_list, dimension=8)categorical_column(embedding)
我对这里应该使用sequence_categorical_column_with_vocabulary_list
还是categorical_column_with_vocabulary_list
感到困惑。在文档中,虽然我知道SequenceFeatures
是一个实验性功能,但它并没有被详细解释。
我也不明白dimension
参数的作用是什么?
回答:
实际上,以下问题
我对这里应该使用
sequence_categorical_column_with_vocabulary_list
还是categorical_column_with_vocabulary_list
感到困惑。
应该是第一个问题,因为它影响到主题名称中的解释。
此外,关于文本摘要的含义还不太清楚。你打算将处理后的文本传递给哪种类型的模型/层?
顺便说一下,这很重要,因为tf.keras.layers.DenseFeatures
和tf.keras.experimental.SequenceFeatures
适用于不同的网络架构和方法。
如SequenceFeatures层的文档所说,SequenceFeatures
层的输出应该被输入到序列网络中,如RNN。
而DenseFeatures
会产生一个密集的张量作为输出,因此适合其他类型的网络。
由于你在代码片段中执行了分词,你将在模型中使用嵌入。然后你有两个选择:
- 将学习到的嵌入传递到Dense层。这意味着你不会分析单词的顺序。
- 将学习到的嵌入传递到卷积、循环、平均池化、LSTM层,并利用单词顺序进行学习。
第一种选择需要使用:
tf.keras.layers.DenseFeatures
tf.feature_column.categorical_column_*()
中的一个- 和
tf.feature_column.embedding_column()
第二种选择需要使用:
tf.keras.experimental.SequenceFeatures
tf.feature_column.sequence_categorical_column_*()
中的一个- 和
tf.feature_column.embedding_column()
以下是示例。对于两种选择,预处理和训练部分是相同的:
...
这是我们不考虑单词顺序进行学习的第一种选择
...
这是我们考虑单词顺序并在模型中学习的第二种选择。
...
请在我的GitHub上找到包含这些示例的完整Jupyter笔记本:
- Answer. Tensorflow pad sequence feature column. DenseFeatures.ipynb
- Answer. Tensorflow pad sequence feature column. SequenceFeatures.ipynb
feature_column.embedding_column()
中的dimension
参数正是模型学习过程中表示标记的空间维度。请参阅https://www.tensorflow.org/beta/tutorials/text/word_embeddings以获取详细解释
另外,请注意使用feature_column.embedding_column()
是tf.keras.layers.Embedding()
的替代方案。如你所见,feature_column
从预处理管道中执行编码步骤,但你仍然需要手动执行句子的分割、填充和截断。