# 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)