Вопрос по свёрточной сети на Python
Есть, такая модель
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import fashion_mnist
from keras.models import Sequential
from keras.utils import np_utils
from keras.layers.core import Activation
from tensorflow.keras.layers import Dense, Flatten, Dropout, Conv2D, MaxPooling2D
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
# Стандартизируем входные данные
x_train = x_train / 255
x_test = x_test / 255
# Преобразовываем векторы классов в бинарные матрицы классов
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# Добавляем еще одно измерение (одну ось) для цветовой компоненты
x_train = np.expand_dims(x_train, axis=3)
x_test = np.expand_dims(x_test, axis=3)
# Строим модель
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same', activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3,3), padding='same', activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# Обучаем модель
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_split=0.2)
model.evaluate(x_test, y_test)
Хочу ее улучшить, добавив дополнительный сверточный слой
model = Sequential()
model.add(Conv2D(32, (3,3), padding='same', input_shape=(28, 28, 1)))
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()
Результат улучшается на 1%
Добавляю BatchNormalization()
model.add(Conv2D(32, (3,3), padding='same', input_shape=(28, 28, 1)))
BatchNormalization()
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3,3), padding='same'))
BatchNormalization()
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3,3), padding='same'))
BatchNormalization()
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512))
BatchNormalization()
model.add(Activation('relu'))
model.add(Dense(10))
BatchNormalization()
model.add(Activation('softmax'))
model.summary()
Результат снова меня не радует, улучшение не ощутимо ни при добавлении сверточного слоя, ни при добавлении BatchNormalization
Что я делаю не так или же все так и должно быть?