Вопрос по свёрточной сети на 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

Что я делаю не так или же все так и должно быть?


Ответы (0 шт):