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

nul*_*ull 6 neural-network keras tensorflow

让我们以具有一个隐藏层的全连接神经网络为例。输入层由5个单元组成,每个单元都连接到所有隐藏的神经元。总共有10个隐藏的神经元

Theano和Tensorflow等库允许多维输入/输出形状。例如,我们可以使用5个单词的句子,其中每个单词都由300d向量表示。

这样的输入如何映射到所描述的神经网络上?我不明白(无,5,300)的输入形状的含义(仅作为示例)。在我的想象中,我们只有一堆神经元,单个数字流过这些神经元。

当我的输出形状为(None,5,300)时,对应的网络中有多少神经元?如何将单词连接到我的神经网络?

Dan*_*ler 8

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

但是:如果必须为网络提供5个数字作为输入,那么将这些数字以长度为5的数组形式提供将很方便。

而且,如果您要为网络训练提供3万个示例,那么创建包含3万个元素的数组会很方便,每个元素都是5个数字的数组。

最后,此输入包含3万个5个数字的例子,是一个形状为(30000,5)的数组。

每层都有自己的输出形状。每层的输出肯定与它自己的神经元数量有关。每个神经元都会抛出一个数字(有时是一个数组,具体取决于您使用的图层类型)。但是10个神经元在一起将抛出10个数字,然后将其打包成一个阵列形状(30000,10)。

这些形状中的“无”一词与批次大小(您提供的用于训练或预测的示例数量)有关。您无需定义该数字,当您通过批处理时将自动理解该数字。

查看您的网络:

输入5个单位时,输入形状为(None,5)。但是您实际上只对模型说(5,),因为无部分是批次大小,仅在训练时才会显示。

此数字意味着:您必须为网络提供一个包含多个样本的数组,每个样本都是5个数字的数组。

然后,您的具有10个神经元的隐藏层将计算并为您提供10个数字,输出形式为(None,10)。

什么是(无,5,300)?

如果您说每个单词都是一个300d向量,则有几种不同的方法可以翻译一个单词。

常见的方法之一是:词典中有多少个单词?如果您有一本包含300个单词的字典,则可以使每个单词成为具有300个元素的矢量,除了其中一个元素外,其他元素均为零。

  • 假设单词“ hello”是字典中的第一个单词,其向量为[1,0,0,0,....,0]
  • 假设单词“我”是词典中的第二个单词,其向量将为[0,1,0,0,....,0]
  • “ fly”一词是字典中的最后一个,它的向量为[0,0,0,0,....,1]

您需要对整个词典进行此操作,并且每当必须将单词“ hello”传递到网络时,都将改为传递[1,0,0,0 ...,0]。

一个包含五个单词的句子将是一个包含五个数组的数组。这意味着一个包含五个单词的句子将被整形为(5,300)。如果通过3万个句子作为示例:(30000,5,300)。在模型中,“无”作为批次大小显示(无,5,300)

还有其他选择,例如创建一个word Embedding,它将把单词翻译成含义的向量。仅网络会理解的含义。(为此,在Keras上有Embedding层)。

也有叫做CBOW(连续词袋)的东西。

您必须先知道要做什么,然后才能将单词翻译成适合网络要求的数组。

输出(无,5,300)时,我有多少个神经元?

这仅告诉您最后一层。其他层的输出全部由下面的层计算并打包在一起,从而改变了输出。每层都有自己的输出。(有了模型后,您可以执行a model.summary()并查看每个图层的输出。)

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

诸如此类的层Dense会抛出诸如(BatchSize,NumberOfNeurons)

但是有这样的层次Convolution2D会抛出类似的东西(BatchSize, numberOfChannels, pixelsInX, pixelsInY)。例如,常规图像具有三个通道:红色,蓝色和绿色。用于传递常规图像的数组将类似于(3,sizeX,sizeY)。

这完全取决于您使用的图层类型。

使用词嵌入

对于使用嵌入,阅读有关它的keras文档很有趣。

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

  • 单词“你好”是1
  • 单词“我的”是2
  • 单词“飞”是 theSizeOfYourDictionary

如果您希望每个句子包含100个单词,那么您的输入形状将为(None,100)。每个由100个数字组成的数组都包含代表字典中单词的数字。

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

model = Sequential()
model.add(Embedding(theSizeOfYourDictionary, 300, input_length=100)
Run Code Online (Sandbox Code Playgroud)

这样,您将为每个单词创建大小为300的向量,并传递100个单词的序列。(我不习惯嵌入,但是似乎300是一个很大的数字,可能会更少)。

此嵌入的输出将为(None, 100, 300)

然后在它之后连接其他层。