为什么我们在将数据输入 tensorflow 之前将数据展平?

Why do we flatten the data before we feed it into tensorflow?

我正在关注 udacity MNIST tutorial,MNIST 数据最初是 28*28 矩阵。然而就在提供数据之前,他们将数据展平为具有 784 列的一维数组 (784 = 28 * 28)

例如, 原始训练集形状为 (200000, 28, 28).
200000 行(数据)。每个数据都是28*28的矩阵

他们将其转换为训练集,其形状为 (200000, 784)

有人可以解释为什么他们在将数据提供给 tensorflow 之前将数据展平吗?

因为在添加全连接层时,您总是希望数据是(1 或)2 维矩阵,其中每一行都是表示数据的向量。这样,全连接层只是输入(大小 (batch_size, n_features))和权重(形状 (n_features, n_outputs))(加上偏差和激活函数)之间的矩阵乘法,你得到形状 (batch_size, n_outputs) 的输出。另外,你真的不需要全连接层的原始形状信息,丢掉也没关系。

如果不先进行重塑而获得相同的结果会更复杂且效率更低,这就是为什么我们总是在全连接层之前进行重塑。相反,对于卷积层,您需要将数据保持为原始格式(宽度、高度)。

这是全连接层的惯例。全连接层将前一层中的每个节点与后续层中的每个节点连接起来,因此局部性对于此类层来说不是问题。

此外,通过像这样定义层,我们可以通过计算公式f(Wx + b) = y有效地计算下一步。这对于多维输入来说并不容易实现,并且重塑输入的成本低且易于实现。