Ошибка загрузки и обучения на наборе данных “Команды речи” Tensorflow

Вопрос или проблема

Я пытаюсь воспроизвести самую базовую версию этого примера Google LEAF. У меня возникли проблемы с загрузкой набора данных команд речи в Tensorflow. Я загружаю наборы данных как TFRecord:

tfds.load('speech_commands', download='true', shuffle_files="false")

Затем я применяю эту функцию предварительной обработки к наборам данных для обучения, тестирования и оценки:

def preprocess(sample):
    audio = sample['audio']
    label = sample['label']

    audio = tf.cast(audio, tf.float32) / tf.int16.max
    return audio, label

После этого я создаю свою модель и пытаюсь обучаться на наборе данных для обучения:

#Модель из leaf_audio/models
model = models.AudioClassifier(num_outputs=12)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer = tf.keras.optimizers.Adam(1e-4), metrics=['sparse_categorical_accuracy'])
model.fit(train_dataset, batch_size=None, epochs=10)

При обучении я получаю ошибку в слое Audio Classifier:

ValueError: Исключение возникло при вызове слоя “sequential” (тип Sequential). Вход 0 слоя “global_max_pooling2d” несовместим со слоем: ожидалось ndim=4, найден ndim=2. Полная форма: (None, 16000)

Я думаю, что это связано с тем, что я неправильно загружаю данные, однако я следовал примеру до строки в каждом из этапов загрузки.

Для полного кода, пожалуйста, перейдите по ссылке.

Проблема заключалась в том, что входной тензор (‘audio’) не предоставляет достаточно измерений для использования аудиоклассификатором.

Решение заключается в добавлении дополнительных измерений, используя эту строку в конце функции предварительной обработки:

audio = audio[tf.newaxis, tf.newaxis, :]

Ответ или решение

Ошибка загрузки и обучения на датасете "Speech Commands" в TensorFlow

Загрузка и обучение моделей на основе аудиоданных могут представлять определенные сложности, особенно при работе с высокоуровневыми библиотеками, такими как TensorFlow. В этом ответе мы рассмотрим распространенную проблему, связанную с загрузкой и предварительной обработкой датасета "Speech Commands", а также представим решение, которое позволит устранить возникшую ошибку.

Описание проблемы

При попытке обучить модель, основанную на примере из репозитория Google LEAF, вы столкнулись с ошибкой:

ValueError: Exception encountered when calling layer "sequential" (type Sequential).
Input 0 of layer "global_max_pooling2d" is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: (None, 16000)

Эта ошибка появляется на этапе обучения модели, когда входной тензор (‘audio’) не имеет необходимого количества измерений, необходимых для обработки в слое global_max_pooling2d. Для корректной работы этот слой ожидает 4D тензор, но получает 2D тензор из-за некорректной обработки аудиоданных.

Решение

Чтобы решить эту проблему, необходимо модифицировать функцию предобработки данных. Ваша исходная функция preprocess выглядит следующим образом:

def preprocess(sample):
    audio = sample['audio']
    label = sample['label']

    audio = tf.cast(audio, tf.float32) / tf.int16.max
    return audio, label

В этом коде аудиоданные имеют форму (None, 16000), которая является 2D тензором. Для правильной передачи этих данных в модель, необходимо добавить дополнительные измерения. Конкретно, мы можем сделать это, добавив два новых измерения в конце операции с аудио. Модифицированная версия функции preprocess должна выглядеть следующим образом:

def preprocess(sample):
    audio = sample['audio']
    label = sample['label']

    audio = tf.cast(audio, tf.float32) / tf.int16.max
    audio = audio[tf.newaxis, tf.newaxis, :]  # Добавление новых измерений
    return audio, label

Теперь после этой модификации функция возвращает аудиоданные в форме 4D тензора, которая подходит для обработки слоем global_max_pooling2d.

Обучение модели

После внесения изменений в функцию предобработки, вы можете продолжить с созданием и обучением вашей модели, используя следующие строки кода:

model = models.AudioClassifier(num_outputs=12)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(loss=loss_fn, optimizer=tf.keras.optimizers.Adam(1e-4), metrics=['sparse_categorical_accuracy'])
model.fit(train_dataset, batch_size=None, epochs=10)

Эти шаги должны исправить возникшую ошибку, и ваш процесс обучения сможет завершиться успешно.

Заключение

Работа с аудиоданными в TensorFlow требует особого внимания к формату и размерности тензоров. Мы рассмотрели, как конкретная ошибка возникает из-за недостаточного количества измерений в входных данных и предложили решение, которое поможет вам правильно настроить предобработку данных. Подобные проблемы часто встречаются при работе с различными типами данных, и умение быстро их диагностировать и исправлять — ключ к успешному обучению моделей.

Оцените материал
Добавить комментарий

Капча загружается...