这是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
这里表示应推断此尺寸的大小,并且应将其视为批处理尺寸。由于MNIST数据为28 x 28
像素,如果我们有此数据的N
示例,则此处的总像素为N x 28 x 28 = N x 784
。 -1
允许此映射功能与批处理大小无关。
如果要应用此映射函数之前批处理,则可以将-1
硬编码为1
,但这通常是编写tf.data.Dataset
管道的反模式,请参见编写性能vectorized mapping管道的指南中的tf.data.Dataset
部分。
我们将无法在此处使用0,因为仅当0
中确实有element
个示例时,此方法才有效;如上式所示,这将对0
中有element
个像素的假设进行硬编码。