Я пытаюсь обучить нейронную сеть (классификатор) с помощью keras и преобразовать ее в формат coreml. Однако я получаю это сообщение об ошибке: The size of the output layer 'output' in the neural network does not match the number of classes in the classifier.
Я дважды проверил свои наборы данных для обучения и проверки с помощью: print train_generator.class_indices
print validation_generator.class_indices
Результат:
Using TensorFlow backend.
Found 2136 images belonging to 2 classes.
Found 60 images belonging to 2 classes.
{'ThumbsDown': 0, 'ThumbsUp': 1}
{'ThumbsDown': 0, 'ThumbsUp': 1}
Вот как я конвертирую свою модель:
ml_model = coremltools.converters.keras.convert(model, input_names = 'img' ,output_names= ['output'],predicted_feature_name ='classLabel',class_labels=['thumbsDown', 'thumbsUp'], image_input_names ='img')
Таким образом, наличие двух меток класса должно быть правильным. Что я делаю неправильно?
Когда я полностью удаляю аргумент class_labels, он работает, но я не получаю прогноза. Также вы правы насчет плотного слоя. Как я могу исправить эту проблему?
К сожалению, я не знаком с CoreML. Я просто догадался об этом по полученной вами ошибке и по предоставленным вами этикеткам. Также должен быть аргумент в пользу преобразования двоичных классификаторов. Я надеюсь, что кто-то, знакомый с CoreML, может вам помочь.
Поскольку вы знаете, почему возникает ошибка, можете ли вы подумать о возможном обходном пути?
Вы упомянули, что не получали прогнозов. Вы уверены? Вообще ничего? Я не знаю, как выполняется прогнозирование в CoreML, но в Keras, как вы, возможно, знаете, вы можете просто вызвать метод predict()
, и вы получите прогнозы. В случае двоичного классификатора прогноз будет одним единственным значением между нулем и единицей, которое соответствует вероятности принадлежности данного образца (ов) к положительному классу (то есть первому классу). Итак, если прогноз> 0,5, то он принадлежит к первому классу; в противном случае (т.е. прогноз <0,5) он будет принадлежать к отрицательному классу (нулевому классу). Таким образом, вы можете найти этикетку вручную.
Я предполагаю, что вы выполняете двоичную классификацию и, вероятно, у вас есть плотный слой с блоком один в качестве последнего слоя, верно? Если это так, то конвертер сбит с толку, поскольку вы присвоили ему две метки класса. Теперь, если вы полностью удалите аргумент
class_labels
, он все еще работает или это обязательный аргумент?