【问题标题】:Use in python trained tensorflow keras model in java for image recognition在java中使用python训练的tensorflow keras模型进行图像识别
【发布时间】:2021-10-02 20:49:51
【问题描述】:

我在 phyton 中使用 keras 来完成我在神经元网络中的第一步。 我训练了一个模型来识别 30px x 30px 的小图像。

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.python.keras import Sequential

train_ds = keras.preprocessing.image_dataset_from_directory('images', validation_split=0.2,
  subset="training", seed=123, batch_size=32, image_size=(30, 30))
val_ds  = keras.preprocessing.image_dataset_from_directory('images', validation_split=0.2,
  subset="validation", seed=123, batch_size=32, image_size=(30, 30))

class_names = train_ds.class_names
print(class_names)

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
num_classes = 13

model = Sequential([
  layers.experimental.preprocessing.Rescaling(1./255, input_shape=(30, 30, 3)),
  layers.Conv2D(10, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(15, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(20, 3, padding='same', activation='relu'),
  layers.MaxPooling2D(),
  layers.Dropout(0.2),
  layers.Flatten(),
  layers.Dense(64, activation='relu'),
  layers.Dense(num_classes)
])

model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])

model.summary()

epochs = 50

history = model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=epochs
)

model.save("model.h5")

我对此很满意,因为我的 val_accuracy 为 0.9912。

但现在我想使用Java中的模型对缓冲图像进行分类:

public class Test
{
    public static void main(String[] args) throws Exception
    {
        MultiLayerNetwork model = KerasModelImport.importKerasSequentialModelAndWeights("ki.h5");
        BufferedImage img = ImageIO.read(new File("testImage.png"));
        ImageLoader loader = new ImageLoader(30, 30, 3);
        INDArray input = loader.asMatrix(img);
        INDArray output = model.output(input);
        System.out.println("Test " + output);
    }
}

在这里我收到此错误:

线程“main”中的异常 org.deeplearning4j.nn.modelimport.keras.exceptions.UnsupportedKerasConfigurationException: 不支持的 keras 图层类型重新缩放。请在以下位置提出问题 https://github.com/eclipse/deeplearning4j/issues.

我通过删除 Rescaling Layer 让它在 phython 中工作。但后来我得到了例外

未知的 Keras 损失函数 sparsecategoricalcrossentropy。请在https://github.com/eclipse/deeplearning4j/issues 提出问题。

我愿意接受任何建议。有没有更好的方法来使用 java 中的模型?

或者我应该更改我的 python 文件中的某些内容或我如何保存模型?

【问题讨论】:

    标签: python java tensorflow keras deeplearning4j


    【解决方案1】:

    我来自 deeplearning4j 项目。从外观上看,@Andreas Radauer 是正确的。当我们实现缺少的导入功能时,这个漏掉了。

    请像问题中所说的那样(甚至在链接问题上)在 github 上 ping 我,我们可以在那里继续讨论解决方法。

    对于愿意这样做的用户,也可以使用模型导入注册自定义层来解决此问题。您可以使用我们的 tensorflow like api (samediff) 并自己定义实现此功能的函数并将其注册为层。如果您认为这适合您的用例,那么您可以在此处查看示例: https://github.com/eclipse/deeplearning4j/blob/master/deeplearning4j/deeplearning4j-modelimport/src/test/java/org/deeplearning4j/nn/modelimport/keras/e2e/KerasCustomLossTest.java

    否则,我们将考虑添加缺少的功能。 keras 的大部分工作都集中在卷积层上,并确保我们做对了。感谢您举报!

    【讨论】:

    【解决方案2】:

    deeplearning4j 看起来它不支持将您的损失函数定义为对象。您必须使用字符串指定它。 https://github.com/eclipse/deeplearning4j/issues/8990

    尝试改变

    model.compile(
      optimizer='adam',
      loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
      metrics=['accuracy'])
    

    model.compile(
      optimizer='adam',
      loss='sparse_categorical_crossentropy',
      metrics=['accuracy'])
    

    请注意,使用此方法您无法设置 kwarg from_logits。我认为这可能会破坏您的模型。如果是这种情况,您需要向他们提出问题,因为这是他们库中的错误。

    【讨论】:

    • 感谢您的回答。你是对的,现在我不能将 from_logits 的准确率设置为 7%,并且我在 java 中遇到了一个新错误:Got rank 3 array as input to ConvolutionLayer (layer name = conv2d, layer index = 0) with shape [3, 30、30]。预期 4 级数组,形状为 [minibatchSize, layerInputDepth, inputHeight, inputWidth]。 (图层名称:conv2d,图层索引:0,图层类型:ConvolutionLayer)我认为重用模型要容易得多
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2019-01-20
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多