"ValueError: Expected 2D array, got 1D array instead" when fitting data into model

"ValueError: Expected 2D array, got 1D array instead" when fitting data into model

我查看了一些关于同一问题的问题,但其中 none 可以帮助我。问题如其所说,我无法将数据拟合到学习模型中。

这是主文件,它调出 class 关于我用来拟合模型的数据:

def main():
    action = input(
        "Choose an action:\n A - Create LinearSVC classifier\n B - Create Random Forest Classifier\n C - Create K Nearest Neighbor classifier\n -> ").upper()

    loader = ImageLoader()
    if action == "A":
        lsvc = LinearSVC(random_state=0, tol=1e-5)
        lsvc.fit(loader.hogArray(), loader.labelArray())
        joblib.dump(lsvc, './LSVCmodel.pkl')
    elif action == "B":
        rfc = RandomForestClassifier(n_estimators=100)
        rfc.fit(loader.hogArray(), loader.labelArray())
        joblib.dump(rfc, './RFmodel.pkl')
    elif action == "C":
        knc = KNeighborsClassifier(n_neighbors=3)
        knc.fit(loader.hogArray(), loader.labelArray())
        joblib.dump(knc, './KNCmodel.pkl')
    else:
        print("That's not a valid answer")
        main()

所有 3 个模型都出现相同的错误。获取数据的class写法如下:

class ImageProcess:

    def __init__(self, image, hog_data=None):
        self.hog_data = hog_data
        self.image = image

    def hog_data_extractor(self):
        self.hog_data = feature.hog(self.image) / 255.0
        return self.hog_data

    def normalize(self):
        imageRead = cv2.resize(cv2.imread(self.image), (150, 150))
        gaussImage = cv2.fastNlMeansDenoisingColored(imageRead, None, 10, 10, 7, 21)
        self.image = cv2.Canny(gaussImage, 100, 200)
        self.image = cv2.cvtColor(self.image, cv2.COLOR_GRAY2RGB)
        self.image *= np.array((0, 0, 1), np.uint8)
        return self.image


class ImageLoader:

    def __init__(self):
        self.sourcePath = "dataset/seg_train/"
        self.labels = ['Buildings', 'Forest', 'Glacier', 'Mountain', 'Sea', 'Street']
        self.x_train = []
        self.y_train = []

    def fillArray(self):
        label_train = []
        le = LabelEncoder()

        run_time = time.time()
        for scene in self.labels:
            scene_path = os.path.join(self.sourcePath, scene.lower())
            fileNumber = 0

            scene_length = len([image for image in os.listdir(scene_path)])
            for img in os.listdir(scene_path):
                per = (file_number / scene_length)
                arrow = '-' * int(round(per * 100) - 1) + '>'
                spaces = ' ' * (100 - len(arrow))
                sys.stdout.write(
                    "\rProgress: [{0}] {1}% -Ellapsed time: {2}".format(arrow + spaces, int(round(per * 100, 2)),
                                                                        (int(time.time() - run_time))))

                file_number += 1
                img_path = os.path.join(scene_path, img)
                process = ImageProcess(img_path)
                self.x_train.append(process.hog_data_extractor())
                label_train.append(str(scene_type))

        self.y_train = le.fit_transform(label_train)

    def hogArray(self):
        return self.x_train

    def labelArray(self):
        return self.y_train

旁注:以前我没有这个 ImageLoader class,只是在之前的代码中有 main() 下的 fillArray() 方法,它没有返回这个错误,一切正常。但是由于一些限制,我必须遵循我试图将它转移到 class 以用于更多其他文件。

    Traceback (most recent call last):
  File "main.py", line 35, in <module>
    main()
  File "main.py", line 19, in main
    lsvc.fit(loader.hogArray(), loader.labelArray())
  File "/home/filipe/Documents/NovaPasta/2019_20/LP_recuperacao/Trabalho_recuperacao/venv/lib/python3.6/site-packages/sklearn/svm/classes.py", line 229, in fit
    accept_large_sparse=False)
  File "/home/filipe/Documents/NovaPasta/2019_20/LP_recuperacao/Trabalho_recuperacao/venv/lib/python3.6/site-packages/sklearn/utils/validation.py", line 756, in check_X_y
    estimator=estimator)
  File "/home/filipe/Documents/NovaPasta/2019_20/LP_recuperacao/Trabalho_recuperacao/venv/lib/python3.6/site-packages/sklearn/utils/validation.py", line 552, in check_array
    "if it contains a single sample.".format(array))
ValueError: Expected 2D array, got 1D array instead:
array=[].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

我已经尝试按照错误中的建议进行重塑,但它检索到(“AttributeError:'list' 对象没有属性 'reshape'”),因为在我之前不需要这种重塑假设这不是解决方案。

抱歉,如果它的编码不好,但我不是那么多专家(甚至不是专家)而且我必须做这件事的时间很短,所以我只是专注于让它正常工作。

您没有打电话给 fillArray。所以列表是空的。尝试在 init 函数末尾执行此操作。 array=[] 错误显示这个。