为什么在输入tensorflow之前需要将数据扁平化?

9
我正在遵循优达学城MNIST教程,MNIST数据最初是一个28*28矩阵。但是在将数据提供给神经网络之前,他们将数据展平为具有784列的一维数组(784 = 28 * 28)
例如,原始训练集形状为(200000, 28, 28)。
其中200000行(数据),每个数据都是28*28矩阵。
他们将其转换为形状为(200000, 784)的训练集。
有人能解释一下为什么在提供给tensorflow之前要展平数据吗?

1
你的链接以localhost开头,你应该修复它。 - gdelab
谢谢。现在已经修复了。 - aerin
2
发送给tensorflow之前,您不必将其压平。您可以在Tensorflow中进行压平。 - Anton Codes
2个回答

8
因为当您添加完全连接的层时,您总是希望您的数据是一个(1或)2维矩阵,其中每行都是代表您数据的向量。这样,完全连接的层就是输入(大小为(batch_size, n_features))和权重(形状为(n_features, n_outputs))(加上偏置和激活函数)之间的矩阵乘法,并且您会得到形状为(batch_size, n_outputs)的输出。此外,在完全连接的层中,您确实不需要原始形状信息,因此可以失去它。

如果没有先进行重新整形,要获得相同结果将更加复杂且效率较低,这就是为什么我们总是在完全连接的层之前这样做的原因。相反,在卷积层中,您将希望保留数据的原始格式(宽度、高度)。


3

这是完全连接层的一种约定。完全连接层将前一层中的每个节点与后续层中的每个节点相连接,因此这种层次结构的局部性不是问题。

此外,通过这样定义层,我们可以通过计算公式 f(Wx + b) = y 来高效地计算下一步。在多维输入情况下,这将不会如此容易实现,而重新整形输入是低成本且易于完成的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接