gpt4 book ai didi

python - 自定义数据生成器

转载 作者:太空狗 更新时间:2023-10-30 00:58:14 25 4
gpt4 key购买 nike

我有一个自定义文件,其中包含我所有图像的路径及其标签,我使用以下方法将其加载到数据框中:

MyIndex=pd.read_table('./MySet.txt')

MyIndex 有两列感兴趣 ImagePathClassName

接下来我进行一些训练测试拆分并将输出标签编码为:

images=[]
for index, row in MyIndex.iterrows():
img_path=basePath+row['ImageName']
img = image.load_img(img_path, target_size=(299, 299))
img_path=None
img_data = image.img_to_array(img)
img=None
images.append(img_data)
img_data=None


images[0].shape

Classes=Sample['ClassName']
OutputClasses=Classes.unique().tolist()

labels=Sample['ClassName']
images=np.array(images, dtype="float") / 255.0
(trainX, testX, trainY, testY) = train_test_split(images,labels, test_size=0.10, random_state=42)
trainX, valX, trainY, valY = train_test_split(trainX, trainY, test_size=0.10, random_state=41)

images=None
labels=None

encoder = LabelEncoder()
encoder=encoder.fit(OutputClasses)
encoded_Y = encoder.transform(trainY)
# convert integers to dummy variables (i.e. one hot encoded)
trainY = to_categorical(encoded_Y, num_classes=len(OutputClasses))

encoded_Y = encoder.transform(valY)
# convert integers to dummy variables (i.e. one hot encoded)
valY = to_categorical(encoded_Y, num_classes=len(OutputClasses))

encoded_Y = encoder.transform(testY)
# convert integers to dummy variables (i.e. one hot encoded)
testY = to_categorical(encoded_Y, num_classes=len(OutputClasses))

datagen=ImageDataGenerator(rotation_range=90,horizontal_flip=True,vertical_flip=True,width_shift_range=0.25,height_shift_range=0.25)
datagen.fit(trainX,augment=True)

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


batch_size=128
model.fit_generator(datagen.flow(trainX,trainY,batch_size=batch_size), epochs=500,
steps_per_epoch=trainX.shape[0]//batch_size,validation_data=(valX,valY))

我面临的问题是一次性加载的数据太大,无法容纳当前的机器内存,因此我无法使用完整的数据集。

我曾尝试使用数据生成器,但不想遵循它遵循的目录约定,也无法消除扩充部分。

问题是有没有办法从磁盘加载批处理以确保两个规定的条件。

最佳答案

我相信你应该看看这个 post

您正在寻找的是 Keras flow_from_dataframe,它可以让您通过在数据框中提供文件名称及其标签并提供顶级目录路径来从磁盘加载批处理包含您的所有图片

在您的代码中进行一些修改并从共享的链接中借用一些:

MyIndex=pd.read_table('./MySet.txt')

Classes=MyIndex['ClassName']
OutputClasses=Classes.unique().tolist()

trainDf=MyIndex[['ImageName','ClassName']]
train, test = train_test_split(trainDf, test_size=0.10, random_state=1)


#creating a data generator to load the files on runtime
traindatagen=ImageDataGenerator(rotation_range=90,horizontal_flip=True,vertical_flip=True,width_shift_range=0.25,height_shift_range=0.25,
validation_split=0.1)
train_generator=traindatagen.flow_from_dataframe(
dataframe=train,
directory=basePath,#the directory containing all your images
x_col='ImageName',
y_col='ClassName',
class_mode='categorical',
target_size=(299, 299),
batch_size=batch_size,
subset='training'
)
#Also a generator for the validation data
val_generator=traindatagen.flow_from_dataframe(
dataframe=train,
directory=basePath,#the directory containing all your images
x_col='ImageName',
y_col='ClassName',
class_mode='categorical',
target_size=(299, 299),
batch_size=batch_size,
subset='validation'
)


STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=val_generator.n//val_generator.batch_size
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit_generator(generator=train_generator, steps_per_epoch=STEP_SIZE_TRAIN,
validation_data=val_generator,
validation_steps=STEP_SIZE_VALID,
epochs=500)

另请注意,现在您不需要像在原始代码中那样对标签进行编码,并且还省略了图像加载代码。

我没有尝试过此代码本身,因此请尝试修复您可能遇到的任何错误,因为主要重点是为您提供基本思想。

回应您的comment :如果您将所有文件放在不同的目录中,那么一种解决方案是让您的 ImagesName 存储相对路径,包括路径中的中间目录,例如“./Dir/File.jpg”,然后将所有目录移动到一个文件夹并使用一个作为基本路径,其他一切都保持不变。还要查看加载文件的代码段,看起来您已经将文件路径存储在 ImageName 列中,因此建议的方法应该适合您。

images=[]
for index, row in MyIndex.iterrows():
img_path=basePath+row['ImageName']
img = image.load_img(img_path, target_size=(299, 299))
img_path=None
img_data = image.img_to_array(img)
img=None
images.append(img_data)
img_data=None

如果仍然存在歧义,请随时再次询问。

关于python - 自定义数据生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56805843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com