0

这是来自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)
4

2 回答 2

3

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

如果我们在批处理之前应用这个 map 函数,我们可以将其硬编码-1为 a 1——但这tf.data.Dataset通常是编写管道的反模式,请参阅编写高性能管道指南中的矢量化映射部分。tf.data.Dataset

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

于 2020-04-04T19:39:49.587 回答
-1

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

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,否则这将意味着零行(样本)。

于 2020-07-01T09:10:56.947 回答