在 CIFAR 10 上训练的模型在输入互联网下载图像时表现不佳

数据挖掘 深度学习 美国有线电视新闻网
2022-03-06 23:19:32

我的模型基于Shallow Net
当我训练我的模型时,结果是:

loss: 1.1398 - accuracy: 0.6093 - val_loss: 1.2309 - val_accuracy: 0.5657

然后我从网上下载了 20 张图片(每个班级 2 张)来检查性能。

在此处输入图像描述

这个数据集对应的标签应该是:0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9]。
但是我的模型的预测是:[0,0,0,1,0,1,5,0,0,5,2,2,0,0,5,2,0,0,1,9]。

精度为:0.2,与 0.5657 相比相当低。

我加载这些数据集的代码:

for file in os.listdir("C:/Users/....."):
    img_arr=cv2.imread(os.path.join(os.getcwd(),"Dataset",file))
    img_arr=cv2.resize(img_arr,(32,32))/255
    img_arrs.append(img_arr)

img_arrs=np.array(img_arrs)
img_arrs=img_arrs.reshape(20,32,32,3)
model=load_model("weights.hdf5")
pred=model.predict(img_arrs).argmax(axis=1)

这背后的原因可能是什么?有人可以给我一个见解吗?

编辑:(添加培训代码)

(x_train,y_train),(x_test,y_test)=cifar10.load_data()
x_train=x_train.astype(float)/255
x_test=x_test.astype(float)/255
lb=LabelBinarizer()
y_train=lb.fit_transform(y_train)
y_test=lb.transform(y_test)

labelNames = ["airplane", "automobile", "bird", "cat", "deer","dog", "frog", "horse", "ship", "truck"]

model=ShallowNet.ShallowNet.build(width=32, height=32, depth=3, classes=10)
sgd=SGD(0.001)
model.compile(optimizer=sgd,loss="categorical_crossentropy",metrics=["accuracy"])
H=model.fit(x_train,y_train,validation_data=(x_test,y_test),batch_size=32,epochs=50,verbose=1)
2个回答

以下是我想到的一些可能性:

  • 维度的排序。根据您正在训练的网络和原始训练数据,您可能需要转置一些维度和/或以不同方式重塑它们。原始的 cifar 10 数据有点奇怪,因为颜色维度在高度/宽度维度之前。它可能有助于使用相同的功能并排可视化来自训练数据和互联网数据的图像,并确保它们以与测试相同的方式显示。
  • 是否对训练图像进行了任何预处理,例如重新缩放值?如果是这样,则应对这些图像执行相同的预处理。即使没有明确执行预处理,图像数据也可以以各种不同的方式存储。我会检查您的训练/验证图像上的值范围,并与您从网上获得的图像进行比较。
  • 调整这些图像的大小时,可能会发生一些奇怪的事情。我建议在调整大小并确认它们是合理的之后将上述示例可视化。
  • 另一种可能性是加载模型时发生了一些意想不到的事情 - 考虑到验证结果,这似乎是多余的,但我仍然会从原始验证集中取出一组 20 张左右的图像,并在使用上述 load_model 检索模型后检查预测功能。

我认为 50% 的准确度可能不足以仅根据准确度将其与新图像匹配。
同样,每个类 2 个图像对于检查模型来说也有点小,除非一个模型是建立在数百万张图像上的,这些图像已经看到了几乎所有类型的像素差异

你可以尝试什么 -

检查训练中单个类的损失
尝试匹配这些图像的损失,即每类 2
对准确性做同样的事情,即每类准确度
尝试检查最后第二层的激活,即在 Softmax 之前的层
尝试收集 80-90 张图像并在您的模型得分 ~80% 时重复

我的意思是您应该尝试查看模型内部而不是黑盒方法