keras_5_数据预处理

1. 序列预处理

  1. TimeseriesGenerator

    • 用于生成批量时序数据的实用工具类。这个类以一系列由相等间隔以及一些时间序列参数(例如步长、历史长度等)汇集的数据点作为输入,以生成用于训练/验证的批次数据。

      from keras.preprocessing.sequence import TimeseriesGenerator
      import numpy as np
      
      data = np.array([[i] for i in range(50)]) # 时间步
      targets = np.array([[i] for i in range(50)]) # 对应于data的时间步的目标值
      
      data_gen = TimeseriesGenerator(data, targets,
                                     length=10, sampling_rate=2,
                                     batch_size=2)
      assert len(data_gen) == 20
      
      batch_0 = data_gen[0]
      x, y = batch_0
      assert np.array_equal(x,
                            np.array([[[0], [2], [4], [6], [8]],
                                      [[1], [3], [5], [7], [9]]]))
      assert np.array_equal(y,
                            np.array([[10], [11]]))
      
  2. pad_sequences

    • 将多个序列截断或补齐为相同长度。该函数将一个 num_samples 的序列(整数列表)转化为一个 2D Numpy 矩阵,其尺寸为 (num_samples, num_timesteps)num_timesteps 要么是给定的 maxlen 参数,要么是最长序列的长度。
    • num_timesteps 短的序列将在末端value补齐。向前补齐为默认操作。
    • num_timesteps 长的序列将会被截断以满足所需要的长度。补齐或截断发生的位置分别由参数 padingtruncating 决定。
  3. skipgrams

    • 生成 skipgram 词对。该函数将一个单词索引序列(整数列表)转化为以下形式的单词元组
      • (单词, 同窗口的单词),标签为 1(正样本)。
      • (单词, 来自词汇表的随机单词),标签为 0(负样本)。
  4. make_sampling_table

    • 生成一个基于单词的概率采样表。用来生成 skipgramssampling_table 参数。sampling_table[i] 是数据集中第 i 个最常见词的采样概率(出于平衡考虑,出现更频繁的词应该被更少地采样)。

    • 采样概率根据 word2vec 中使用的采样分布生成:

      p(word) = (min(1, sqrt(word_frequency / sampling_factor) /
          (word_frequency / sampling_factor)))
      # 我们假设单词频率遵循 Zipf 定律(s=1),来导出 frequency(rank) 的数值近似:
      frequency(rank) ~ 1/(rank * (log(rank) + gamma) + 1/2 - 1/(12*rank))
      # 其中 gamma 为 Euler-Mascheroni 常量。
      

2. 文本预处理

  1. Tokenizer
    • 文本标记实用类。该类允许使用两种方法向量化一个文本语料库: 将每个文本转化为一个整数序列(每个整数都是词典中标记的索引); 或者将其转化为一个向量,其中每个标记的系数可以是二进制值、词频、TF-IDF权重等。
    • 默认情况下,删除所有标点符号,将文本转换为空格分隔的单词序列(单词可能包含 ' 字符)。 这些序列然后被分割成标记列表。然后它们将被索引或向量化。0 不会被分配给任何单词的保留索引。
  2. hashing_trick
    • 将文本转换为固定大小散列空间中的索引序列。由于哈希函数可能发生冲突,可能会将两个或更多字分配给同一索引。 碰撞的概率与散列空间的维度和不同对象的数量有关。
  3. one_hot
    • One-hot 将文本编码为大小为 n 的单词索引列表。
  4. text_to_word_sequence
    • 将文本转换为单词(或标记)的序列。

3. 图像预处理

  • ImageDataGenerator 类:通过实时数据增强生成张量图像数据批次。数据将不断循环(按批次)。

  • 使用 .flow(x, y) 的例子:

    (x_train, y_train), (x_test, y_test) = cifar10.load_data()
    y_train = np_utils.to_categorical(y_train, num_classes) # 对y_train的每个元素进行one-hot编码
    y_test = np_utils.to_categorical(y_test, num_classes)
    
    datagen = ImageDataGenerator(
        featurewise_center=True,    # 将输入数据的均值设置为 0,逐特征进行(像素矩阵?)
        featurewise_std_normalization=True, # 将输入除以数据标准差,逐特征进行。
        rotation_range=20,                  # 整数。随机旋转的度数范围。(图片旋转?)
        width_shift_range=0.2,                              # 浮点数、一维数组或整数 (width伸缩?)
        height_shift_range=0.2,             # 浮点数、一维数组或整数 (height伸缩?)
        horizontal_flip=True)               # 布尔值。将图片执行随机水平翻转。
    
    # 计算特征归一化所需的数量
    # (如果应用 ZCA 白化,将计算标准差,均值,主成分)# ZCA 白化 ? 协方差矩阵?用再查!
    datagen.fit(x_train) # 做了上述ImageDataGenerator中涉及的图像增强
    
    # 使用实时数据增益的批数据对模型进行拟合:
    model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                        steps_per_epoch=len(x_train) / 32, epochs=epochs)
    
    # 这里有一个更 「手动」的例子
    for e in range(epochs):
        print('Epoch', e)
        batches = 0
        for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
            model.fit(x_batch, y_batch)
            batches += 1
            if batches >= len(x_train) / 32:
                # 我们需要手动打破循环,
                # 因为生成器会无限循环
                break
    
  • 使用 .flow_from_directory(directory) 的例子:

    train_datagen = ImageDataGenerator(
            rescale=1./255,           # 顾名思义:尺寸放缩
            shear_range=0.2,        # 剪切
            zoom_range=0.2,            # 缩放
            horizontal_flip=True)  # 水平翻转
    
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(
            'data/train',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    
    validation_generator = test_datagen.flow_from_directory(
            'data/validation',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    
    model.fit_generator(
            train_generator,
            steps_per_epoch=2000,
            epochs=50,
            validation_data=validation_generator,
            validation_steps=800)
    
  • 同时转换图像和蒙版 (mask) 的例子。

    # 创建两个相同参数的实例
    data_gen_args = dict(featurewise_center=True,
                         featurewise_std_normalization=True,
                         rotation_range=90.,
                         width_shift_range=0.1,
                         height_shift_range=0.1,
                         zoom_range=0.2)
    image_datagen = ImageDataGenerator(**data_gen_args)
    mask_datagen = ImageDataGenerator(**data_gen_args)
    
    # 为 fit 和 flow 函数提供相同的种子和关键字参数
    seed = 1
    image_datagen.fit(images, augment=True, seed=seed)
    mask_datagen.fit(masks, augment=True, seed=seed)
    
    image_generator = image_datagen.flow_from_directory(
        'data/images',
        class_mode=None,
        seed=seed)
    
    mask_generator = mask_datagen.flow_from_directory(
        'data/masks',
        class_mode=None,
        seed=seed)
    
    # 将生成器组合成一个产生图像和蒙版(mask)的生成器
    train_generator = zip(image_generator, mask_generator)
    
    model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=50)
    
  • ImageDataGenerator 类方法:

    • apply_transform
      • 根据给定的参数将变换应用于图像。
    • fit
      • 将数据生成器用于某些示例数据。它基于一组样本数据,计算与数据转换相关的内部数据统计。当且仅当 featurewise_centerfeaturewise_std_normalizationzca_whitening 设置为 True 时才需要。
    • flow
      • 采集数据和标签数组,生成批量增强数据。
    • flow_from_directory
    • get_random_transform
      • 为转换生成随机参数。
    • random_transform
      • 将随机变换应用于图像。
    • standardize
      • 将标准化配置应用于一批输入。