Вкл. float32
точность
float32
- тип значения по умолчанию, используемый в TensorFlow.Давайте немного поговорим о типе float32
и важности порядка операций.В основном, есть аккуратная таблица из этого поста , которая показывает, как точность плавания изменяется с увеличением величины:
Float Value Float Precision
1 1.19E-07
10 9.54E-07
100 7.63E-06
1,000 6.10E-05
10,000 0.000977
100,000 0.00781
1,000,000 0.0625
10,000,000 1
100,000,000 8
1,000,000,000 64
Что это говорит?В float32
вы не можете ожидать, что у вас будут точные значения, у вас будут только точки дискретизации, которые , надеюсь, близки к реальному значению.Чем больше значение, тем менее близко вы можете быть к нему.
Вы можете узнать больше о IEEE 754 single precision format
здесь , здесь и здесь , и вы даже можете узнать больше об этом в Google.
Теперь вернемся к TF-Lite
Какое преобразование из TensorFlow в TF-Lite связано с вышеуказанным свойством float32
?Рассмотрим следующую ситуацию:
sum_1 = a_1 + a_2 + a_3 + a_4 + ... + a_n
sum_2 = a_2 + a_1 + a_4 + a_3 + ... + a_n
т.е. sum_1
и sum_2
отличаются только порядком суммирования.Будут ли они равны? может быть, а может и нет !То же самое для других операций накопления, например, умножения, свертки и т. Д. Это ключ: в float32
расчете, порядок имеет значение !(это похоже на проблему, когда расчеты одной и той же модели на CPU и GPU немного отличаются).Я сталкивался с этой проблемой бесчисленное количество раз при переносе между фреймворками (caffe, tenorflow, torch и т., вы получите ошибку 1e-5
, максимум 1e-4
.Это приемлемо для поплавков одинарной точности, так что не беспокойтесь об этом.