我们以一个隐藏层为例,以一个完全连接的神经网络为例 . 输入层由 5 units 组成,每个都连接到所有隐藏的神经元 . 总共有 10 hidden neurons .
Theano和Tensorflow等库允许多维输入/输出形状 . 例如,我们可以使用5个单词的句子,其中每个单词由300d向量表示 .
如何在所描述的神经网络上映射这样的输入?我不明白(无,5,300)(只是一个例子)的ouptut形状是什么意思 . 在我的想象中,我们只有一堆神经元,单个数字流过这些神经元 .
当我的输出形状为(无,5,300)时,我在相应的网络中有多少神经元?如何将单词连接到神经网络?
1 回答
是的,我们只有一堆神经元通过单个数字流动 .
但是:如果你必须给你的网络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
图层 .这样,您就可以为每个单词创建大小为300的向量,传递100个单词的序列 . (我不习惯嵌入,但似乎300是一个很大的数字,它可能会更少) .
此嵌入的输出将为
(None, 100, 300)
.然后在其后连接其他图层 .