Model ML w CNN, zawsze to samo przewidywanie

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


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


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

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.

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



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 ?

  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

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