Python:ValueError:类的数量必须大于一;得到 1

Posted

技术标签:

【中文标题】Python:ValueError:类的数量必须大于一;得到 1【英文标题】:Python: ValueError: The number of classes has to be greater than one; got 1 【发布时间】:2017-10-29 13:37:52 【问题描述】:

根据this post 的Tonechas 建议,计算一组图像的红色通道直方图然后将它们分类为正确类型的代码是这样的:

import cv2
import os
import glob
import numpy as np
from skimage import io


root = "C:/Users/joasa/data/train"
folders = ["Type_1", "Type_2", "Type_3"]
extension = "*.jpg"


# skip errors caused by corrupted files

def file_is_valid(filename):
    try:
        io.imread(filename)
        return True
    except:
        return False

def compute_red_histogram(root, folders, extension):
    X = []
    y = []
    for n, imtype in enumerate(folders):
        filenames = glob.glob(os.path.join(root, imtype, extension))
        for fn in filter(file_is_valid, filenames):
            print(fn)
            image = io.imread(fn)
            img = cv2.resize(image, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA)
            red = img[:, :, 0]
            h, _ = np.histogram(red, bins=np.arange(257), normed=True)
            X.append(h)
            y.append(n)
     return np.vstack(X), np.array(y)

X, y = compute_red_histogram(root, folders, extension)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.5, random_state = 0)

from sklearn.svm import SVC
clf = SVC()
clf.fit(X_train, y_train)

y_test
clf.predict(X_test)
y_test == clf.predict(X_test)
score = clf.score(X_test, y_test)

prediction = pd.DataFrame(y_test, score, columns=['prediction', 'score']).to_csv('prediction.csv')

我收到此错误:

ValueError:类的数量必须大于1;得到 1 个

有人可以帮忙吗?谢谢

【问题讨论】:

好像你的y_train 只包含一个类。验证所有三个类都在 y_train 中表示。 如何验证? (1) 您可以在 compute_red_histogram() 中发现错误或 (2) 打印 (y_train.min(), y_train.max()) 并看到它全为零。 【参考方案1】:

看看你的功能:

def compute_red_histogram(root, folders, extension):
    X = []
    y = []
    for n, imtype in enumerate(folders):
        filenames = glob.glob(os.path.join(root, imtype, extension))
        for fn in filter(file_is_valid, filenames):
            print(fn)
            image = io.imread(fn)
            img = cv2.resize(image, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA)
            red = img[:, :, 0]
            h, _ = np.histogram(red, bins=np.arange(257), normed=True)
            X.append(h)
            y.append(n)
        return np.vstack(X), np.array(y) ## <--- this line is not properly indented.

returnfor 循环的第一次迭代结束时遍历 folders。您需要取消缩进这一行。

【讨论】:

谢谢。我还想将我的预测保存到 .csv 文件中,并且我已经更新了上面的代码以向您展示我所做的。除了每个图像所属的类之外,我想显示预测分数,但它给了我这个错误:TypeError: len() of unsized object。你知道为什么吗?【参考方案2】:

我也有同样的问题 我想通了 当你的数据被下载时,有时标签或目标是字符串 试试 y=y.astype(np.uint8)

【讨论】:

以上是关于Python:ValueError:类的数量必须大于一;得到 1的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:类的数量必须大于一;得到 1

ValueError:模型的特征数量必须与输入匹配(sklearn)

ValueError:目标和输入必须具有相同数量的元素。目标 nelement (50) != 输入 nelement (100)

Pytorch 闪电指标:ValueError:preds 和 target 必须具有相同数量的维度,或者 preds 的一个额外维度

如何解决 Python 中的“ValueError:找到样本数量不一致的输入变量”问题

Python Scikit Learn 错误:ValueError:“找到样本数量不一致的输入变量:[4, 10]”