如何映射从数据生成器构建的 keras 模型的预测输出 (flow_from_directories)

How to map prediction output of keras model built from data generator (flow_from_directories)

我有两个 CSV 文件,“train.csv”和“test.csv”,看起来像这样

Image_ID Target
ID_7xd1 0
ID_8xk1 1

这是 train.csv 的示例,在 test.csv 中,我只有 Image_ID 列,目标是使用提供的图像预测其目标。图片文件夹如下

Images
├── test
│   ├── ID_12ls.tif
│   └── ID_1sfk.tif
│   └── ...
└── train
    ├── 0
    │   ├── ID_7xd1.tif
    │   └── ID_9xd0.tif
    │   └──...
    └── 1
        ├── ID_0xkd0.tif
        └── ID_8xdk1.tif
        └── ...

train.csv 和 test.csv 中的每个 Image_ID 代表一个图像,并通过图像本身的名称进行跟踪。因为我有很多图片所以我决定使用 Keras ImageDataGenerator.flow_from_directories

# data generators
datagen_train = ImageDataGenerator(rescale=1./255, validation_split=0.2, )
datagen_test = ImageDataGenerator(rescale=1./255)

# load and iterate training dataset
train_it = datagen_train.flow_from_directory('train/', target_size= (224, 224), class_mode='binary', batch_size=64, seed=0, subset='training')

# load and iterate validation dataset
val_it = datagen_train.flow_from_directory('train/', target_size= (224, 224), class_mode='binary', batch_size=64, seed=0, subset='validation')

# load and iterate test dataset
test_it = datagen_test.flow_from_directory('test/', target_size = (224, 224), class_mode=None, batch_size=1, seed=0)

型号

model2 = Sequential()
model2.add(Conv2D(32,3,padding="valid", activation="relu", input_shape=(224,224,3)))
model2.add(MaxPool2D())
model2.add(Dropout(0.4))

model2.add(Flatten())
model2.add(Dense(128,activation="relu"))
model2.add(Dense(1, activation="sigmoid"))

opt = tf.keras.optimizers.Adam(lr=0.000001)
model2.compile(optimizer = opt , loss = 'binary_crossentropy' , metrics = ['accuracy'])

# callbacks
mc_loss = ModelCheckpoint('model2svd.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)

history2 = model2.fit_generator(generator=train_it, steps_per_epoch=step_size_t, validation_data= val_it, validation_steps=step_size_v,
                               epochs=100, shuffle=True, callbacks=[mc_loss])

问题

现在,在使用 model.fit_generator() 训练模型后,我使用 model.predict_generator() 对测试数据集进行了预测。它给了我 1,m 数组,其中 m 是总示例。

问题是如何将此输出映射到我的 test.csv Image_ID。或者输出的顺序是test.csv的Image_ID.

如果您需要更多详细信息,请告诉我

在您的测试生成器中设置 shuffle=False。此外 model.predict_generator 已贬值,因此只需使用 model.predict。现在在 test generaotr 中使用 shuffle=False,您可以按照它们被处理的顺序获得预测图像文件的序列

test_files=test_it.filenames

确保您在确定测试批量大小和测试步骤后准确地完成测试集样本,以便 test_batch_size X test_steps= 测试样本数 使用以下代码:

length=len(test_files)
test_batch_size=sorted([int(length/n) for n in range(1,length+1) if length % n ==0 and length/n<=80],reverse=True)[0]  
test_steps=int(length/test_batch_size)
print ( 'test batch size: ' ,test_batch_size, '  test steps: ', test_steps)

然后做

preds=model.predict(test_it, batch_size=test_batch_size, steps=test_steps)

然后遍历 preds

labels=[]
for  p in preds:    
    if p > .5:
        label=1
    else:
        label=0
    labels.append(label)
Fseries=pd.Series(test_files, name='Image Id')
Lseries=pd.Series(labels, name='Target')
predictions_df= pd.concat([Fseries, Lseries], axis=1)

print (predictions_df.head())