«ValueError: Ожидаемый 2D-массив, вместо него получен 1D-массив» при вставке данных в модель - PullRequest
0 голосов
/ 02 мая 2020

Я просмотрел несколько вопросов, касающихся той же проблемы, но ни один из них не помог мне. Проблема, как говорится, в том, что я не могу вписать данные в модель обучения.

Это основной файл, который вызывает класс, касающийся данных, которые я использую для встраивания в модель:

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 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, а просто использовался метод fillArray () в main () предыдущего кода, и это не вернуло эту ошибку, все работало хорошо. Но из-за некоторых ограничений, которым я должен следовать, я попытался перевести его в класс для использования в других файлах.

    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' "), и поскольку мне не требовалось это изменение формы, прежде чем я предположил, что это не является решением.

Извините, если плохое кодирование, но я не такой большой эксперт (не даже близко) и период времени, который я должен был сделать, был очень коротким, поэтому я просто сосредоточился на том, чтобы заставить его работать должным образом: D Любая помощь будет оценена

1 Ответ

1 голос
/ 02 мая 2020

Вы не звоните fillArray. поэтому списки пусты. Попробуйте сделать это в конце функции init. array=[] по ошибке показывает это.

...