我正在尝试训练一个Keras图像分类器来预测图像中的杂草(1)和草(0)。然而,无论我尝试构建什么样的方法/模型,准确率都会陷入停滞,我的意思是训练准确率看起来像是只在预测0。我可以确认这一点,因为当我将标签数组改为只包含0时,模型声称准确率为1.00,但当我将所有标签改为1时,模型准确率为0.00。我所有的图像都已缩放并转换为RGB格式。以下是代码:
def prep_image(filename): im = cv2.imread(filename, 0) new_im = cv2.resize(im, (400,530)) arr = np.array(new_im) arr = np.reshape(arr, (530, 400)) return arrimage_files = [] #包含图像文件路径的列表images = [] #包含数组/图像的列表labels = []n_classes = 2def add_image_data(root): global images global labels print("starting") delim = os.sep for dirpath, dirs, files in tqdm(os.walk(root)): for file in [f for f in files if (f.endswith(".jpg"))]: image_files.append(os.path.join(dirpath, file)) for file in tqdm(image_files): image_arr = prep_image(file) images.append(image_arr) #print("supposed added ", file) label = file.split(delim)[-2] if label == "Grass": label = 0; else: label = 1; labels.append(label) images = np.array(images) labels = np.array(labels)
然后我应用to_categorical(labels)对它们进行独热编码模型:
model = Sequential()model.add(Conv2D(32, kernel_size=3, input_shape=(530, 400, 1)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.2))model.add(Conv2D(32, kernel_size=3))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.5))model.add(Conv2D(64, kernel_size=3))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))#model.add(Dropout(0.5))model.add(Dense(2)) #或n_clasessmodel.add(Activation('softmax'))model.compile(optimizer=Adam(0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
似乎也没有任何学习过程,损失和准确率在第一个epoch后就陷入停滞。标签包含两种类别。提前感谢
回答:
你有查看过你的预测分数吗?如果准确率指标基于预测分数> 0.5,那么可能你的类别实际上没有一个得分超过0.5。这可能是由于类别不平衡造成的。你可以调整“正面”预测的阈值。
尝试使用AUC这样的指标,或者只是打印出你的预测并检查分数。
从评论中编辑:你是否正确地预处理了你的输入?归一化等。如果你的输入值太大,梯度将无法正常流动。
缺乏归一化会阻止梯度流动。这是由于如果你所有的输入值都太大/太小,你将无法利用激活函数中的非线性特性。