我正在尝试训练一个keras图像分类器,以预测图像中的杂草(1)和草(0)之间。但是,无论我尝试构建哪种方法/模型,准确性都将卡住,这意味着训练准确性就像仅预测0一样。我可以确认这一点,因为当我将标签数组更改为仅包含零时,模型以某种方式要求1.00的精度,但是当我将标签全部更改为1时,模型的精度为0.00。我所有的图像都会缩放并转换为rgb。 这是代码:
php://output
然后我将to_categorical(labels)应用于一键编码 型号:
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 arr
image_files = [] #contains the file paths of the images
images = [] # contains arrays/images
labels = []
n_classes = 2
def 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)
似乎也没有进行任何学习,损失和准确性似乎在第一个时期之后就陷入了困境。标签包含两个类。 预先感谢
答案 0 :(得分:1)
您是否查看了预测分数?如果准确性度量标准的预测得分大于0.5,则可能是您的所有班级实际上都没有获得大于0.5的得分。这可能是由于阶级失衡造成的。然后,您可以更改“阳性”预测的阈值。
尝试改用AUC之类的指标,或者只是打印出您的预测并检查分数。
根据评论进行编辑: 您是否正确预处理了输入?归一化等。如果输入值太大,则渐变将无法正常流动。
缺少归一化将停止梯度流。这是由于以下事实:如果您的值对于所有输入而言太大/太小,您将不会使用激活函数中的非线性。
答案 1 :(得分:0)
您的数据集不平衡吗?当数据集严重不平衡时,这是一个常见问题。这意味着一个或多个班级和方式比其他班级更频繁。您的模型发现,达到相当高的准确性的最简单方法是猜测最频繁的课程。这会使学习优化方式变得更困难。
您可以尝试几种处理不平衡数据集的方法:https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
答案 2 :(得分:0)
我认为问题可能在于,您正在将标签(0或1)与softmax的结果进行比较,softmax的结果是两个值,代表对象属于该类别的概率。
您应该像这样进行一次热编码转换: 0-> [1,0] 1-> [0,1]
这样,神经网络的输出和标签的格式相同,可以进行比较。