<jupyter_start><jupyter_text>图像分类数据集:label:`sec_fashion_mnist`(**MNIST数据集**) :cite:`LeCun.Bottou.Bengio.ea.1998`(**是图像分类中广泛使用的数据集之一，但作为基准数据集过于简单。我们将使用类似但更复杂的Fashion-MNIST数据集**) :cite:`Xiao.Rasul.Vollgraf.2017`。<jupyter_code>%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l

d2l.use_svg_display()<jupyter_output><empty_output><jupyter_text>读取数据集我们可以[**通过框架中的内置函数将Fashion-MNIST数据集下载并读取到内存中**]。 这里是读取全部的data 只是读取 如果要用自己的数据集得重写load函数 后续使用没差别<jupyter_code>mnist_train, mnist_test = tf.keras.datasets.fashion_mnist.load_data()<jupyter_output><empty_output><jupyter_text>Fashion-MNIST由10个类别的图像组成，每个类别由*训练数据集*（train dataset）中的6000张图像和*测试数据集*（test dataset）中的1000张图像组成。因此，训练集和测试集分别包含60000和10000张图像。测试数据集不会用于训练，只用于评估模型性能。<jupyter_code>len(mnist_train[0]), len(mnist_test[0])<jupyter_output><empty_output><jupyter_text>每个输入图像的高度和宽度均为28像素。数据集由灰度图像组成，其通道数为1。为了简洁起见，本书将高度$h$像素、宽度$w$像素图像的形状记为$h \times w$或（$h$,$w$）。<jupyter_code>mnist_train[0][0].shape<jupyter_output><empty_output><jupyter_text>[~~两个可视化数据集的函数~~]Fashion-MNIST中包含的10个类别，分别为t-shirt（T恤）、trouser（裤子）、pullover（套衫）、dress（连衣裙）、coat（外套）、sandal（凉鞋）、shirt（衬衫）、sneaker（运动鞋）、bag（包）和ankle boot（短靴）。以下函数用于在数字标签索引及其文本名称之间进行转换。<jupyter_code>def get_fashion_mnist_labels(labels):  #@save
    """返回Fashion-MNIST数据集的文本标签。"""
    text_labels = ['t-shirt', 'trouser', 'pullover', 'dress', 'coat',
                   'sandal', 'shirt', 'sneaker', 'bag', 'ankle boot']
    return [text_labels[int(i)] for i in labels]<jupyter_output><empty_output><jupyter_text>我们现在可以创建一个函数来可视化这些样本。<jupyter_code>def show_images(imgs, num_rows, num_cols, titles=None, scale=1.5):  #@save
    """绘制图像列表。"""
    figsize = (num_cols * scale, num_rows * scale)
    _, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize)
    axes = axes.flatten()
    for i, (ax, img) in enumerate(zip(axes, imgs)):
        ax.imshow(img.numpy())
        ax.axes.get_xaxis().set_visible(False)
        ax.axes.get_yaxis().set_visible(False)
        if titles:
            ax.set_title(titles[i])
    return axes<jupyter_output><empty_output><jupyter_text>以下是训练数据集中前[**几个样本的图像及其相应的标签**]。<jupyter_code>X = tf.constant(mnist_train[0][:18])
y = tf.constant(mnist_train[1][:18])
show_images(X, 2, 9, titles=get_fashion_mnist_labels(y));<jupyter_output><empty_output><jupyter_text>读取小批量为了使我们在读取训练集和测试集时更容易，我们使用内置的数据迭代器，而不是从零开始创建。回顾一下，在每次迭代中，数据加载器每次都会[**读取一小批量数据，大小为`batch_size`**]。通过内置数据迭代器，我们可以随机打乱了所有样本，从而无偏见地读取小批量。<jupyter_code>batch_size = 256
train_iter = tf.data.Dataset.from_tensor_slices(
    mnist_train).batch(batch_size).shuffle(len(mnist_train[0]))<jupyter_output><empty_output><jupyter_text>我们看一下读取训练数据所需的时间。<jupyter_code>timer = d2l.Timer()
for X, y in train_iter:
    continue
f'{timer.stop():.2f} sec'<jupyter_output><empty_output><jupyter_text>整合所有组件现在我们[**定义`load_data_fashion_mnist`函数**]，用于获取和读取Fashion-MNIST数据集。这个函数返回训练集和验证集的数据迭代器。此外，这个函数还接受一个可选参数`resize`，用来将图像大小调整为另一种形状。<jupyter_code>mnist_train, mnist_test = tf.keras.datasets.fashion_mnist.load_data()<jupyter_output><empty_output><jupyter_text>把label 和data 放在一个list里面比较好操作<jupyter_code>print( mnist_train[0].shape) # image 0-255
print( mnist_train[1].shape) # label
print( mnist_test[0].shape) # image 0-255
print( mnist_test[1].shape) # label
def load_data_fashion_mnist(dataset, batch_size, resize=None):   #@save
    """下载Fashion-MNIST数据集，然后将其加载到内存中。"""
    process = lambda X, y: (tf.expand_dims(X, axis=3) / 255,
                            tf.cast(y, dtype='int32'))
    resize_fn = lambda X, y: (  tf.image.resize_with_pad(X, resize, resize) if resize else X, y)
    return (                                              #*args 表示任何多个无名参数，它本质是一个 tuple
        tf.data.Dataset.from_tensor_slices(process(*dataset)).batch( # *dataset = dataset[0] , dataset[1]
            batch_size).shuffle(len(dataset[0])).map(resize_fn) )<jupyter_output><empty_output><jupyter_text>下面，我们通过指定`resize`参数来测试`load_data_fashion_mnist`函数的图像大小调整功能。<jupyter_code>train_iter = load_data_fashion_mnist(mnist_train,32, resize=64)
for patch in train_iter:
    X , y = patch[0] , patch[1] 
    print(X.shape ,  X.dtype)
    print(y.shape , y.dtype)
    break<jupyter_output>(32, 64, 64, 1) <dtype: 'float32'>
(32,) <dtype: 'int32'>
{'fraction_non_alphanumeric': 0.1502972651605232, 'fraction_numerical': 0.023067776456599288, 'mean_word_length': 7.072936660268714, 'pattern_counts': {'":': 0, '<': 50, '<?xml version=': 0, '>': 50, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '566241', 'license': 'MIT', 'n_tokens_mistral': 2204, 'n_tokens_neox': 2228, 'n_words': 178, 'path': 'dataset preprocessing/tf_image_classification_dataset.ipynb', 'repo_name': 'JiaheXu/Machine-Learning-Codebase', 'size': '4205'}