【问题标题】:Why the eminst data is converted from (28*28) to [-1, 784] instead of [0,784] in image classification problem?为什么在图像分类问题中 eminst 数据从 (28*28) 转换为 [-1, 784] 而不是 [0,784]?
【发布时间】:2020-04-04 08:06:38
【问题描述】:

这是来自https://www.tensorflow.org/federated/tutorials/federated_learning_for_image_classification的代码sn-p

该示例是使用联邦学习的图像分类问题。下面的函数是 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)

【问题讨论】:

  • 如果用户可以在否决问题之前在评论中添加原因,那将非常有帮助。我不知道这个问题有什么问题,如果我犯了一些错误,没有任何反馈,我将在以后的问题中重复错误。

标签: python machine-learning mnist tensorflow-federated


【解决方案1】:

这里的-1表示应该推断这个维度的大小,应该认为是批量维度。由于 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 像素。

【讨论】:

    【解决方案2】:

    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]]。如下所示: 将 numpy 导入为 np X= np.array([[1,2],[3,4],[5,6]]) print("初始尺寸为:",X.ndim) print("初始形状为:",X.shape) print('初始数据集是:',X) X=X.reshape(-1,1) print("新的维度是:",X.ndim) print("新的形状是:",X.shape) print('新的数据集是:',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,否则这将意味着零行(样本)。

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多