Model ML w CNN, zawsze to samo przewidywanie

Model ML w CNN, zawsze to samo przewidywanie
M1
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:33
0

Cześć

Czy zajmuje się ktoś tutaj CNN i ML ?
Posiadam wytrenowaną sieć neuronową która w zbiorze danych testowych pokazuje że potrafi dokonać przewidywania z 70% skutecznością spośród 5 klas.

W każdym folderze znajduje się 5 klas: ['car', 'cat', 'chicken', 'dog', 'horse']
Trening: 5x2000 zdjęć
Walidacja 5x500

i test na koniec 5x50

Kopiuj

img_height, img_width = 150, 150
batch_size_train = 100
batch_size_validation = 50
batch_size_test = 10
epochs = 10

train_ds = tf.keras.utils.image_dataset_from_directory(
    "train",
    image_size=(img_height, img_width),
    batch_size=batch_size_train
)
val_ds = tf.keras.utils.image_dataset_from_directory(
    "validation",
    image_size=(img_height, img_width),
    batch_size=batch_size_validation
)
test_ds = tf.keras.utils.image_dataset_from_directory(
    "test",
    image_size=(img_height, img_width),
    batch_size=batch_size_validation
)


model = tf.keras.Sequential(
    [
        tf.keras.layers.Rescaling(1. / 255),
        tf.keras.layers.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)),
        tf.keras.layers.RandomRotation(0.3),
        tf.keras.layers.RandomZoom(0.3),
        tf.keras.layers.Conv2D(16, 3, activation="relu"),
        tf.keras.layers.MaxPooling2D(),
        tf.keras.layers.Conv2D(32, 3, activation="relu"),
        tf.keras.layers.MaxPooling2D(),
        tf.keras.layers.Conv2D(64, 3, activation="relu"),
        tf.keras.layers.MaxPooling2D(),
        tf.keras.layers.Conv2D(128, 3, activation="relu"),
        tf.keras.layers.MaxPooling2D(),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(64, activation="relu"),
        tf.keras.layers.Dense(64, activation="relu"),
        tf.keras.layers.Dense(5, activation='softmax')
    ]
)


model.compile(
    optimizer="adam",
    loss=tf.losses.SparseCategoricalCrossentropy(from_logits=False),
    metrics=['accuracy']
)

history = model.fit(
    train_ds,
    validation_data=val_ds,
    epochs=epochs
)

model.evaluate(test_ds)

Problem w tym że po zapisaniu modelu i skonwertowania go do .TFLITE

Kopiuj

model.save(foldername + '/' + 'myModel.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

with open(foldername + "/model.tflite", 'wb') as f:
    f.write(tflite_model)

Jak wykonam jakieś przewidywania i podaje przykładowe obrazki (nawet bezpośrednio z trenignu), ale należące bezpośrednio do klas to wyniki zazwyczaj są zbliżone do tych samych

I w większym przypadku wskazują na jedną klasę, natomiast reszta jest z zbliżonym prawdopodobieństwem

Jest mniej więcej tak na klasy: [15% 40% 15% 15% 15%]

Ktoś wie z czego może to wynikać ? Jak temu zaradzić ? Albo gdzie jest błąd w procesie uczenia że zawsze wskazuje na te same klasy
Był bym wdzięczny za pomoc

gif.jpg

  • gif.jpg (46 KB) - ściągnięć: 5
Eldorad O.
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:517
0

@Maciej123321: Być może dysproporcja danych treningowych.
Masz więcej dajmy na to zdjęć kotów i model nauczył się klasyfikować każde zdjęcie jako kota, ponieważ daje to największe prawdopodobieństwo
prawidłowej klasyfikacji.

Jak wykonam jakieś przewidywania i podaje przykładowe obrazki (nawet bezpośrednio z trenignu)

Nie testuje się modeli na danych treningowych.

edytowany 2x, ostatnio: Eldorad O.
M1
Hej, znaczy jest 5x 2000 zdjęć z każdej klasy. 2000 kotów, psów koni itd
Eldorad O.
Ok, to teraz pytanie, bo nie wiem czy dobrze zrozumiałem, za każdym razem gdy wrzucisz dowolne zdjęcie do klasyfikatora otrzymujesz wyniki: [15% 40% 15% 15% 15%] Tak?
M1
oczywiście to jest softmax, więc zwraca swoje wartości np: [4.9049326e-05 9.5814574e-01 6.7946487e-03 3.1311907e-02 3.6987378e-03] albo [4.7902806e-05 9.5800018e-01 6.8057855e-03 3.1406440e-02 3.7395945e-03] Ale ja to przeliczam exp(x)/sume(exp(i)) w skrócie i proporcje zazwyczaj wychodzą takie same czyli te 15 40 15 15 15 po przeliczeniu
M1
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:33
0

Cześć, trochę to trwało ale gdzieś na stackoverflow znalazłem że może to być problem z samym Keras i żeby nie używać tego sposobu który ja użyłem

Kopiuj


from tensorflow.keras.models import Sequential #importing our deep learing libraries
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Activation, RandomFlip
from tensorflow.keras.preprocessing.image import ImageDataGenerator

model = Sequential() #making our CNN
        model.add(RandomFlip(mode="horizontal", input_shape=(150,150,3)))
        model.add(Conv2D(filters=8, kernel_size=(3, 3), activation='relu'))
        model.add(MaxPooling2D(pool_size = (2, 2)))
        model.add(Conv2D(filters = 16, kernel_size = (3, 3), activation = 'relu'))
        model.add(MaxPooling2D(pool_size = (2, 2)))
        model.add(Conv2D(filters = 32, kernel_size = (3, 3), activation = 'relu'))
        model.add(MaxPooling2D(pool_size = (2, 2)))
        model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Flatten())
        model.add(Dense(units = 64, activation = 'relu'))
        model.add(Dense(units = 64, activation = 'relu'))
        model.add(Dense(units = 5, activation = 'softmax'))
        model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

Dopiero takie użycie podziałało i faktycznie model kompiluje się dobrze

Mam jeszcze jedno ostatnie pytanie, ktoś wie jak ustalać parametry batch_size w data_generatorze oraz w fit_generatorze ?
Tak aby wydusić jak najwięcej z naszego modelu ? Da się to jakoś uzależnić od ilości danych wejściowych tak żeby użyć 100% ich albo zbliżonej ilości ?

Kopiuj
  training_data = data_generator.flow_from_directory(directory=dir + 'train',
                                                       target_size=(150, 150),
                                                       batch_size=32,
                                                       class_mode='binary')
   testing_data = data_generator.flow_from_directory(directory=dir + 'validation',
                                                      target_size=(150, 150),
                                                      batch_size=32,
                                                      class_mode='binary')

   fitted_model = model.fit_generator(training_data,
                                       steps_per_epoch=batch_size_train,
                                       epochs=epochs,
                                       validation_data=testing_data,
                                       validation_steps=batch_size_validation)

Wywala mi to zawsze tak samo że:
Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 2000 batches)

ale, nie wiem o które mu chodzi.
I np jak mam 2000 na treining obrazów dla danej kategorii i 500 dla walidacji to jak to rozbić na 10 epok żeby przeleciały wszystkie ?
Z góry dziękuję za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.