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