SI_2020/sieci.md
2020-06-08 12:02:17 +00:00

3.4 KiB

Temat podptojektu:

Stworzenie sieci neuronowej, która rozpoznaje odręcznie napisaną na paczce liczbę, która oznacza producenta paczki.

Uczenie modelu

Dane wejściowe:

Pakiet Keras MNIST:

  • dwa pliki: - Plik z obrazkami - Plik z poprawnymi odpowiedziami

Format obrazków:

  • rozmiar 28x28
  • odcienie szarości (0-biały, 255- czarny)
  • obrazki w postaci binarnej są zapisane w jeden plik

Praca z pakietem:

  1. Zdefiniowano dane treningowe: tensory wejściowe i tensory wartości docelowych.
  2. Zdefiniowano warstwy sieci (lub modelu) przypisującej dane wejściowe do docelowych wartości.
  3. Skonfigurowano proces uczenia, wybierając funkcję straty, optymalizator i monitorowane metryki.
  4. Wykonano iteracje procesu uczenia na danych treningowych, wywołując metodę fit() zdefiniowanego modelu

Proces uczenia

-ustawiam seed, aby powtarzać wyniki -pobieram dane

  • konwertuję wymiary obrazu
  • normalizuję dane
  • konwertuję etykiety w kategorie

Inicjalizuję sieć neuronową (sieć sekwencyjna).

model = Sequential()
model.add(Conv2D(75, kernel_size=(5, 5),
             activation='relu',
             input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(100, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

Dołączam kolejno warstwy:

  • Conv2D - mnoży obrazek przez macierz 2x2
  • activation='relu' - zeruje negatywne wyniki (funkcja aktuwacji)
  • MaxPooling2D - zmienia rozdzielczość zdjęcia
  • Droupout - ogranicza nadmierne dopasowanie
  • Flatten - spłaszcza macierz do wektora
  • Dense(10) - decyduje o przynależności zdjęcia do kategorii (cyfry od 0 do 9) Activation='soft-max' - zwraca rozkład prawdopodobieństwa 10 różnych klas

Kompilacja modelu:

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Funkcja straty - "catecorical_crossentropy" Optymalizator - "Adam" Monitorowanie dokładności - "accuracy"

Trenowanie modelu:

model.fit(X_train, Y_train, batch_size=200, epochs=10, validation_split=0.2, verbose=1)

trenuję model za pomocą funkcji fit()

Pokazuję dokładność pracy na testowanych rannych

scores = model.evaluate(X_test, Y_test, verbose=0)
print("Dokadnosc na testowanych dannych: %.2f%%" % (scores[1]*100))

Integracja z projektem

Tworzę model i ładuję wagi nauczonego modelu.

image_cl = Sequential()
ImageClass(image_cl)
image_cl.load_weights('model_weights.h5')

Po podniesieniu paczki odpalana jest funkcja imgSkan(), która z czytuje ręcznie napisaną cyfrę i wpisuje nr producenta paczki.

def imgSkan():
    img = files.upload()
    !ls
    img_path = '2.png'
    img = image.load_img(img_path, target_size=(28, 28), color_mode = "grayscale")
    plt.imshow(img.convert('RGBA'))
    plt.show()
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = 255 - x
    x /= 255
    prediction = model.predict(x)
    prediction = np.argmax(prediction)
    print("Cyfra:", prediction)