【问题标题】:Equivalent of 'class_indices' attribute of 'flow_from_directory' object in case of 'ImageDataGenerator' object在“ImageDataGenerator”对象的情况下,等效于“flow_from_directory”对象的“class_indices”属性
【发布时间】:2020-05-17 23:40:52
【问题描述】:

我正在关注https://medium.com/@vijayabhaskar96/tutorial-image-classification-with-keras-flow-from-directory-and-generators-95f75ebe5720的教程

我正在使用“ImageDataGenerator”对象并希望使用以下方法预测输出。

pred=model.predict_generator(test_generator,
steps=10,
verbose=1)

predicted_class_indices=np.argmax(pred,axis=1)

labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

但我正在使用 Keras 的“ImageDataGenerator”和“flow_from_dataframe”对象。 “ImageDataGenerator”没有“class_indices”属性。如何获取类的索引

【问题讨论】:

  • 我也有同样的问题。尽管有手册,但“flow_from_dataframe”对象没有“class_indices”属性。你是如何解决这个问题的?

标签: tensorflow keras deep-learning conv-neural-network


【解决方案1】:

使用ImageDataGenerator.flow_from_dataframe 并回答您的How can I get the indices of the classes 问题的端到端示例

from tensorflow.keras.models import Sequential
#Import from keras_preprocessing not from keras.preprocessing
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras import regularizers, optimizers
import pandas as pd
import numpy as np


def append_ext(fn):
    return fn+".png"
traindf=pd.read_csv("trainLabels.csv",dtype=str)
testdf=pd.read_csv("sampleSubmission.csv",dtype=str)
traindf["id"]=traindf["id"].apply(append_ext)
testdf["id"]=testdf["id"].apply(append_ext)
datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25)

train_generator=datagen.flow_from_dataframe(
dataframe=traindf,
directory="train/",
x_col="id",
y_col="label",
subset="training",
batch_size=32,
seed=42,
shuffle=True,
class_mode="categorical",
target_size=(32,32))

valid_generator=datagen.flow_from_dataframe(
dataframe=traindf,
directory="train/",
x_col="id",
y_col="label",
subset="validation",
batch_size=32,
seed=42,
shuffle=True,
class_mode="categorical",
target_size=(32,32))

test_datagen=ImageDataGenerator(rescale=1./255.)
test_generator=test_datagen.flow_from_dataframe(
dataframe=testdf,
directory="test/",
x_col="id",
y_col=None,
batch_size=32,
seed=42,
shuffle=False,
class_mode=None,
target_size=(32,32))

model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=(32,32,3)))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(optimizers.RMSprop(lr=0.0001, decay=1e-6),loss="categorical_crossentropy",metrics=["accuracy"])

STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size
STEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size
STEP_SIZE_TEST=test_generator.n//test_generator.batch_size
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    validation_data=valid_generator,
                    validation_steps=STEP_SIZE_VALID,
                    epochs=10
)

model.evaluate_generator(generator=valid_generator,
steps=STEP_SIZE_TEST)

test_generator.reset()
pred=model.predict_generator(test_generator,
steps=STEP_SIZE_TEST,
verbose=1)

predicted_class_indices=np.argmax(pred,axis=1)


labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

最后,我们print类如下所示:

print(predictions)

上面print语句的输出是:

['bird',
 'dog',
 'bird',
 'cat',
 'horse',
 'deer',
 'deer',
 'airplane',
 'cat',
 'cat',
 'ship',
 'bird',
 'automobile',..........]

更多信息请参考Vijaya Bhaskar撰写的这篇文章。

希望这会有所帮助。快乐学习!

【讨论】:

  • 谢谢,但我使用了相同的过程,除了 class_mode 我使用“原始”而不是“分类”,因为它不适用于许多类。当class_mode使用“raw”时,train_generator没有“class_indices”方法,该方法不起作用
猜你喜欢
  • 2023-03-31
  • 2019-07-06
  • 2016-08-16
  • 2017-01-24
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多