Klasyfikator obrazow z bibioletki CIFAR-10 nie chce sie uczyc

0

Witam,
pisze klasyfikator obrazow z biblioteki CIFAR-10, chce wykorzystac tylko 2 z 10 klasow z tej biblioteki. Dziele dane na dwie klasy i podczas uczenia wyrzuca mi błąd: ValueError: Data cardinality is ambiguous; x sizes: 32, 32 , 32 ... y sizes: 10, 10, 10 ... Make sure all arrays contain the same number of samples. Gdy ucze na danych nie podzielony na 2 klasy model uczy sie prawidłowo.

from keras.datasets import cifar10
from matplotlib import pyplot as plt
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split


data = cifar10.load_data()

X=data[0][0].astype('float32') / 255.0
y=to_categorical(data[0][1])

X_new = []
y_new = []

# Biore tylko dane z klasy 1 i 2
for x_change,y_change in zip (X, y):
  if y_change[0] == 1 or y_change[1] == 1:
    X_new.append(x_change)
    y_new.append(y_change)

X_train, X_test, y_train, y_test = train_test_split(X_new, y_new, test_size=0.3)
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten


model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))



model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=30, batch_size=64, validation_data=(X_test, y_test))
1
  1. Jeżeli kopiujesz jakieś elementy z tensora do tablicy, to pamiętaj żeby tę tablicę przekonwertować
    na tensor/tablicę numpy, bo później wyskakują jakieś kwiatki.
    Najlepiej to zastanów się jak wykonać podział danych za pomocą numpyowego slicingu bez pomocy pętli, tak jak to zrobiłem.

  2. Warstwa wyjściowa nie może posiadać 1 neuronu, ponieważ wektor etykiet ma 10 wymiarów, więc wyjściowa warstwa
    również musi posiadać 10 neuronów.


from keras.datasets import cifar10
from matplotlib import pyplot as plt
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split

data = cifar10.load_data()

X=data[0][0].astype('float32') / 255.0
y=to_categorical(data[0][1])

choosen_samples = (y[:, 0] == 1) | (y[:, 1] == 1)
X_new = X[choosen_samples]
y_new = y[choosen_samples]
  
X_train, X_test, y_train, y_test = train_test_split(X_new, y_new, test_size=0.3)

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=30, batch_size=64, validation_data=(X_test, y_test))

1 użytkowników online, w tym zalogowanych: 0, gości: 1