Проблема с многослойной классификацией - PullRequest
0 голосов
/ 27 сентября 2019

Я следовал этому руководству: https://medium.com/@vijayabhaskar96/multi-label-image-classification-tutorial-with-keras-imagedatagenerator-cd541f8eaf24 и написал часть своего кода для классификации с несколькими метками.У меня была небольшая работа с одноразовым кодированием, но мне пришлось перейти к варианту 2, упомянутому в статье, потому что у меня 6000 классов, и поэтому одно горячее не было жизнеспособным.Мне удалось обучить сеть, и она показала 99% точности и 83% f1.Однако, когда я пытаюсь протестировать сеть, для каждого изображения выводится некоторая комбинация только из 3 меток, когда существует 6000 возможных меток.Я задавался вопросом, может быть, код для тестирования модели был неправильным.Я попытался использовать код, упомянутый в посте, и он не работает:

test_generator.reset()
pred = model.predict_generator(test_generator, steps=STEP_SIZE_TEST, verbose=1);
pred_bool = (pred > 0.5)

неупорядоченный types: list() > float()

Я пытался исправить это ине понял, и я не могу найти примеры в Интернете, кто-то делает что-то подобное.Кто-нибудь имеет представление о том, как заставить эту часть предсказания работать с использованием этого блока кода (у меня было это с двумя другими вариантами, и у меня возникали проблемы с печатью одной или нескольких меток), или почему модель может не работать с таким поведением?

РЕДАКТИРОВАТЬ: для большего контекста по вопросу обучения, вот весь обучающий код:

import json
input_file = open ('class_names_6000.json')
json_array = json.load(input_file)
#print(str(json_array))

args = parser.parse_args()
gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
print('Loading Data...')
df = pd.read_csv('dataset_train.csv')
df["labels"]=df["labels"].apply(lambda x:x.split(","))
datagen=ImageDataGenerator(rescale=1./255.)
test_datagen=ImageDataGenerator(rescale=1./255.)
train_generator=datagen.flow_from_dataframe(
dataframe=df,
directory="",
x_col="Filepaths",
y_col="labels",
batch_size=128,
seed=42,
shuffle=True,
class_mode="categorical",
classes=json_array,
target_size=(100,100))

df = pd.read_csv('dataset_test.csv')
df["labels"]=df["labels"].apply(lambda x:x.split(","))
test_generator=test_datagen.flow_from_dataframe(
dataframe=df,
directory="",
x_col="Filepaths",
y_col="labels",
batch_size=128,
seed=42,
shuffle=True,
class_mode="categorical",
classes=json_array,
target_size=(100,100))

df = pd.read_csv('dataset_validation.csv')
df["labels"]=df["labels"].apply(lambda x:x.split(","))
valid_generator=test_datagen.flow_from_dataframe(
dataframe=df,
directory="",
x_col="Filepaths",
y_col="labels",
batch_size=128,
seed=42,
shuffle=True,
class_mode="categorical",
classes=json_array,
target_size=(100,100))
print('Data Loaded.')

f1_score_callback = ComputeF1()
model = build_model('train', numclasses=len(json_array), model_name = args.model)

ImageFile.LOAD_TRUNCATED_IMAGES = True

Кроме того, важная деталь, когда обучение говорит, что точность составляет 99%и оценка f1 составляет 84%, а оценка f1 также составляет 84%.

...