Как я могу пакетировать набор данных Tensorflow, содержащий метки различной длины?

#python #tensorflow

Вопрос:

Я пытаюсь построить модель CNN для распознавания рукописного текста, обучая его набору данных IAM. Я добавил изображения в форму (150, 150, 3), и метки закодированы следующим образом:

 # ASCII Character list for encoding
characterList = [c for c in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%amp;'()* ,-./:;<=>?@[\]^{|}~']

# Mapping characters to integers
char_to_num = keras.layers.experimental.preprocessing.StringLookup(
    vocabulary=characterList, mask_token=None
)

# Mapping integers back to original characters
num_to_char = keras.layers.experimental.preprocessing.StringLookup(
    vocabulary=char_to_num.get_vocabulary(), mask_token=None, invert=True
)
 

Проблема, с которой я сталкиваюсь, заключается в том, что каждое входное изображение соответствует метке различной длины. например

  • «The» = [56, 18, 15]
  • «быстро» = [27, 31, 19, 13, 21]

И по этой причине я не могу пакетировать набор данных, выполнив

 train_df = tf.data.Dataset.from_tensor_slices((np.stack(df.X.values), df.y.values))
train_ds = train_ds.batch(batch_size)
 

который возвращает ошибку «Невозможно выполнить пакетирование тензоров с разными формами». Как я могу выполнить пакетную обработку объекта tf.Data.dataset?

df.X = ряд np.массива nd формы (150,150,3) df.y = ряд np.массива изменяемой длины, как обсуждалось выше.

Комментарии:

1. Как и в любой другой задаче НЛП, вы должны рассчитать количество уникальных символов в словаре, и это должно быть последним измерением ваших тензоров для каждого слова.

2. Вы можете работать с тряпичными тензорами .

3. @Priya Итак, я заполняю метки, например, 0, а затем, когда я вычисляю потерю ctc, я вычисляю длину без заполнения?

4. @Frightera Я пытался использовать неровные тензоры, но не смог обучить сеть, так как не могу вычислить потери ctc с их помощью.