不同的预测:Keras与Android + DL4J

时间:2018-09-26 11:56:15

标签: android keras deeplearning4j dl4j

将Python(3.5.5)+ Keras(版本2.0.8)在GPU上训练的神经网络的输出与Android(API 24)上相同神经网络的输出进行比较时,我会遇到截然不同的预测结果)使用DL4J(1.0.0-beta2)。

如果有人可以分享如何解决此问题的经验,那将非常有帮助,谢谢!

将模型导入Android

通过使用以下命令导入神经网络,将其转换为DL4J格式:

MultiLayerNetwork model = KerasModelImport.importKerasSequentialModelAndWeights(SIMPLE_MLP, false)

并使用DL4Js ModelSerializer 进行存储。

使用DL4J方法 restoreMultiLayerNetwork()

将模型导入Android应用程序

模型输出

神经网络旨在对输入形状固定的图像进行预测:高度,宽度,3个通道固定。

Android中的图像预处理管道:

图像从设备作为输入流加载并存储在INDarray中:

AndroidNativeImageLoader loader = new AndroidNativeImageLoader(100, 100, 3);

InputStream  inputStream_bitmap = getContentResolver().openInputStream(uri);
INDArray indarray1 = loader.asMatrix(inputStream_bitmap);

AndroidNativeImageLoader()加载并重新缩放图像。

将INDarray'indarray1'重新缩放为包含[0,1]范围内的值:

indarray1 = indarray1.divi(255);

INDarray通过网络传递以计算输出:

INDArray output = model.output(indarray1);

Python中的图像预处理管道:

from keras.preprocessing import image
from keras.utils import np_utils
import numpy as np

img = image.load_img(img_path, target_size=(100, 100))
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)
img = img.astype('float32')/255

output = model.predict(img)

问题:

使用Python和Keras进行的预测与使用DL4J进行Android进行的预测显着不同。输出是2个值的数组,每个值的浮点数都为[0,1]。 相机拍摄的正常.bmp图片的预测差异在此输出数组的每个元素上最多为0.99。

到目前为止已完成的测试:

当使用单色.bmp图像(仅红色或仅蓝色或仅绿色或全白色)时,两种环境的预测结果几乎相同。它们之间的差异仅10e-3,这可以通过在GPU上进行培训并在CPU上进行应用来解释。

结论: 到目前为止,我相信Android上的图像预处理与Python中的预处理不同,因为单色图片的模型输出是相同的。

有人遇到过类似的问题吗?任何帮助深表感谢!

1 个答案:

答案 0 :(得分:1)

DL4J和Android使用BGR而不是RGB。因此,必须执行颜色格式转换。

在此Github帖子中,Kudos转到@saudet:

https://github.com/deeplearning4j/deeplearning4j/issues/6495

NativeImageLoader需要通过此转换加载:

loader = new NativeImageLoader(100, 100, 3, new ColorConversionTransform(COLOR_BGR2RGB));