Я практикую классификацию пикселей изображения Landsat, используя классификаторы DNN в Tensorflow. Создание модели в порядке, и затем я устанавливаю предиктор для классификации тестового изображения. Тестовое изображение размером 2048x3072 пикселей, сохраненное в формате TFRecord с размером патча 256x256. В функции ввода предиктора набор данных соответствующим образом упакован, и я ожидаю, что предиктор будет делать целую партию, прогнозируемую на своем выходе, каждый раз, когда я повторяю ее.
def predict_input_fn(fileNames):
def parse_image(example_proto):
parsed_features = tf.parse_single_example(example_proto, imageFeaturesDict)
return parsed_features
dataset = tf.data.TFRecordDataset(fileNames, compression_type='GZIP')
dataset = dataset.map(parse_image)
dataset = dataset.batch(PATCH_WIDTH * PATCH_HEIGHT)
iterator = dataset.make_one_shot_iterator()
return iterator.get_next()
Я передаю функцию предиктору:
predictions = classifier.predict(input_fn=lambda: predict_input_fn(fileNames))
И итерации по прогнозам и генерация массива классифицированных меток:
for pred_dict in predictions:
... fill up the image array ...
Моя проблема в том, что когда я запускаю код, я вижу, что возвращенный pred_dict содержит только один пиксель. Я посмотрел на проблему и нашел переключатель yield_single_examples
в вызове classifier.predict
и установил его на False
. Это должно сделать возвращенный pred_dict патчем пикселей, и я могу заполнить массив изображений одним патчем за раз вместо одного пикселя.
Я пробовал использовать как однопиксельные, так и пакетные пиксели, но разница между временем работы была невелика (280 с против 300 с). Есть ли способ получить больше скорости? Правда ли, что в пакетном случае предиктор генерирует целое поле с метками за раз, или он все еще делает это попиксельно?