Что касается точности с плавающей запятой, делегат TFLite GPU на Android может работать в двух режимах, которые вы можете выбрать с помощью следующего метода в классе Options
. (скопировано из здесь )
/**
* Sets whether precision loss is allowed.
*
* @param precisionLossAllowed When `true` (default), the GPU may quantify tensors, downcast
* values, process in FP16. When `false`, computations are carried out in 32-bit floating
* point.
*/
public Options setPrecisionLossAllowed(boolean precisionLossAllowed) {
this.precisionLossAllowed = precisionLossAllowed;
return this;
}
Поскольку значение по умолчанию для этой опции precisionLossAllowed
- true
, ваша модель будет работать в режиме FP16 при использовании графического процессора по умолчанию. Если вы хотите принудительно запустить режим FP32, как в CPU, вы должны явно установить для этого параметра значение false
при создании делегата.
GpuDelegate.Options gpuOptions = new GpuDelegate.Options();
gpuOptions.setPrecisionLossAllowed(false);
GpuDelegate gpuDelegate = new GpuDelegate(gpuOptions);
Interpreter.Options interpreterOptions = new Interpreter.Options();
interpreterOptions.addDelegate(gpuDelegate);
Interpreter interpreter = new Interpreter(tflite_model_file, interpreterOptions);
Это должно дать вам тот же результат, что и в режиме CPU, но приводит к более медленному выполнению по сравнению с режимом FP16.