Как использовать sample_weight для маскировки определенных меток в Keras - PullRequest
0 голосов
/ 09 июля 2019

Я хочу выполнить классификацию изображений временных рядов Landsat с помощью модуля ConvLSTM2D в Keras.Итак, у меня есть серия 6-полосных патчей для изображений (скажем, размером 30x30 пикселей), каждая для своего времени наблюдения.Я хочу использовать все пространственные и временные данные, поэтому я собираюсь использовать ConvLSTM2D и снабжать его сериями изображений.Основной правдой будет еще одна карта размером 30x30, каждый пиксель должен иметь метку из 4 возможных значений, которые кодируются в горячем виде в векторе длины 4. Но основная проблема заключается в том, что некоторые пиксели неиметь действительные метки (например, из-за облачного пикселя или других проблем с качеством).Таким образом, карта будет представлять собой смесь истинных меток (значения 1-4) и недопустимых пикселей (которые закодированы в один горячий вектор всех нулевых значений).

Я думал использовать опцию class_weight для решениясначала эта проблема, но я получаю сообщение об ошибке, утверждая, что она не поддерживается для тензоров 3D +.Поэтому я решил использовать sample_weight.Тем не менее, я очень скептически отношусь, если моя реализация верна.Он работает без ошибок, но результат далек от удовлетворения.

Здесь представлена ​​структура сети, трехуровневая сеть с 16 фильтрами на каждом уровне и сверточным размером ядра 3x3.Первые два слоя проходят последовательности, но последний выводит только один трехмерный тензор размером 30x30x16.Затем я использую сверточный слой с 4 фильтрами и активацией softmax, чтобы сгенерировать 4 карты, соответствующие каждой метке.Чтобы замаскировать недопустимые метки, я изменяю выходной тензор с 30x30x4 на 900x4 (иначе Keras не сможет использовать sample_weight):

inputs = Input(shape=(None, 30, 30, 6))
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=True, data_format='channels_last')(inputs)
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=True, data_format='channels_last')(x)
x = ConvLSTM2D(filters=16, kernel_size=(3,3), padding='same', return_sequences=False, data_format='channels_last')(x)
x = Conv2D(filters=4, kernel_size=(3,3), padding='same', data_format='channels_last', activation='softmax')(x)
outputs = Reshape((30*30,4))(x)

Я использую наборы данных Tensorflow для подачи в сеть, и мой набор данных генерирует карту данныхпоследовательность, карта меток и карта «маска», которая имеет 1 для действительных пикселей метки и 0 для недопустимых.Я также добавляю sample_weight_mode="temporal" в оператор компиляции модели.Я предполагаю, что при таком расположении тензор-поток / кера будет использовать веса, как и ожидалось.Но, как я упоминал выше, результат не является удовлетворительным (низкая точность), и я не уверен, что приведенная выше реализация верна.Я не имею ни малейшего представления, как отладить эту проблему.

И только один основной вопрос: работают ли весовые коэффициенты выборок для взвешивания выходных выборок перед вычислением функции потерь, или он взвешивает входные значения изНачните?Поскольку все говорили, что class_weight можно заменить на sample_weight, я думаю, это означает, что sample_weight применяется только на последнем этапе перед вычислением функции потерь (обоснование для последнего слоя Reshape), я прав?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...