【问题标题】:Wrong prediction with Keras network but good accuracyKeras 网络预测错误,但准确度高
【发布时间】:2020-09-28 22:48:35
【问题描述】:

我正在用 keras 编写一个 CNN,以预测化学元素的发射光谱。我将照片与元素名称分类在不同的文件夹中,并且我正在使用图像数据生成器。数据集非常小,但我将其分为训练、测试和验证。我在三组中得到了高于 90 的准确率,但是当我一张一张地传递照片时,预测是错误的。它对它们进行了很好的分类(例如,大多数 B 被归类为 Be 或 Hg 为 Zn),所以我认为问题在于我不知道如何获得该类。

我使用的代码是这样的:

dir="datasets//con_espectro//test_ski//"
elem=sorted(os.listdir(dir))
l=len(elem)
for i in range(0,l):
    for pos in range(1,10):
        im=cv2.imread(dir+elem[i]+"//"+elem[i]+"_"+str(pos)+"_i2_d_tes.jpg")
        a=np.expand_dims(cv2.resize(im/255,(500,500)),axis=0)
        b=np.argmax(modelo.predict(a))
        if b!=i:
            print(elem[i]+"  "+str(pos)+"  -->   "+elem[b])

结果:

0B  1  -->   Be
0B  2  -->   Be
0B  4  -->   Be
0B  5  -->   Be
0B  6  -->   Li
0B  7  -->   Be
0B  9  -->   Be
0C  1  -->   Au
0C  2  -->   0S
0C  3  -->   Au
0C  4  -->   Au
0C  5  -->   Au
0C  6  -->   Ag  

对于培训:

train_datagen=ImageDataGenerator(
train_datagen=ImageDataGenerator(
    rescale=1./255,
    rotation_range=90,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True)

test_datagen=ImageDataGenerator(rescale=1./255)

train_generator=train_datagen.flow_from_directory("datasets//con_espectro//train_ski//",target_size=(500,500),batch_size=97)
val_generator=test_datagen.flow_from_directory("datasets//con_espectro//validation_ski//",target_size=(500,500),batch_size=97)
test_generator=test_datagen.flow_from_directory("datasets//con_espectro//test_ski//",target_size=(500,500),batch_size=97)

model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(500,500,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(97,activation="sigmoid"))

model.compile(optimizer="rmsprop",loss="categorical_crossentropy",metrics=["accuracy"])
callbacks = [EarlyStopping(monitor='accuracy', patience=20),
             ModelCheckpoint(filepath='modelos_con//1000.h5', monitor='val_loss', save_best_only=True)]
history=model.fit(train_generator,steps_per_epoch=27,epochs=100,validation_data=val_generator,validation_steps=9,callbacks=callbacks)

model.evaluate(test_generator)

非常感谢, 祖墨

【问题讨论】:

  • 尝试label_map = test_datagen.class_indices 来获取每个类对应的索引,或者如果你有顺序模型,则只获取model.predict_classes(x)
  • 感谢您的帮助,但它不起作用。这些课程按字母顺序组织,predict_calsses 的回馈方式与我的方式相同(我改为这种方式更好)。我想问题出在培训中,也许它改变了课程的顺序,但我不知道
  • 否定结果也是结果。然后,您可以尝试从训练生成器中提取几批,并在它们上评估模型,并比较标签。如果标签不匹配,您将恢复正确的标签序列并在第二批进行验证。如果模型有很强的过拟合,那么您将无法预测您的数据。如果即使在训练样本上结果也是垃圾,您将需要检查训练过程
  • 好的,我正在研究训练数据集上的结果。乍一看似乎就像我说的,与测试类似的类别,但我会做更深入的研究。谢谢!

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

如果您在最后一层使用“sigmoid”激活,那么您应该在编译时使用 loss="binary_crossentropy"。

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多