诸如Theano和Tensorflow之类的库允许多维输入/输出形状。例如,我们可以使用由300d向量表示的5个单词的句子。
这样的输入如何映射到所描述的神经网络上?我不理解(空值, 5, 300)这样的输出形状(仅是一个例子)的含义。在我的想象中,我们只有一堆神经元,单个数字从其中流动。
当我有一个(空值,5,300)输出形状时,相应的网络中有多少个神经元?我如何将单词连接到我的神经网络?
是的,我们只有一堆神经元,通过这些神经元流动单个数字。
但是:如果您必须将5个数字作为输入提供给您的网络,则方便将这些数字放在长度为5的数组中。
如果您要为网络提供30,000个示例进行训练,则创建一个具有30,000个元素的数组会更加方便,每个元素都是由5个数字组成的数组。
最终,这个包含30,000个5个数字示例的输入是一个形状为(30000,5)的数组。
然后,每个层都有自己的输出形状。每个层的输出肯定与其自身的神经元数量有关。每个神经元将抛出一个数字(或者有时是一个数组,这取决于您使用的层类型)。但是,10个神经元一起将抛出10个数字,然后将它们打包成一个形状为(30000,10)的数组。
这些形状中的“None”与批量大小(您为训练或预测提供的示例数量)有关。您不定义该数字,当您传递批次时,它会自动理解。
你需要对整个字典进行这样的操作,每当你需要将单词"hello"传递给你的网络时,你将传递[1,0,0,0 ..., 0]。
一句含有五个单词的话将会是由这五个数组组成的数组。也就是说,一句含有五个单词的话的形状将会是(5,300)。如果你传递了三万句话作为样本:(30000,5,300)。在模型中,“None”将出现作为批处理大小(None,5,300)。
还有其他选项,例如创建一个单词“嵌入”(Embedding),将单词转换为意义向量。只有网络才能理解这些意义。 (Keras中有Embedding层可以实现这一点)。
还有一些被称为CBOW(连续词袋)的东西。
首先要知道你想做什么,这样你就可以将你的单词翻译成符合网络要求的数组。
这只告诉您关于最后一层的信息。其他层的输出都是由后续层计算和打包在一起的,这些层改变了输出。每个层都有自己的输出。(当您拥有模型时,可以执行model.summary()
并查看每个层的输出。)
即使如此,不知道您使用哪种类型的层是无法回答该问题的。
有一些层,例如Dense
,会抛出像(BatchSize,NumberOfNeurons)
这样的内容
但是有一些层,例如Convolution2D
,会抛出像(BatchSize,numberOfChannels,pixelsInX,pixelsInY)
这样的内容。例如,常规图像有三个通道:红色、蓝色和绿色。传递常规图像的数组可能是(3,sizeX,sizeY)。
所有这些都取决于您使用的层类型。
如果要使用嵌入,有关此内容的信息,请阅读 keras文档。
为此,您将需要将单词转换为索引。
与其说您字典中的每个单词是一个向量,不如说它是一个数字。
您的字典大小
如果您希望每个句子都有100个单词,则您的输入形状将为(无,100)。其中包含表示字典中单词的数字的100个数字数组。
您模型中的第一层将是一个Embedding
层。
model = Sequential()
model.add(Embedding(theSizeOfYourDictionary, 300, input_length=100)