ONNX在不同框架上的准确性如何

时间:2019-12-04 14:15:49

标签: c# python keras ml.net onnx

我使用Keras(Python)训练了用于图像分类的深度神经网络(基于InceptionV3)。之后,我将“ hdf5”模型转换为ONNX。如果我在Python中比较这两个模型,那么在ONNX模型上使用onnxruntime时,对于相同的输入图像,我将获得几乎相同的分数:分数之间的差异为+/- 0.00025%,这当然足够了。

ONNX模型旨在在ML.NET驱动的Web应用程序中运行。如果我现在使用与上述相同的图像,则分数相差大约+/- 0.5%。这对我来说也可以,但是我想知道我是否丢失了某些东西,或者这对于不同框架上的ONNX模型是正常的。这是我的ML.NET估算器管道的摘要:

var estimatorChain = this.mlContext.Transforms
                         .ResizeImages(
                              outputColumnName: columnName0,
                              inputColumnName: nameof(ModelInput.Image),
                              imageWidth: Settings.ImageWidth,
                              imageHeight:Settings.ImageHeight)
                         .Append(
                              this.mlContext.Transforms.ExtractPixels(
                                   outputColumnName: Settings.ModelInputLayer,
                                   inputColumnName: columnName0,
                                   scaleImage: (float)(1.0 / 255.0),
                                   interleavePixelColors: true))
                         .Append(
                              this.mlContext.Transforms.ApplyOnnxModel(
                                   outputColumnName: Settings.ModelOutputLayer,
                                   inputColumnName: Settings.ModelInputLayer,
                                   modelLocation));

以下是Keras / Python中的培训摘要:

from keras.applications.inception_v3 import InceptionV3
from keras.preprocessing.image import ImageDataGenerator

pretrainedModel = InceptionV3(include_top=False, weights='imagenet', input_tensor=None, input_shape=(image_height, image_width, 3), pooling=None)

# I think only the rescale-property is important here...
data_gen_args = dict(rescale=1./255,
                     horizontal_flip=True,
                     vertical_flip=True,
                     brightness_range=[0.5,1.0],
                     rotation_range=90,
                     zoom_range=[0.9,1.2])

datagen = ImageDataGenerator(**data_gen_args)

train_it = datagen.flow_from_directory('path/to/training/images', color_mode="rgb", class_mode=classMode, batch_size=batchSize, target_size=(image_height,image_width))
...
model.fit_generator(train_it, steps_per_epoch=num_training_images/batchSize, epochs=20, validation_data=val_it, validation_steps=num_validation_images/batchSize, callbacks=[tensorboard, checkpoint])

我正在使用的输入图像已经具有正确的尺寸(ImageHeight / ImageWidth),因此,不准确之处不应归因于不同的调整大小策略。

0 个答案:

没有答案