神经网络输入/输出维度的理解

12
让我们以一个具有一个隐藏层的全连接神经网络为例。输入层由5个单元组成,每个单元都连接到所有隐藏神经元。总共有10个隐藏神经元
诸如Theano和Tensorflow之类的库允许多维输入/输出形状。例如,我们可以使用由300d向量表示的5个单词的句子。
这样的输入如何映射到所描述的神经网络上?我不理解(空值, 5, 300)这样的输出形状(仅是一个例子)的含义。在我的想象中,我们只有一堆神经元,单个数字从其中流动。
当我有一个(空值,5,300)输出形状时,相应的网络中有多少个神经元?我如何将单词连接到我的神经网络?
1个回答

13

是的,我们只有一堆神经元,通过这些神经元流动单个数字。

但是:如果您必须将5个数字作为输入提供给您的网络,则方便将这些数字放在长度为5的数组中。

如果您要为网络提供30,000个示例进行训练,则创建一个具有30,000个元素的数组会更加方便,每个元素都是由5个数字组成的数组。

最终,这个包含30,000个5个数字示例的输入是一个形状为(30000,5)的数组。

然后,每个层都有自己的输出形状。每个层的输出肯定与其自身的神经元数量有关。每个神经元将抛出一个数字(或者有时是一个数组,这取决于您使用的层类型)。但是,10个神经元一起将抛出10个数字,然后将它们打包成一个形状为(30000,10)的数组。

这些形状中的“None”与批量大小(您为训练或预测提供的示例数量)有关。您不定义该数字,当您传递批次时,它会自动理解。

查看您的网络:

当您输入5个单位时,您将得到形状为(None,5)的输入形状。但是,您实际上只向您的模型提供(5,),因为None部分是批处理大小,仅在训练时出现。
这个数字的意思是:您必须给您的网络一个数组,其中包含数量的样本,每个样本都是由5个数字组成的数组。
然后,您的具有10个神经元的隐藏层将计算并给出10个数字作为输出,以一个形状为(None,10)的数组形式。
(None,5,300)是什么?
如果您说每个单词是一个300d向量,那么有几种不同的方法来翻译该单词。
其中一种常见的方法是:您的字典中有多少个单词?
如果您的字典中有300个单词,那么您可以使每个单词成为一个具有300个元素的向量,其中除了其中一个元素外,所有元素都为零。
  • 假设单词"hello"是你的字典中的第一个单词,那么它的向量将为[1,0,0,0,....,0]
  • 假设单词"my"是你的字典中的第二个单词,那么它的向量将为[0,1,0,0,....,0]
  • 而单词"fly"则是字典中的最后一个单词,它的向量将为[0,0,0,0,....,1]

你需要对整个字典进行这样的操作,每当你需要将单词"hello"传递给你的网络时,你将传递[1,0,0,0 ..., 0]。

一句含有五个单词的话将会是由这五个数组组成的数组。也就是说,一句含有五个单词的话的形状将会是(5,300)。如果你传递了三万句话作为样本:(30000,5,300)。在模型中,“None”将出现作为批处理大小(None,5,300)。

还有其他选项,例如创建一个单词“嵌入”(Embedding),将单词转换为意义向量。只有网络才能理解这些意义。 (Keras中有Embedding层可以实现这一点)。

还有一些被称为CBOW(连续词袋)的东西。

首先要知道你想做什么,这样你就可以将你的单词翻译成符合网络要求的数组。

如果输出是(None,5,300),我有多少个神经元?

这只告诉您关于最后一层的信息。其他层的输出都是由后续层计算和打包在一起的,这些层改变了输出。每个层都有自己的输出。(当您拥有模型时,可以执行model.summary()并查看每个层的输出。)

即使如此,不知道您使用哪种类型的层是无法回答该问题的。

有一些层,例如Dense,会抛出像(BatchSize,NumberOfNeurons)这样的内容

但是有一些层,例如Convolution2D,会抛出像(BatchSize,numberOfChannels,pixelsInX,pixelsInY)这样的内容。例如,常规图像有三个通道:红色、蓝色和绿色。传递常规图像的数组可能是(3,sizeX,sizeY)。

所有这些都取决于您使用的层类型。

使用单词嵌入

如果要使用嵌入,有关此内容的信息,请阅读 keras文档

为此,您将需要将单词转换为索引。
与其说您字典中的每个单词是一个向量,不如说它是一个数字。

  • 单词“hello”为1
  • 单词“my”为2
  • 单词“fly”为您的字典大小

如果您希望每个句子都有100个单词,则您的输入形状将为(无,100)。其中包含表示字典中单词的数字的100个数字数组。

您模型中的第一层将是一个Embedding层。

model = Sequential()
model.add(Embedding(theSizeOfYourDictionary, 300, input_length=100)

这样,您将为每个单词创建大小为300的向量,并传递100个单词的序列。(我不习惯使用嵌入,但似乎300是一个很大的数字,它可以更小一些。)该嵌入的输出将是(无,100,300)。然后您连接其他图层。

感谢您。在使用词嵌入时,输入维度等于我的词典大小。目前,我正在使用word2vec预训练的嵌入。我的词典总大小为5125。这难道不意味着输入层有5125个神经元(即第一个参数)吗?这5125个神经元中的每一个都与下一层的300个神经元相连。但是,我该如何将具有300d单词的句子连接到具有5125个输入神经元的神经网络上呢? - null
不,您的输入是“句子”的大小。它表示您想要提供给神经网络进行训练的每个示例的大小。而您的词典大小是嵌入参数,因此它会在内部以适当的方式计算事物。 - Daniel Möller
你的输入是(None,100)。嵌入将自动将其转换为(None,100,300),您添加到模型的下一层必须适应此形状。 - Daniel Möller
我猜嵌入本身有300个神经元,但我不知道它内部是如何工作的... - Daniel Möller
但是如果你的词已经是向量,你就不能使用嵌入。对于一个嵌入来说,每个词应该是一个数字。 - Daniel Möller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接