【问题标题】:classify new image on trained custom model in deeplearning4j (convolutional network)在 deeplearning4j(卷积网络)中对训练有素的自定义模型上的新图像进行分类
【发布时间】:2017-09-03 17:02:27
【问题描述】:

我是 deeplearning4J 的新手。我已经尝试过它的 word2vec 功能,一切都很好。但是现在我对图像分类有点困惑。我在玩这个例子:

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/AnimalsClassification.java

我将“保存”标志更改为 true,并且我的模型存储在 model.bin 文件中。 现在是有问题的部分(如果这听起来很愚蠢,我很抱歉,也许我在这里遗漏了一些非常明显的东西)

我创建了一个名为 AnimalClassifier 的单独类,其目的是从 model.bin 文件加载模型,从中恢复神经网络,然后使用恢复的网络对单个图像进行分类。对于这个单一的图像,我创建了“temp”文件夹-> dl4j-examples/src/main/resources/animals/temp/ 我把以前在AnimalsClassification.java中训练过程中使用的北极熊的图片(我想确定该图像将被正确分类 - 因此我重用了“熊”文件夹中的图片)。

这是我试图对北极熊进行分类的代码:

protected static int height = 100;
    protected static int width = 100;
    protected static int channels = 3;
    protected static int numExamples = 1;
    protected static int numLabels = 1;
    protected static int batchSize = 10;

    protected static long seed = 42;
    protected static Random rng = new Random(seed);
    protected static int listenerFreq = 1;
    protected static int iterations = 1;
    protected static int epochs = 7;
    protected static double splitTrainTest = 0.8;
    protected static int nCores = 2;
    protected static boolean save = true;

    protected static String modelType = "AlexNet"; //

    public static void main(String[] args) throws Exception {

        String basePath = FilenameUtils.concat(System.getProperty("user.dir"), "dl4j-examples/src/main/resources/");
        MultiLayerNetwork multiLayerNetwork = ModelSerializer.restoreMultiLayerNetwork(basePath + "model.bin", true);

        ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator();
        File mainPath = new File(System.getProperty("user.dir"), "dl4j-examples/src/main/resources/animals/temp/");
        FileSplit fileSplit = new FileSplit(mainPath, NativeImageLoader.ALLOWED_FORMATS, rng);
        BalancedPathFilter pathFilter = new BalancedPathFilter(rng, labelMaker, numExamples, numLabels, batchSize);


        InputSplit[] inputSplit = fileSplit.sample(pathFilter, 1);
        InputSplit analysedData = inputSplit[0];


        ImageRecordReader recordReader = new ImageRecordReader(height, width, channels);
        recordReader.initialize(analysedData);
        DataSetIterator dataIter = new RecordReaderDataSetIterator(recordReader, batchSize, 0, 4);
        while (dataIter.hasNext()) {
            DataSet testDataSet = dataIter.next();

            String expectedResult = testDataSet.getLabelName(0);
            List<String> predict = multiLayerNetwork.predict(testDataSet);
            String modelResult = predict.get(0);
            System.out.println("\nFor example that is labeled " + expectedResult + " the model predicted " + modelResult + "\n\n");
        }
    }

运行后报错:

java.lang.UnsupportedOperationException 在 org.datavec.api.writable.ArrayWritable.toInt(ArrayWritable.java:47) 在 org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.getDataSet(RecordReaderDataSetIterator.java:275) 在 org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:186) 在 org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:389) 在 org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next(RecordReaderDataSetIterator.java:52) 在 org.deeplearning4j.examples.convolution.AnimalClassifier.main(AnimalClassifier.java:66) 与目标 VM 断开连接,地址:'127.0.0.1:63967',传输:'socket' 线程“main”java.lang.IllegalStateException 中的异常:此数据集上未定义标签名称。添加标签名称以便使用带有 id 的 getLabelName。 在 org.nd4j.linalg.dataset.DataSet.getLabelName(DataSet.java:1106) 在 org.deeplearning4j.examples.convolution.AnimalClassifier.main(AnimalClassifier.java:68)

我可以看到 MultiLayerNetwork.java 中有一个方法 public void setLabels(INDArray labels) 但我不知道如何使用(尤其是当它作为参数 INDArray 时)。

我也很困惑为什么我必须在 RecordReaderDataSetIterator 的构造函数中指定可能的标签数量。我希望该模型已经知道要使用哪些标签(它不应该使用在训练期间自动使用的标签吗?)。我想,也许我以完全错误的方式加载图片......

总而言之,我想简单地实现以下目标:

  1. 从模型中恢复网络(这是有效的)
  2. 加载要分类的图像(也可以)
  3. 使用训练期间使用的相同标签(熊、鹿、鸭、乌龟)对这张图片进行分类(棘手的部分)

提前感谢您的帮助或任何提示!

【问题讨论】:

标签: deeplearning4j


【解决方案1】:

所以在这里总结您的多个问题: 图像记录是集合中的 2 个条目。第二个 1 是标签。标签索引与您传入的记录的种类有关。

您问题的第二部分: 多个条目可以是数据集的一部分。该列表指的是小批量中特定处项目的标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2016-12-27
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2019-01-28
    • 2018-05-01
    相关资源
    最近更新 更多