根据keras文档:
preprocessing_function:每个输入将隐含的函数。该功能将在调整图像大小和扩大后运行。该函数应采用一个参数:一张图像(秩为3的Numpy张量),并输出具有相同形状的Numpy张量。
我的numpy张量为5级,因为我的输入图像具有3个维度(高度,宽度,深度)。
from keras.preprocessing.image import ImageDataGenerator
label_datagen = ImageDataGenerator()
train_label_generator = label_datagen.flow_from_directory(
directory="some_directory",
target_size=(32, 32, 32),
color_mode='grayscale',
class_mode=None,
batch_size=4)
当我检查第一批时,我得到了5D numpy张量:
first_item = train_image_generator.__getitem__(0)
>>>print('first_item.shape')
(4, 32, 32, 32, 1)
现在我首先要对每个输入图像进行简单的操作,我还要通过打印来检查输入形状:
def some_function(arr):
print(arr.shape)
arr += 1
return arr
在这里,我将此函数添加到ImageDataGenerator中:
label_datagen = FixedImageDataGenerator(preprocessing_function=some_function)
这就是我得到的输入形状
(32, 32, 1)
这意味着它实际上仅限于等级3。您知道如何修改它,以使输入形状为(32, 32, 32)
吗?
我的目标是对ImageDataGenerator中的每个输入使用to_categorical
函数。我不能在进行语义分割(不是图像分类)时简单地说class_mode="categorical"
。我知道我可以为此目的为生成器编写一些自定义代码,但是我想知道修改keras ImageDataGenerator是否困难。
答案 0 :(得分:1)
ImageDataGenerator
是图片的generator
。
这意味着,要使其正常工作,您的数据应为具有1(灰度)或3通道(rgb)的图像。我认为这不适用于您的4-D图像(除非深度等于1或3)。
答案 1 :(得分:1)
您可以像平常一样使用ImageDataGenerator
,但是在最后一步,不要传递preprocessing_function
,而是将生成器包装在自己的生成器中。这样,您就可以完全控制预处理功能。这意味着其输出不再必须具有与输入相同的形状。请注意,此包装器函数将批量获取数据,而不是单个图像。
例如:
def preprocess(generator):
for batch in generator:
yield batch[:,1:-1,1:-1] # example: crop 1 px of each border
现在改为使用preprocess(label_datagen)
。我希望您可以使用它来规避限制。