为什么在图像分类问题中将 eminst 数据从 (28*28) 转换为 [-1, 784] 而不是 [0,784]?

Why the eminst data is converted from (28*28) to [-1, 784] instead of [0,784] in image classification problem?

这是来自 https://www.tensorflow.org/federated/tutorials/federated_learning_for_image_classification

的代码片段

该示例是使用联邦学习的图像分类问题。下面的函数是emnist数据(大小为28*28)的预处理函数。谁能帮助理解为什么数据被重塑为 -1 到 784?据我了解,我们将它从二维转换为一维数组,因为它更容易处理。但我不确定为什么 -1 被包括在内。 0 o 784 还不够吗?

NUM_CLIENTS = 10
NUM_EPOCHS = 5
BATCH_SIZE = 20
SHUFFLE_BUFFER = 100
PREFETCH_BUFFER=10

def preprocess(dataset):

  def batch_format_fn(element):
    """Flatten a batch `pixels` and return the features as an `OrderedDict`."""
    return collections.OrderedDict(
        x=tf.reshape(element['pixels'], **[-1, 784]**),
        y=tf.reshape(element['label'], **[-1, 1]**))

  return dataset.repeat(NUM_EPOCHS).shuffle(SHUFFLE_BUFFER).batch(
      BATCH_SIZE).map(batch_format_fn).prefetch(PREFETCH_BUFFER)

这里的-1表示这个维度的大小应该是推断出来的,应该认为是一个batch维度。由于 MNIST 数据是 28 x 28 个像素,如果我们有 N 个此数据的示例,我们将在这里有 N x 28 x 28 = N x 784 个像素。这里的 -1 允许此映射函数与批量大小无关。

如果我们要在 批处理之前应用此映射函数 ,我们将能够将 -1 硬编码为 1——但是这通常是编写 tf.data.Dataset 管道的反模式,请参阅有关编写高性能 tf.data.Dataset 管道的指南中的 vectorized mapping 部分。

我们不能在这里使用 0,因为这只有在 element 中恰好有 0 个示例时才有效;如上面的等式所示,这将硬编码假设 element.

中有 0 个像素

tf.reshape() 的工作方式类似于 numpy.reshape()。因此,为了简单起见,我想使用 numpy.reshape() 来解释它。假设您有一个由 numpy 数组 X=[[1,2],[3,4],[5,6]] 表示的数据集。这是一个二维数组,可以用形状 (3,2) 表示。请注意,在使用括号表示形状时,第一个元素(在本例中为 3)表示行数(即样本数),而第二个元素表示列数(特征数)。当我们在形状中使用 -1 时,表示元素(行或列)不受影响。例如,X.reshape(-1,1) 不会影响行,但是会将列数更改为 1。结果 X 将为 X=[[1],[2],[3 ],[4],[5],[6]]。如下所示: 将 numpy 导入为 np X= np.array([[1,2],[3,4],[5,6]]) print("初始尺寸为:",X.ndim) print("初始形状为:",X.shape) 打印('The initial dataset is:',X) X=X.reshape(-1,1) print("新维度是:",X.ndim) print("新形状是:",X.shape) 打印('The new dataset is:',X)

The initial dimensions are: 2
The initial shape is : (3, 2)
The initial dataset is: [[1 2][3 4][5 6]]
The new dimensions are: 2
The new shape is : (6, 1)
The new dataset is: [[1][2][3][4][5][6]]

类似地,x=tf.reshape(element['pixels'], [-1, 784]),将 28x28 像素值展平为 784 列。由于 -1,行数(代表样本数)不受影响。您不能使用 0,否则这将意味着零行(样本)。