Ошибка при написании бинарного классификатора алгоритма перцептрона

Вопрос или проблема

Я новичок и проектирую бинарный классификатор, используя алгоритм Перцептрона на датасете FASHION-MNIST. При проектировании я написал следующий код:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import seaborn as sns
np.random.seed(2)
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
import itertools
from keras.utils.np_utils import to_categorical
from keras.models import Sequential
from keras.optimizers import RMSprop,Adam
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
from keras.optimizers import RMSprop
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau
import warnings
warnings.filterwarnings('ignore')
import os


def read_dataset(train_path, test_path):

    train = pd.read_csv(train_path)
    test = pd.read_csv(test_path)

    y_train = train["label"]
    x_train = train.drop(labels = ["label"],axis = 1)  #удаляем столбец с метками

    y_test = test["label"]
    x_test = test.drop(labels = ["label"], axis = 1)

    x_train = x_train / 255.0
    x_test = x_test / 255.0

    x_train = x_train.values.reshape(-1,28,28,1)
    x_test = x_test.values.reshape(-1,28,28,1)

    y_train = to_categorical(y_train, num_classes = 10)
    #x_train = to_categorical(x_train, num_classes = 10)

    y_train = y_train.astype(int)
    y_test = y_test.astype(int)


    #y_train = y_train.reshape((y_train.shape[0]))
    #y_test = y_test.reshape((y_test.shape[0]))

    #x_train = x_train.iloc[:,:].values
    #x_test = x_test.iloc[:,:].values

    #y_train = y_train.iloc[:,:].values
    #y_test = y_test.iloc[:,:].values


    return (x_train, y_train, x_test, y_test)

def peptrain(x, y, x_var_test, y_var_test):
    w = np.zeros((x.shape[1]))
    maxiter = []
    errors = []
    train_acc = []
    test_acc = []

    for i in range(5):
        error = 0
        for t in range(x.shape[0]):
            y_cap = np.sign(np.dot(w,x[t]))
            print(y_cap)

            if y_cap == 0:
                y_cap = -1

            if y_cap != y[t]:
                error = error + 1
                w = w + y[t] * x[t]

        errors.append(error)
        maxiter.append(i + 1)

        trainacc = 1 - ( error / x.shape[0] ) 
        testacc = peptest(x_var_test, y_var_test, w) 

        train_acc.append(trainacc)
        test_acc.append(testacc)

    return (train_acc, test_acc, maxiter, errors)

def peptest(x, y, w):
    mistakes = 0
    for t in range(x.shape[0]):
        y_cap = np.sign(np.dot(w,x[t]))
        print(y_cap)

        if y_cap == 0:
            y_cap = -1

        if y_cap != y[t]:
            mistakes = mistakes + 1

    return (1 - (mistakes / x.shape[0])) 

if __name__ == '__main__':

    train_location = "/Users/coraljain/Downloads/fashionmnist/fashion-mnist_train.csv"
    test_location = "/Users/coraljain/Downloads/fashionmnist/fashion-mnist_test.csv"

    x_train, y_train, x_test, y_test = read_dataset(train_location, test_location)
    train_acc, test_acc, maxiter, errors = peptrain(x_train, y_train, x_test, y_test)

Здесь я получаю следующую ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

для следующей части.

if y_cap == 0:

Какой у меня есть вариант? Как мне следует использовать функции all и any?

Если я правильно понял ваш код, это можно исправить следующим образом:

if (y_cap == np.zeros(len(y_cap))).all():

предполагая, что y_cap это numpy array (кстати, предоставление примера для y_cap помогло бы).

Ответ или решение

Решение проблемы с ошибкой при реализации алгоритма персептрона

Вы столкнулись с проблемой при реализации алгоритма классификации с использованием персептрона на наборе данных FASHION-MNIST. Ошибка, с которой вы столкнулись, заключается в строке:

if y_cap == 0:

Эта ошибка (ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()) возникает из-за того, что y_cap является массивом NumPy, а условия в Python не могут обрабатывать массивы без явного указания, как с ними работать (например, использовать все элементы или хотя бы один). Рассмотрим, как можно устранить эту ошибку и улучшить ваш код на языке программирования Python.

Контекст и текущая проблема

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

Решение проблемы

  1. Использование метода .any() или .all(): Если y_cap является массивом (даже одноэлементным), вам нужно определить, проверяете ли вы все элементы или только один из них. Возможно, вам следует заменить:

    if y_cap == 0:

    На:

    if (y_cap == 0).all():

    Это утверждение проверяет все элементы в массиве y_cap на равенство нулю.

  2. Уточните размерность y_cap: Убедитесь, что массив y_cap принимает ожидаемую форму. Если ваша модель предназначена для бинарной классификации, то результат вычисления np.sign(np.dot(w, x[t])) должен сводиться к скаляру, а не массиву.

  3. Устранение неоднозначностей через логические операции: При работе с массивами и их сравнениями используйте логические операции явно, чтобы избежать ошибок.

Технические рекомендации

  • Проверка перед операциями: Убедитесь, что все операторы сравнения применимы к данным правильно. Используйте методы отладки, такие как print(y_cap.shape) или type(y_cap), для проверки формы данных и типа переменной.

  • Конкретизация данных: Если y_cap должен быть скалярным значением, рассмотрите возможность применения методов NumPy, таких как np.squeeze(), для уменьшения размерности.

  • Документирование и валидация: Добавьте подробные комментарии, поясняющие, зачем и где вы используете определённые функции, а так же идеи, стоящие за этими решениями. Это поможет не только вам, но и другим, кто будет работать с кодом позднее.

Заключение

При написании кода с использованием библиотек машинного обучения важно правильно обрабатывать типы данных и помнить о различиях в синтаксисе проверок. Уведомившись об источнике ошибки и применив исправления, вы сможете развивать свой проект в соответствии с заданной целью, создавая надёжный и эффективный классификатор на основе персептрона. Если вы заинтересованы в дальнейших разработках, обратите внимание на более сложные модели и подходы к предобработке данных.

Оцените материал
Добавить комментарий

Капча загружается...