【发布时间】: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