This commit is contained in:
Daria Vodzinska 2020-06-15 01:40:37 +00:00
parent 0b6b08f7ae
commit ec0d6b9aa0

174
sieci.md
View File

@ -1,89 +1,85 @@
# Temat podptojektu: # Temat podptojektu:
Stworzenie sieci neuronowej, która rozpoznaje odręcznie napisaną na paczce liczbę, która oznacza producenta paczki. Stworzenie sieci neuronowej, która rozpoznaje odręcznie napisaną na paczce liczbę, która oznacza producenta paczki.
# Uczenie modelu # Uczenie modelu
## Dane wejściowe: ## Dane wejściowe:
### Pakiet Keras MNIST: ### Pakiet Keras MNIST:
- dwa pliki: - dwa pliki:
- Plik z obrazkami - Plik z obrazkami
- Plik z poprawnymi odpowiedziami - Plik z poprawnymi odpowiedziami
### Format obrazków: ### Format obrazków:
- rozmiar 28x28 - rozmiar 28x28
- odcienie szarości (0-biały, 255- czarny) - odcienie szarości (0-biały, 255- czarny)
- obrazki w postaci binarnej są zapisane w jeden plik - obrazki w postaci binarnej są zapisane w jeden plik
## Praca z pakietem: ## Praca z pakietem:
1. Zdefiniowano dane treningowe: tensory wejściowe i tensory wartości docelowych. 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. 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. 3. Skonfigurowano proces uczenia, wybierając funkcję straty, optymalizator i monitorowane metryki.
4. Wykonano iteracje procesu uczenia na danych treningowych, wywołując metodę 4. Wykonano iteracje procesu uczenia na danych treningowych, wywołując metodę
fit() zdefiniowanego modelu fit() zdefiniowanego modelu
# Proces uczenia # Proces uczenia
-ustawiam seed, aby powtarzać wyniki -ustawiam seed, aby powtarzać wyniki
-pobieram dane -pobieram dane
- konwertuję wymiary obrazu - konwertuję wymiary obrazu
- normalizuję dane - normalizuję dane
- konwertuję etykiety w kategorie - konwertuję etykiety w kategorie
## Inicjalizuję sieć neuronową (sieć sekwencyjna). ## Inicjalizuję sieć neuronową (sieć sekwencyjna).
model = Sequential() model = Sequential()
model.add(Conv2D(75, kernel_size=(5, 5), model.add(Conv2D(75, kernel_size=(5, 5),
activation='relu', activation='relu',
input_shape=input_shape)) input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2))) model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2)) model.add(Dropout(0.2))
model.add(Conv2D(100, (5, 5), activation='relu')) model.add(Conv2D(100, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2)) model.add(Dropout(0.2))
model.add(Flatten()) model.add(Flatten())
model.add(Dense(500, activation='relu')) model.add(Dense(500, activation='relu'))
model.add(Dropout(0.5)) model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax')) model.add(Dense(10, activation='softmax'))
### Dołączam kolejno warstwy: ### Dołączam kolejno warstwy:
- Conv2D - mnoży obrazek przez macierz 2x2 - Conv2D - mnoży obrazek przez macierz 2x2
- activation='relu' - zeruje negatywne wyniki (funkcja aktuwacji) - activation='relu' - zeruje negatywne wyniki (funkcja aktuwacji)
- MaxPooling2D - zmienia rozdzielczość zdjęcia - MaxPooling2D - zmienia rozdzielczość zdjęcia
- Droupout - ogranicza nadmierne dopasowanie - Droupout - ogranicza nadmierne dopasowanie
- Flatten - spłaszcza macierz do wektora - Flatten - spłaszcza macierz do wektora
- Dense(10) - decyduje o przynależności zdjęcia do kategorii (cyfry od 0 do 9) - 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 Activation='soft-max' - zwraca rozkład prawdopodobieństwa 10 różnych klas
## Kompilacja modelu: ## Kompilacja modelu:
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
Funkcja straty - "catecorical_crossentropy" Funkcja straty - "catecorical_crossentropy"
Optymalizator - "Adam" Optymalizator - "Adam"
Monitorowanie dokładności - "accuracy" Monitorowanie dokładności - "accuracy"
## Trenowanie modelu: ## Trenowanie modelu:
model.fit(X_train, Y_train, batch_size=200, epochs=10, validation_split=0.2, verbose=1) model.fit(X_train, Y_train, batch_size=200, epochs=10, validation_split=0.2, verbose=1)
trenuję model za pomocą funkcji fit() trenuję model za pomocą funkcji fit()
### Pokazuję dokładność pracy na testowanych rannych ### Pokazuję dokładność pracy na testowanych rannych
scores = model.evaluate(X_test, Y_test, verbose=0) scores = model.evaluate(X_test, Y_test, verbose=0)
print("Dokadnosc na testowanych dannych: %.2f%%" % (scores[1]*100)) print("Dokadnosc na testowanych dannych: %.2f%%" % (scores[1]*100))
# Integracja z projektem # Integracja z projektem
Tworzę model i ładuję wagi nauczonego modelu. Tworzę model i ładuję wagi nauczonego modelu.
image_cl = Sequential() nmodel = Sequential()
ImageClass(image_cl) imageClass(nmodel)
image_cl.load_weights('model_weights.h5') 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. Po podniesieniu paczki odpalana jest funkcja imgSkan(), która z czytuje ręcznie napisaną cyfrę i wpisuje nr producenta paczki.
def imgSkan(): def imgSkan():
img = files.upload() img_width, img_height = 28, 28
!ls new_image = load_img('cyfra.png', target_size=(img_width, img_height), color_mode = "grayscale")
img_path = '2.png' new_image = img_to_array(new_image)
img = image.load_img(img_path, target_size=(28, 28), color_mode = "grayscale") new_image = new_image.reshape((1,) + new_image.shape)
plt.imshow(img.convert('RGBA'))
plt.show() prediction = nmodel.predict(new_image)
x = image.img_to_array(img) prediction = numpy.argmax(prediction)
x = np.expand_dims(x, axis=0) print("Producent:", prediction)
x = 255 - x producent.append(prediction)
x /= 255
prediction = model.predict(x)
prediction = np.argmax(prediction)
print("Cyfra:", prediction)