【问题标题】:How to get list of values in ImageDataGenerator.flow_from_directory Keras?如何获取 ImageDataGenerator.flow_from_directory Keras 中的值列表?
【发布时间】:2017-12-04 03:45:03
【问题描述】:

我们可以使用 ImageDataGenerator 和 flow_from_directory 方法生成图像数据集。对于类的调用列表,我们可以使用 oject.classes。但是,如何调用值列表?我已经搜索了,但仍然没有找到。

谢谢:)

【问题讨论】:

  • 您能否更具体地说明您希望获得哪些值作为列表?
  • @petezurich :如果数据集是一组 rgb 图像,并且类是汽车、人类、狗等。我的意思是值列表是图像的 rgb 值列表。例如,我有 1000 张 25px*25px 的图像,它将是尺寸为:1000x25x25x3 的数组

标签: python deep-learning keras conv-neural-network


【解决方案1】:

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.

然后,您可以使用此函数循环所有图像以获取数字数据。

注意,我建议您使用生成器而不是直接获取所有数据,否则您可能会耗尽内存。

【讨论】:

  • 谢谢伙计!你是英雄:)
【解决方案2】:

'但是,如何调用值列表' - 如果我理解正确,我想你想知道你的数据集中的所有文件 - 如果这是正确的,(或者如果不是),你有多种方法可以从您的生成器中获取值:

  1. 使用 object.filenames。

Object.filenames 返回目标文件夹中所有文件的列表。我只是使用 len(object.filename) 函数来获取我的测试文件夹中的文件总数。然后将该数字传回我的生成器并再次运行它。

  1. generator.n

获取测试文件夹中所有项目数量的其他方法是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多