簡體   English   中英

如何獲取 ImageDataGenerator.flow_from_directory Keras 中的值列表?

[英]How to get list of values in ImageDataGenerator.flow_from_directory Keras?

我們可以使用 ImageDataGenerator 和 flow_from_directory 方法生成圖像數據集。 對於類的調用列表,我們可以使用 object.classes。 但是,如何調用值列表? 我已經搜索過,但仍然沒有找到。

謝謝:)

ImageDataGenerator 是一個 python 生成器,它每次都會生成一批形狀與模型輸入相同的數據(如(batch_size,width,height,channels) )。 生成器的好處是當你的數據集太大時,你不能把所有的數據都放在你有限的內存中,但是,有了生成器,你可以每次生成一批數據。 並且 ImageDataGenerator 與model.fit_generator(), model.predict_generator()

如果要獲取數字數據,可以使用生成器的next()函數:

import numpy as np    

data_gen = ImageDataGenerator(rescale = 1. / 255)

data_generator = datagen.flow_from_directory(
    data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='categorical')
data_list = []
batch_index = 0

while batch_index <= data_generator.batch_index:
    data = data_generator.next()
    data_list.append(data[0])
    batch_index = batch_index + 1

# now, data_array is the numeric data of whole images
data_array = np.asarray(data_list)

或者,您可以使用PILnumpy處理圖像:

from PIL import Image
import numpy as np

def image_to_array(file_path):
    img = Image.open(file_path)
    img = img.resize((img_width,img_height))
    data = np.asarray(img,dtype='float32')
    return data
    # now data is a tensor with shape(width,height,channels) of a single image.

然后,您可以使用此函數循環所有圖像以獲取數字數據。

注意,我建議您使用生成器而不是直接獲取所有數據,否則可能會耗盡內存。

“但是,如何調用值列表” - 如果我理解正確,我猜您想知道數據集中的所有文件 - 如果正確,(或者如果不正確),您可以通過多種方式獲取值從你的發電機:

  1. 使用 object.filenames。

Object.filenames 返回目標文件夾中所有文件的列表。 我只是使用 len(object.filename) 函數來獲取我的測試文件夾中的文件總數。 然后將該數字傳回我的生成器並再次運行它。

  1. 生成器

獲取測試文件夾中所有項目數量的其他方法是 generator.n

  1. x , y = test_generator.next() 加載我的數組和類(如果推斷)。 或 a = test_generator.next(),其中您的數組和類將作為元組返回。

我只使用它,因為我的測試數據集非常小(60 張圖像),並且我使用提取的特征來訓練和預測我的模型(即特征數組而不是圖像數組)。 如果您正在構建一個普通模型,使用生成器生成批次是更好的方法。

  1. 使用生成器創建函數
def generate_test_data_from_directory(folder_path, image_target_size = 224, batch_size = 5, channels = 3, class_mode = 'sparse' ): '''fetch all out test data from directory''' test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( folder_path , target_size = (image_target_size, image_target_size), batch_size = batch_size, class_mode = class_mode) total_images = test_generator.n steps = total_images//batch_size #iterations to cover all data, so if batch is 5, it will take total_images/5 iteration x , y = [] , [] for i in range(steps): a , b = test_generator.next() x.extend(a) y.extend(b) return np.array(x), np.array(y)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM