DSZI_Survival/NeuralNetwork.md
2020-06-08 14:52:37 +02:00

2.8 KiB

DSZI_Survival - Sieć Neuronowa

Autor: Jonathan Spaczyński

Cel zastosowania w projekcie

W projekcie DSZI_Survival sieć neuronowa użyta jest do podejmowania decyzji przez agenta. Decyzja polega na rozpoznawaniu zdjęć owoców (jabłka i gruszki). W przypadku nie rozpoznania owocu przez agenta, dochodzi do zatrucia i agent umiera/przegrywa.

Przygotowanie danych

  • Krok 1 Przechowywane zdjęcia owoców muszą przejść przez proces zamiany zdjęcia (.jpg) na dane, które mogą być wykorzystane przez sieć neuronową.
CATEGORIES = ["Apple", "Pear"]
IMG_SIZE = 64

training_data = []


def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass

zdjęcia są przechowywane w tablicy training_data wraz z klasyfikacją (class_num) odpowiadającą jakim typem owocu jest zdjęcie

  • Krok 2 Bardzo ważnym krokiem jest pomieszanie danych. W przeciwnym wypadku nasz model po ciągłym otrzymywanie danych reprezentujących tylko jedną kategorię owoców mógłby się wyuczyć, aby tylko zgadywać tą kategorię.
random.shuffle(training_data)
  • Krok 3 Ostatnim krokiem jest zaktualizowanie danych w taki sposób żeby były z przedziału od 0 d 255 (reprezentacja koloru danego pixela)
X = X / 255.0

Kilka słów na temat danych

  • Ilość Danych Do trenowania modelu wykorzystałem 8568 zdjęć gruszek i jabłek z czego mniej więcej połowa danych była jednym z typów ww. owoców, a druga połowa reprezentowała pozostałą kategorią
  • Dane wykorzystane do obliczenia skutecznośći stanowiły małą i oddzielną część danych wykorzystanych do trenowania.

Model

  • Dane wejściowe: Dane o kształcie 64x64 reprezentujące pixele w zdjęciach owoców
  • Warstwa ukryta: Składająca się z 128 "neuronów" wykorzystującą sigmoid jako funkcję aktywacyjną
  • Warstwa wyjściowa: Składająca się z 2 "neuronów" reprezentujących gruszkę i jabłko
  • Stała ucząca: 0.001
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(64, 64)),
    tf.keras.layers.Dense(128, activation=tf.nn.sigmoid),
    tf.keras.layers.Dense(2, activation=tf.nn.sigmoid)
    ])

model.compile(tf.keras.optimizers.Adam(lr=0.001),
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])

Osiągniecia modelu

  • Trafność: 86.4%
  • Strata: 0.312