【问题标题】:Keras-TF model.predict() gave me wrong resultKeras-TF model.predict() 给了我错误的结果
【发布时间】:2019-10-03 13:51:20
【问题描述】:

我刚刚训练了我的 CNN 模型,该模型具有以下层详细信息:

model = Sequential()
model.add(Conv2D(100, (3, 3), input_shape=(100, 100, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(120, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(140, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.5))
model.add(Flatten())
model.add(Dense(200, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(100, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(Adam(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

我的模型在 keras 验证/测试结果上的准确率约为 95.xxx%

当我导入 h5 文件来测试图像的预测时,我做到了:

def grayscale(img):
  img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  return img

def equalize(img):
  img = cv2.equalizeHist(img)
  return img

def preprocessing(img):
  gray = grayscale(img)
  eq = equalize(gray)
  return eq / 255

image = cv2.imread("sample.jpg")
print("Loading model...")
model = load_model("model.h5")
classes = pd.read_csv('dataset.csv', header=0, usecols=['BananaOrNot']).values

image = preprocessing(image)
image = image.reshape(100, 100, 1)
image = np.expand_dims(image, axis=0)
y_prob = model.predict(image)
class_idx = y_prob.argmax(axis=-1)[0]
print(classes[class_idx][0]) # it produced wrong result (should be 'not banana', got 'banana')

我用一个示例 空白 图像进行了测试,预测给了我 香蕉 结果,尽管它应该是 不是香蕉 .在这个非常简单的测试用例中怎么可能出错?还是我的model.predict(img) 输入图片有什么问题?

【问题讨论】:

  • 这只有在你的训练集有一张标签为 Not Banana 的相似图像时才有效,否则新图像与训练集相差太大。
  • @matias-valdenegro 哦,我明白了。所以这意味着与Not banana相比,我的测试用例图像更类似于带有标签Banana的训练集?
  • 不,这意味着该模型从未使用过这样的图像进行过训练,这与相似性无关
  • 哦。但是,由于模型从未使用该图像进行过训练,所以预测函数会产生随机输出?
  • @JustinusHermawan argmax 关于类概率(模型预测)将始终为您提供类中概率/置信度最高的类(可以是 0.5 或 1.0)。您可能需要检查在这些情况下可能不会太高的置信度/概率值,并根据该概率应用一些阈值。

标签: python tensorflow keras


【解决方案1】:

由于您的数据集中没有名为 Notbanana 的类,因此它仅提供您在网络中训练过的类。

为了在您的模型上具有该行为,您应该在模型上设置一个类例如:背景,并使用一定数量的背景标记图像对其进行训练。否则它会给出输出向量中最可能的结果最可能的类,即使它是空白图像。

您可以训练分类模型以及本地化和分类仅发生在本地化对象中,您的问题可能会得到纠正。

【讨论】:

  • 感谢您的解释。但是我的数据集中已经有一个名为 Notbanana 的类。有时它会在某些测试用例上产生 Notbanana 结果。但准确率仍然很低。
  • 这意味着,您没有标记为 Notbanana 的空白图像。我认为这是因为您的数据集。例如,如果您将人类分类为 Notbanana,您可以尝试此类事物的准确性,但如果您的数据集上没有此类图像,则空白图像具有欺骗性。如果您还有其他问题,请随时提问。
  • 哦,我明白了。但是,我的model.predict(...) 代码有什么问题吗?我怀疑reshape(...)expand_dims(...) 的用法。
  • 我现在在 model.predictreshape()expand_dims() 上看不到任何错误。但是,如果您尝试实现 二元 分类,我对 y_prob.argmax() 有点怀疑,因为 argmax 用于构建混淆矩阵的多类分类。
  • 这很奇怪。我刚刚测试了一些从请求到 url 的图像进行预测,并得到了完美的结果。但是,如果我从图像中裁剪 100x100 矩形并再次测试以进行预测,那我就错了。这个场景是我用来模拟滑动窗口机制的。
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多