如何映射从数据生成器构建的 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())
我有两个 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())