Вопрос или проблема
Я новичок и проектирую бинарный классификатор, используя алгоритм Перцептрона на датасете 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
, скорее всего, является массивом, что требует обработки каждого его элемента.
Решение проблемы
-
Использование метода
.any()
или.all()
: Еслиy_cap
является массивом (даже одноэлементным), вам нужно определить, проверяете ли вы все элементы или только один из них. Возможно, вам следует заменить:if y_cap == 0:
На:
if (y_cap == 0).all():
Это утверждение проверяет все элементы в массиве
y_cap
на равенство нулю. -
Уточните размерность
y_cap
: Убедитесь, что массивy_cap
принимает ожидаемую форму. Если ваша модель предназначена для бинарной классификации, то результат вычисленияnp.sign(np.dot(w, x[t]))
должен сводиться к скаляру, а не массиву. -
Устранение неоднозначностей через логические операции: При работе с массивами и их сравнениями используйте логические операции явно, чтобы избежать ошибок.
Технические рекомендации
-
Проверка перед операциями: Убедитесь, что все операторы сравнения применимы к данным правильно. Используйте методы отладки, такие как
print(y_cap.shape)
илиtype(y_cap)
, для проверки формы данных и типа переменной. -
Конкретизация данных: Если
y_cap
должен быть скалярным значением, рассмотрите возможность применения методов NumPy, таких какnp.squeeze()
, для уменьшения размерности. -
Документирование и валидация: Добавьте подробные комментарии, поясняющие, зачем и где вы используете определённые функции, а так же идеи, стоящие за этими решениями. Это поможет не только вам, но и другим, кто будет работать с кодом позднее.
Заключение
При написании кода с использованием библиотек машинного обучения важно правильно обрабатывать типы данных и помнить о различиях в синтаксисе проверок. Уведомившись об источнике ошибки и применив исправления, вы сможете развивать свой проект в соответствии с заданной целью, создавая надёжный и эффективный классификатор на основе персептрона. Если вы заинтересованы в дальнейших разработках, обратите внимание на более сложные модели и подходы к предобработке данных.