【问题标题】:Functional API Keras alternate solution for predict_classes()predict_classes() 的功能 API Keras 替代解决方案
【发布时间】:2017-03-15 08:50:37
【问题描述】:

请参考here 我之前的问题以获取背景信息。根据Nassim Ben 建议的answer。我使用功能 API 训练了双路径架构模型。现在我感觉卡住了,因为我需要预测每个像素的类别。这是相同的代码:

    imgs = io.imread(test_img).astype('float').reshape(5,240,240)
    plist = []

 # create patches from an entire slice
            for img in imgs[:-1]:
                if np.max(img) != 0:
                    img /= np.max(img)
                p = extract_patches_2d(img, (33,33))
                plist.append(p)
            patches = np.array(zip(np.array(plist[0]), np.array(plist[1]), np.array(plist[2]), np.array(plist[3])))

    # predict classes of each pixel based on model
            full_pred = self.model_comp.predict_classes(patches)
            fp1 = full_pred.reshape(208,208)

但是根据github-link predict_classes() 是不可用的。所以我的问题是我可以尝试其他替代方案吗?

【问题讨论】:

  • 嗨,Paul,您所说的每个像素的类别是什么意思?我以为你在预测图片的类别?
  • 您好 Nassim,该方法通过处理以该像素为中心的 M×M 块来预测像素的类别。因此,我们的 CNN 模型的输入 X 是一个具有多种模态的 M × M 2D 补丁。

标签: python tensorflow deep-learning keras convolution


【解决方案1】:

Nassim 的回答很棒,但我想与您分享我在类似任务上的经验:

  1. 永远不要使用predict_probaKeras 作为版本。 Here 你可以找到原因。
  2. 用于将预测转换为类的大多数方法都没有考虑您的数据统计信息。在图像分割的情况下 - 通常检测对象比检测背景更重要。出于这个原因,我建议您使用从precision-recall 曲线中获得的每个类的阈值。在这种情况下 - 您需要设置一个阈值 precision == recall (或尽可能接近)。获得阈值后 - 您需要为类预测编写自定义函数。

【讨论】:

    【解决方案2】:

    确实,predict_classes 不适用于函数模型,因为在某些情况下使用它可能没有意义。 但是,对此存在“单线”解决方案:

    y_classes = keras.utils.np_utils.probas_to_classes(self.model_comp.predict(patches))
    

    这适用于keras 1.2.2,不确定keras 2.0,我在源代码中找不到该功能。但这实际上并没有什么不妥之处,您的模型会输出一个属于每个类的概率向量。该函数所做的只是获取 argmax 并输出对应于最高概率的类。

    我希望这会有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2021-04-11
    • 2011-04-13
    • 2016-10-24
    • 2019-12-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多