如何设置用于二进制分类的神经网络架构

时间:2018-08-07 08:08:47

标签: tensorflow machine-learning

我正在阅读有关神经网络的tensorflow教程,并且遇到了架构部分,这有点令人困惑。有人可以解释一下为什么他在此代码中使用了以下设置

# input shape is the vocabulary count used for the movie reviews 
(10,000 words)
vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation=tf.nn.relu))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))

model.summary()

Vocab_size? 嵌入的值是16? 以及单位的选择,我得到了最后一个密集层背后的直觉,因为它是二进制分类(1),但是为什么第二层有16个单位呢? 嵌入的16个单位和第一密集层的16个单位是否相关?好像他们应该平等吗?

如果有人也可以解释这一段

  

第一层是嵌入层。该层采用整数编码的词汇表,并为每个单词索引查找嵌入向量。这些向量是在模型训练中学习的。向量将维度添加到输出数组。生成的尺寸为:(批,序列,嵌入)。

来源: Classify movie reviews: binary classification

2 个答案:

答案 0 :(得分:1)

第一层是vocab_size,因为每个单词都表示为词汇表的索引。例如,如果输入单词是“ word”(即词汇中的第500个单词),则输入是长度为vocab_size的向量,除了索引为500的一个以外,其他所有零都为零。这通常称为a “一个热门”代表。

嵌入层本质上采用了巨大的输入向量,并将其压缩为较小的向量(在本例中为长度16),该向量对有关单词的某些信息进行了编码。像其他任何神经网络层一样,可以从训练中学习特定的嵌入权重。我建议您阅读单词嵌入。 16的长度在这里有点随意,但是可以调整。可以取消这一嵌入层,但是该模型的表达能力会降低(这只是逻辑回归,这是一个线性模型)。

然后,正如您所说,最后一层只是基于嵌入来预测单词的类别。

答案 1 :(得分:1)

  • vocab_size :语料库中的所有单词(在本例中为IMDB)都是根据其频率和提取的前10000个单词进行排序的。其余词汇将被忽略。例如:这确实是Fancyyyyyyy将转换为==> [8 7 9]。您可能会猜到 Fancyyyyyyy 这个词被忽略了,因为它的前10000个单词不在前。
  • pad_sequences :将所有句子转换为相同大小。例如,在训练语料库中,文档长度是不同的。因此它们全部都转换为seq_len =256。完成此步骤后,您的输出为[Batch_size * seq_len]
  • 嵌入:每个单词都转换为16维矢量。结果,此步骤输出的是张量为[Batch_size * seq_len * embedding_dim]的张量。
  • GlobalAveragePooling1D :将大小为[Batch_size * seq_len * embedding_dim]的序列转换为[Batch_size * embedding_dim]
  • 单位:是密集层(MLP层)的输出。它会将[Batch_size * embedding_dim]转换为[Batch_size * unit]