将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中的预处理不同,因为单色图片的模型输出是相同的。
有人遇到过类似的问题吗?任何帮助深表感谢!
答案 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));