为什么在图像分类问题中将 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,否则这将意味着零行(样本)。
这是来自 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,否则这将意味着零行(样本)。