是的,我们只有一堆神经元通过单个数字流动。
但是:如果你必须给你的网络提供 5 个数字作为输入,那么将这些数字放在一个长度为 5 的数组中会很方便。
如果您要为网络提供 30000 个示例进行训练,那么创建一个包含 30000 个元素的数组会很方便,每个元素是一个由 5 个数字组成的数组。
最后,这个包含 5 个数字的 3 万个示例的输入是一个形状为 (30000,5) 的数组。
每一层都有它自己的输出形状。每一层的输出肯定与它自己的神经元数量有关。每个神经元都会抛出一个数字(或者有时是一个数组,具体取决于您使用的层类型)。但是 10 个神经元一起会抛出 10 个数字,然后将它们打包成一个形状为 (30000,10) 的数组。
这些形状中的“无”一词与批量大小(您为训练或预测提供的示例数量)有关。您没有定义该数字,当您通过批次时会自动理解。
查看您的网络:
当您输入 5 个单位时,您的输入形状为 (None,5)。但你实际上只对你的模型说 (5,),因为 None 部分是批量大小,只会在训练时出现。
这个数字意味着:你必须给你的网络一个包含多个样本的数组,每个样本是一个由 5 个数字组成的数组。
然后,具有 10 个神经元的隐藏层将计算并在形状为 (None, 10) 的数组中为您提供 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)。如果你通过3万个句子作为例子:(30000,5,300)。在模型中,“None”显示为批大小 (None, 5, 300)
还有其他选项,例如创建一个单词Embedding,它将单词翻译成含义向量。只有网络才能理解的含义。 (在 Keras 上有嵌入层)。
还有一些东西叫做 CBOW(连续词袋)。
你必须先知道你想做什么,这样你才能把你的话翻译成适合网络要求的数组。
对于 (None,5,300) 的输出,我有多少个神经元?
这只告诉你最后一层。其他层的输出全部由后面的层计算并打包在一起,从而改变了输出。每一层都有自己的输出。 (当你有模型时,你可以做一个model.summary() 并查看每一层的输出。)
即使不知道您使用的是哪种类型的图层,也无法回答这个问题。
像Dense 这样的层会抛出像(BatchSize,NumberOfNeurons) 这样的东西
但是像Convolution2D 这样的层会抛出像(BatchSize, numberOfChannels, pixelsInX, pixelsInY) 这样的东西。例如,常规图像具有三个通道:红色、蓝色和绿色。用于传递常规图像的数组类似于 (3,sizeX,sizeY)。
这完全取决于您使用的图层类型。
使用词嵌入
对于使用嵌入,阅读keras documentation 很有趣。
为此,您必须在索引中转换您的单词。
不要说字典中的每个单词都是一个向量,而是说它是一个数字。
- 单词“你好”是 1
- 单词“我的”是 2
- 单词“fly”是
theSizeOfYourDictionary
如果您希望每个句子有 100 个单词,那么您的输入形状将为 (None, 100)。其中每个 100 个数字的数组包含代表字典中单词的数字。
模型中的第一层将是Embedding 层。
model = Sequential()
model.add(Embedding(theSizeOfYourDictionary, 300, input_length=100)
这样,您将为每个单词创建大小为 300 的向量,传递 100 个单词的序列。 (我不习惯嵌入,但似乎 300 是一个很大的数字,可能会更少)。
这个嵌入的输出将是(None, 100, 300)。
然后你在它之后连接其他层。