Skip to content

Instantly share code, notes, and snippets.

@PaulChristmas
Last active December 24, 2018 20:29
Show Gist options
  • Save PaulChristmas/2f7ff4bb5af96a02ec9bb15cacd0b1b2 to your computer and use it in GitHub Desktop.
Save PaulChristmas/2f7ff4bb5af96a02ec9bb15cacd0b1b2 to your computer and use it in GitHub Desktop.
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