首页 文章

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

提问于
浏览
4

我们以一个隐藏层为例,以一个完全连接的神经网络为例 . 输入层由 5 units 组成,每个都连接到所有隐藏的神经元 . 总共有 10 hidden neurons .

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

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

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

1 回答

  • 5

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

    但是:如果你必须给你的网络5个数字作为输入,那么将这些数字放在长度为5的数组中很方便 .

    如果您为网络提供了3万个示例进行训练,那么创建一个包含3万个元素的数组很方便,每个元素都是5个数字的数组 .

    最后,这个输入有3万个5个数字的例子是一个有形状的数组(30000,5) .

    然后每个图层都有自己的输出形状 . 每层的输出肯定与其自身的神经元数量有关 . 每个神经元都会丢弃一个数字(有时是一个数组,具体取决于你正在使用的图层类型) . 但是10个神经元将共同抛出10个数字,然后将这些数字打包成一个形状为(30000,10)的数组 .

    这些形状中的“无”一词与批量大小(您为训练或预测提供的示例数量)有关 . 您没有定义该编号,在传递批处理时会自动理解该编号 .

    看着你的网络:

    当您输入5个单位时,您的输入形状为(无,5) . 但实际上你只对你的模型说(5,),因为None部分是批量大小,只有在训练时才会出现 .

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

    然后,具有10个神经元的隐藏层将计算并给出10个数字作为输出,形状为(None,10) .

    什么是(无,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) . 在模型中,“无”显示为批次大小(无,5,300)

    还有其他选项,例如创建一个单词 Embedding ,它会将单词翻译成含义向量 . 只有网络才能理解的含义 . (Keras上有嵌入层) .

    还有一些名为CBOW的东西(连续的文字袋) .

    您必须先知道自己想要做什么,这样才能在符合网络要求的阵列中翻译您的单词 .

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

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

    即使如此,如果不知道您正在使用哪种类型的图层,也无法回答这个问题 .

    Dense 这样的层会丢掉像 (BatchSize,NumberOfNeurons) 这样的东西

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

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

    使用单词嵌入

    对于使用嵌入,有趣的是阅读keras documentation .

    为此你必须在索引中改变你的单词 .
    而不是说你的字典中的每个单词都是一个向量,你说它是一个数字 .

    • Word "hello"是1

    • Word "my"是2

    • Word "fly"是 theSizeOfYourDictionary

    如果你想让每个句子有100个单词,那么你的输入形状将是(None,100) . 每个100个数字的数组包含代表字典中单词的数字 .

    模型中的第一层将是 Embedding 图层 .

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

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

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

    然后在其后连接其他图层 .

相关问题