【问题标题】:Understanding input/output dimensions of neural networks了解神经网络的输入/输出维度
【发布时间】:2017-10-06 16:44:16
【问题描述】:

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

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

这样的输入如何映射到所描述的神经网络上?我不明白 (None, 5, 300) 的输出形状(只是一个例子)是什么意思。在我的想象中,我们只有一堆神经元,单个数字流过它们。

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

【问题讨论】:

    标签: tensorflow neural-network keras


    【解决方案1】:

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

    但是:如果你必须给你的网络提供 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)

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

    【讨论】:

    • 谢谢。使用词嵌入时,输入维度等于我的字典的大小。目前,我正在使用 word2vec 的预置嵌入。我的字典的总大小是 5125。这不是说输入层有 5125 个神经元(你的第一个参数)吗?这 5125 个神经元中的每一个都连接到下一层的 300 个神经元。但是我怎么能把一个有 300d 个单词的句子连接到一个有 5125 个输入神经元的 nn 呢?
    • 不,您输入的是“句子”的大小。您希望为网络提供训练的每个示例的大小。虽然字典的大小是嵌入的参数,但它会以适当的方式在内部进行计算。
    • 您的输入是(无,100)。嵌入会自动将其转换为 (None, 100, 300),而您添加到模型中的下一层必须适应此形状。
    • 我想嵌入本身有 300 个神经元,但我不知道它在内部是如何工作的......
    • 但是如果你的词已经是向量,你就不能使用嵌入。对于嵌入,每个单词都应该是一个数字。
    猜你喜欢
    • 2019-04-11
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多