keras_5_数据预处理
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]]))
-
-
pad_sequences
- 将多个序列截断或补齐为相同长度。该函数将一个
num_samples
的序列(整数列表)转化为一个 2D Numpy 矩阵,其尺寸为(num_samples, num_timesteps)
。num_timesteps
要么是给定的maxlen
参数,要么是最长序列的长度。 - 比
num_timesteps
短的序列将在末端以value
值补齐。向前补齐为默认操作。 - 比
num_timesteps
长的序列将会被截断以满足所需要的长度。补齐或截断发生的位置分别由参数pading
和truncating
决定。
- 将多个序列截断或补齐为相同长度。该函数将一个
-
skipgrams
- 生成 skipgram 词对。该函数将一个单词索引序列(整数列表)转化为以下形式的单词元组:
- (单词, 同窗口的单词),标签为 1(正样本)。
- (单词, 来自词汇表的随机单词),标签为 0(负样本)。
- 生成 skipgram 词对。该函数将一个单词索引序列(整数列表)转化为以下形式的单词元组:
-
make_sampling_table
-
生成一个基于单词的概率采样表。用来生成
skipgrams
的sampling_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. 文本预处理
- Tokenizer
- 文本标记实用类。该类允许使用两种方法向量化一个文本语料库: 将每个文本转化为一个整数序列(每个整数都是词典中标记的索引); 或者将其转化为一个向量,其中每个标记的系数可以是二进制值、词频、TF-IDF权重等。
- 默认情况下,删除所有标点符号,将文本转换为空格分隔的单词序列(单词可能包含
'
字符)。 这些序列然后被分割成标记列表。然后它们将被索引或向量化。0
不会被分配给任何单词的保留索引。
- hashing_trick
- 将文本转换为固定大小散列空间中的索引序列。由于哈希函数可能发生冲突,可能会将两个或更多字分配给同一索引。 碰撞的概率与散列空间的维度和不同对象的数量有关。
- one_hot
- One-hot 将文本编码为大小为 n 的单词索引列表。
- 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_center
或featurewise_std_normalization
或zca_whitening
设置为 True 时才需要。
- 将数据生成器用于某些示例数据。它基于一组样本数据,计算与数据转换相关的内部数据统计。当且仅当
- flow
- 采集数据和标签数组,生成批量增强数据。
- flow_from_directory
- get_random_transform
- 为转换生成随机参数。
- random_transform
- 将随机变换应用于图像。
- standardize
- 将标准化配置应用于一批输入。
- apply_transform