У меня есть несколько файлов WAV с 16-битной глубиной/точностью. torchaudio.info(...)
признает это, давая мне:
precision = {int} 16
Тем не менее, когда я использую torchaudio.load(...)
, я получаю float32
dtype для результирующего тензора.
С тензором под названием audio
я знаю, что могу сделать audio.half()
, чтобы урезать его до 16 бит, уменьшив использование памяти моего набора данных. Но сохранит ли эта операция точность всех возможных исходных значений? Я не снижаю точность dtype ниже точности исходного звука, но может быть веская причина, о которой я не знаю, почему torchaudio
все еще возвращает float32
.
Я бы сказал, что он возвращается как float32, потому что это тип данных pytorch по умолчанию. Поэтому, если вы создадите какие-либо модели с весами, они также будут float32. Следовательно, входные данные будут несовместимы с моделью, если вы выполните преобразование входных данных. (E: или он все равно автоматически преобразует ваши данные в 32-битные, чтобы сделать их совместимыми с вашей моделью. Не уверен, какой pytorch выберет, но tensorflow определенно выдает ошибку).
Посмотрите на установку типа данных по умолчанию на float16, прежде чем создавать какие-либо модели, если вы хотите создавать небольшие модели: https://pytorch.org/docs/stable/generated/torch.set_default_dtype.html
ОДНАКО обратите внимание, что вы потеряете 5 бит точности, если преобразуете 16-битное целое число, поскольку вы диагностировали, что число на самом деле (но представлено как 32-битное число с плавающей запятой) в 16-битное число с плавающей запятой. Это связано с тем, что в экспоненте используются 5 бит точности, оставляя только 10 бит для представления десятичной части, представляющей число.
Я бы просто оставил его на float32, если вы не особенно ограничены в памяти.
int 16 — это 1 бит знака и 15 бит двоичных цифр. float32 — это 1 знаковый бит, 8 для экспоненты и 23 оставшихся для цифр. Так что мне кажется, что вы можете уместить 15 исходных битов в 23-битный блок чисел с запасными битами. По-моему, без потери точности.
Спасибо за ответ, никогда не понимал, что базовые значения в формате WAV на самом деле были
int16
. Похоже, процесс преобразования этого числа в число с плавающей запятой называется нормализацией. Я буду придерживатьсяfloat32
, но может ли это идеально представлять всеint16
? Или он все еще теряет некоторую точность, но намного меньше, чемfloat16
?