预训练的 keras 模型在 android 中返回相同的结果

米通·萨克·舒夫罗

我在 Keras 中创建了一个图像分类器,后来我以pb格式保存模型以在 android 中使用它。

但是,在python代码中,它可以正确地对图像进行分类。但是在 android 中,无论我输入什么图像,输出总是相同的。

这就是我训练模型的方式

rom keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Part 2 - Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

classifier.fit_generator(training_set,
                         steps_per_epoch = 8000,
                         epochs = 25,
                         validation_data = test_set,
                         validation_steps = 2000)
classifier.summary()
classifier.save('saved_model.h5')

后来我saved_model.h5使用这个将keras模型(转换为tensorflow模型

这就是我转换位图浮点数组的方式

    public static float[] getPixels(Bitmap bitmap) {

        final int IMAGE_SIZE = 64;

        int[] intValues = new int[IMAGE_SIZE * IMAGE_SIZE];
        float[] floatValues = new float[IMAGE_SIZE * IMAGE_SIZE * 3];

        if (bitmap.getWidth() != IMAGE_SIZE || bitmap.getHeight() != IMAGE_SIZE) {
            // rescale the bitmap if needed
            bitmap = ThumbnailUtils.extractThumbnail(bitmap, IMAGE_SIZE, IMAGE_SIZE);
        }

        bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

        for (int i = 0; i < intValues.length; ++i) {
            final int val = intValues[i];
        // bitwise shifting - without our image is shaped [1, 64, 64, 1] but we need [1, 168, 168, 3]
            floatValues[i * 3 + 2] = Color.red(val) / 255.0f;
            floatValues[i * 3 + 1] = Color.green(val) / 255.0f;
            floatValues[i * 3] = Color.blue(val) / 255.0f;
        }
        return floatValues;
    }

后来,我尝试在 android 中使用 tensorflow 对图像进行分类,如下所示。

TensorFlowInferenceInterface tensorFlowInferenceInterface; 
tensorFlowInferenceInterface = new TensorFlowInferenceInterface(getAssets(),"model.pb");
float[] output = new float[2];
tensorFlowInferenceInterface.feed("conv2d_11_input",
                getPixels(bitmap), 1,64,64,3);
tensorFlowInferenceInterface.run(new String[]{"dense_12/Sigmoid"});
tensorFlowInferenceInterface.fetch("dense_12/Sigmoid",output);

无论我给出的值output是 [1,0]

有什么我错过了吗?

今天

Color.red(int),Color.blue(int)返回的颜色分量Color.green(int)是 [0, 255] 范围内的整数(请参阅doc)。使用ImageDataGeneratorKeras读取图像时也是如此。但是,正如我在评论部分所述,在预测阶段,您需要执行与训练阶段相同的预处理步骤。您正在通过1./255训练(使用rescale = 1./255in ImageDataGenerator缩放图像像素,因此,根据我提到的第一点,这也必须在预测中完成:

floatValues[i * 3 + 2] = Color.red(val) / 255.0;
floatValues[i * 3 + 1] = Color.green(val) / 255.0;
floatValues[i * 3] = Color.blue(val) / 255.0;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TFF加载预训练的Keras模型

来自分类Dev

keras在预训练模型上设置可训练标志

来自分类Dev

如何使用 Keras 中 h5 类型的预训练图像分类模型?

来自分类Dev

如何使用预训练模型的第一层来提取Keras模型中的特征(功能性API)

来自分类Dev

加载预训练的 Keras 模型并进行预测

来自分类Dev

Keras:在 imagenet 上获取预训练模型的标签名称

来自分类Dev

R Shiny中的预训练模型

来自分类Dev

预训练的bert模型中的冻结层

来自分类Dev

R Shiny中的预训练模型

来自分类Dev

在Keras中更改预训练的AlexNet分类

来自分类Dev

在Keras中更改预训练的AlexNet分类

来自分类Dev

如何在Keras中找到预训练的InceptionResNetV2模型不同层中的激活形状-Tensorflow 2.0

来自分类Dev

将一个看不见的例子提供给在 Keras 中制作的预训练模型

来自分类Dev

从Torchvision预训练模型中获取模型类标签

来自分类Dev

在Keras中训练模型时价值错误

来自分类Dev

仍在下载甚至 Keras 在 ./keras/models 中有 VGG16 预训练模型

来自分类Dev

合并Word2Vec中的预训练模型?

来自分类Dev

caffe中预训练imagenet模型的对象类别

来自分类Dev

BERT如何在Windows Anaconda中运行预训练的模型

来自分类Dev

在预训练的VGG16模型中激活辍学

来自分类Dev

将预训练的词嵌入加载到 Tensorflow 模型中

来自分类Dev

如何在python中打开预训练模型

来自分类Dev

如何从这些预训练模型中获得预测?

来自分类Dev

为什么在keras中未指定DNN的预训练?

来自分类Dev

在 Keras/TF 中,有没有办法预训练模型并重用它来测试其他可能的层?

来自分类Dev

keras预训练模型提供了一个新的输入占位符

来自分类Dev

如何使用PyTorch在预训练模型上添加新图层?(给出了Keras示例。)

来自分类Dev

Cleverhans负荷预训练模型

来自分类Dev

Keras模型训练时间太长

Related 相关文章

  1. 1

    TFF加载预训练的Keras模型

  2. 2

    keras在预训练模型上设置可训练标志

  3. 3

    如何使用 Keras 中 h5 类型的预训练图像分类模型?

  4. 4

    如何使用预训练模型的第一层来提取Keras模型中的特征(功能性API)

  5. 5

    加载预训练的 Keras 模型并进行预测

  6. 6

    Keras:在 imagenet 上获取预训练模型的标签名称

  7. 7

    R Shiny中的预训练模型

  8. 8

    预训练的bert模型中的冻结层

  9. 9

    R Shiny中的预训练模型

  10. 10

    在Keras中更改预训练的AlexNet分类

  11. 11

    在Keras中更改预训练的AlexNet分类

  12. 12

    如何在Keras中找到预训练的InceptionResNetV2模型不同层中的激活形状-Tensorflow 2.0

  13. 13

    将一个看不见的例子提供给在 Keras 中制作的预训练模型

  14. 14

    从Torchvision预训练模型中获取模型类标签

  15. 15

    在Keras中训练模型时价值错误

  16. 16

    仍在下载甚至 Keras 在 ./keras/models 中有 VGG16 预训练模型

  17. 17

    合并Word2Vec中的预训练模型?

  18. 18

    caffe中预训练imagenet模型的对象类别

  19. 19

    BERT如何在Windows Anaconda中运行预训练的模型

  20. 20

    在预训练的VGG16模型中激活辍学

  21. 21

    将预训练的词嵌入加载到 Tensorflow 模型中

  22. 22

    如何在python中打开预训练模型

  23. 23

    如何从这些预训练模型中获得预测?

  24. 24

    为什么在keras中未指定DNN的预训练?

  25. 25

    在 Keras/TF 中,有没有办法预训练模型并重用它来测试其他可能的层?

  26. 26

    keras预训练模型提供了一个新的输入占位符

  27. 27

    如何使用PyTorch在预训练模型上添加新图层?(给出了Keras示例。)

  28. 28

    Cleverhans负荷预训练模型

  29. 29

    Keras模型训练时间太长

热门标签

归档