Разница в выходных данных между TensorFlow и TF-Lite - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть модель tensorflow, которую я преобразовал в tensorflow-lite.Но есть отклонение в точности вывода.Это нормальное поведение?

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

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вкл. 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.Это приемлемо для поплавков одинарной точности, так что не беспокойтесь об этом.

0 голосов
/ 07 декабря 2018

Во время обучения в TensorFlow,

  • Все переменные и константы могут быть в dtype = float64.Эти числа больше в десятичных разрядах.

  • Так как они обучающие переменные их значение не является постоянным.

После преобразования в TensorFlow lite,

  • Обучающие переменные преобразуются в постоянные операции. Их значения фиксированы

  • Когда мы запускаем облегченную модельна Android или iOS эти значения преобразуются в float32.

Следовательно, точность теряется в TensorFlow Lite.

...