Last active
December 24, 2018 20:29
-
-
Save PaulChristmas/2f7ff4bb5af96a02ec9bb15cacd0b1b2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
from keras.models import Sequential | |
from keras.layers import Dense, Dropout, Activation, Flatten | |
from keras.layers import MaxPooling2D, Conv2D | |
from keras.utils import np_utils | |
from keras.datasets import fashion_mnist | |
# Задаем для воспроизводимости результатов | |
np.random.seed(512) | |
#=================== Загрузка данных ===================# | |
data = fashion_mnist.load_data() | |
train = data[0] | |
test = data[1] | |
X_train = train[0] | |
y_train = train[1] | |
X_test = test[0] | |
y_test = test[1] | |
#=========== Предварительная обработка данных ==========# | |
# Размерность каналов окраски изображения, 1 канал для ЧБ, 3 канала для RGB | |
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1) | |
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1) | |
# uint8 -> float32 | |
X_train = X_train.astype('float32') | |
X_test = X_test.astype('float32') | |
# Нормализация пиксельных данных | |
X_train /= 255 | |
X_test /= 255 | |
# Переход от вектора классов к бинарной матрице классов n x 10 (необходимо для дальнейшей модели) | |
Y_train = np_utils.to_categorical(y_train, 10) | |
Y_test = np_utils.to_categorical(y_test, 10) | |
#============ Определение архитектуры модели ===========# | |
# Создаём модель нейронной сети | |
model = Sequential() | |
# Два сверточных слоя, 32 - размерность выходного пространства, количество выходных фильтров в свертке | |
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28,28,1))) | |
model.add(Conv2D(32, (3, 3), activation='relu')) | |
# Maxpooling с фильтром 2 х 2, урезаем размерность вдвое (24, 24, 32) -> (12, 12, 32) | |
model.add(MaxPooling2D(pool_size=(2,2))) | |
model.add(Dropout(0.25)) | |
# Переходим от многомерного массива к вектору (None, 12, 12, 32) -> (None, 12x12x32=4608) | |
model.add(Flatten()) | |
#Первые числа, передаваемые Dense, это количества нейронов, экспериментально оптимизированные в результате вариации структуры нейронной сети | |
#Т.Е. размерность выходного пространства | |
model.add(Dense(128, activation='relu')) | |
model.add(Dropout(0.5)) | |
model.add(Dense(10, activation='softmax')) | |
#=========== Компилирование и обучение модели ==========# | |
# Метрика accuracy используется практически для всех задач классификации, она работает для многоклассовой классификации, | |
# имеет низкую вычислительную сложность. | |
# Функция потерь – объект, который модель стремиться минимизировать. Используется сategorical_crossentropy так как больше двух классов, | |
# иначе использовали бы бинарную кроссэнтропию. | |
model.compile(loss='categorical_crossentropy', | |
optimizer='adam', | |
metrics=['accuracy']) | |
# epoch - максимальное количество эпох до остановки | |
# batch_size - количество объектов выборки берущихся за одну итерацию | |
model.fit(X_train, Y_train, | |
batch_size=32, epochs=5, verbose=1) | |
#=================== Проверка точности =================# | |
# evaluate() -> значение функции потерь + метрики для обученной модели | |
score = model.evaluate(X_test, Y_test, verbose=0) | |
print("\n%s: %.2f%%" % (model.metrics_names[1], score[1]*100)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment