我有一个自定义文件,其中包含我所有图像的路径及其标签,这些文件的加载方式如下:
MyIndex=pd.read_table('./MySet.txt')
Run Code Online (Sandbox Code Playgroud)
MyIndex具有两个感兴趣的列ImagePath和ClassName
接下来,我进行一些训练测试拆分并将输出标签编码为:
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))
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,一次加载的数据太大,无法容纳当前的计算机内存,因此我无法使用完整的数据集。
我尝试使用数据生成器,但不希望遵循其遵循的目录约定,而且也无法消除扩展部分。
问题是,有一种方法可以从磁盘上加载批处理,以确保满足上述两个条件。
我相信你应该看看这篇文章
您正在寻找的是 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)
Run Code Online (Sandbox Code Playgroud)
另请注意,现在您不需要像原始代码中那样对标签进行编码,并且还可以省略图像加载代码。
我还没有尝试过这段代码本身,所以尝试修复您可能遇到的任何错误,因为主要重点是向您提供基本想法。
回应您的评论:如果您的所有文件都位于不同的目录中,那么一种解决方案是让您的 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
Run Code Online (Sandbox Code Playgroud)
如果仍然存在歧义,请随时再次询问。
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |