SI_2020/sieci.md

86 lines
3.2 KiB
Markdown
Raw Normal View History

2020-06-15 03:40:37 +02:00
# 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.
nmodel = Sequential()
imageClass(nmodel)
nmodel.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_width, img_height = 28, 28
new_image = load_img('cyfra.png', target_size=(img_width, img_height), color_mode = "grayscale")
new_image = img_to_array(new_image)
new_image = new_image.reshape((1,) + new_image.shape)
prediction = nmodel.predict(new_image)
prediction = numpy.argmax(prediction)
print("Producent:", prediction)
producent.append(prediction)