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
      • 將標准化配置應用於一批輸入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM