Практическое задание №4
1. Создание сверточной нейронной сети (CNN) на наборе данных CIFAR-10 и визуализация полученных фильтров. Запустите jupyter notebook и создайте тетрадку.
2. Загрузите набор данных CIFAR-10, который содержит 32x32 цветных изображения из 10 классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль, грузовик
from cifar import load_cifar10
x_train,y_train,x_val,y_val,x_test,y_test = load_cifar10("cifar_data",channels_last=True)
cifar10_classes = ["airplane", "automobile", "bird", "cat", "deer",
"dog", "frog", "horse", "ship", "truck"]
3. Подготовьте данные для обучения, нормализуйте их и преобразуйте метки классов в однозначно закодированные векторы. Используйте keras.utils.to_categorical:
4. Определите архитектуру сверточной нейронной сети:
# import necessary building blocks
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation, Dropout
from keras.layers.advanced_activations import LeakyReLU
5. Создайте мини-сверточную сеть со следующей такой архитектурой:
a. входной уровень 3x3 свертки с 10 фильтрами и активация ReLU
b. 3x3 pooling (или установите предыдущий шаг свертки на 3)
c. Dense слой с 100-нейронами и активация ReLU
d. 10% dropout
e. Выходной dense слой.
6. Определите модель, которая принимает (None, 32, 32, 3) входные данные и прогнозирует (None, 10) выходные данные с вероятностями для всех классов. Простые сети прямой связи в Keras можно определить следующим образом:
model = Sequential() # start feed-forward model definition
model.add(Conv2D(..., input_shape=(32, 32, 3))) # first layer needs to define "input_shape"
... # here comes a bunch of convolutional, pooling and dropout layers
model.add(Dense(NUM_CLASSES)) # the last layer with neuron for each class
model.add(Activation("softmax")) # output probabilities
7. Обучите модель. Во время обучения вы должны наблюдать снижение заявленных потерь при обучении и валидации. Если потери на тренировках не уменьшаются с эпохами, следует пересмотреть определение модели и скорость обучения:
INIT_LR = 5e-3 # initial learning rate
K.clear_session() # clear default graph
# don't call K.set_learning_phase() !!! (otherwise will enable dropout in train/test simultaneously)
model = make_model() # define our model
# prepare model for fitting (loss, optimizer, etc)
loss='categorical_crossentropy', # we train 10-way classification
optimizer=keras.optimizers.adamax(lr=INIT_LR), # for SGD
metrics=['accuracy'] # report accuracy during training
x_train2, y_train2, # prepared data
validation_data=(x_val, y_val),
8. Протестируйте получившуюся модель:
y_pred_test = model.predict_proba(x_test)
y_pred_test_classes = np.argmax(y_pred_test, axis=1)
y_pred_test_max_probas = np.max(y_pred_test, axis=1)
9. Визуализируйте полученные моделью фильтры:
fig = plt.figure(figsize=(2 * cols - 1, 3 * rows - 1))
random_index = np.random.randint(0, len(y_test))
ax = fig.add_subplot(rows, cols, i * rows + j + 1)
ax.imshow(x_test[random_index, :])
pred_label = cifar10_classes[y_pred_test_classes[random_index]]
pred_proba = y_pred_test_max_probas[random_index]
true_label = cifar10_classes[y_test[random_index]]
ax.set_title("pred: {}\nscore: {:.3}\ntrue: {}".format(
pred_label, pred_proba, true_label
2. Задачи для самостоятельной работы:
a. Увеличить точность полученной модели. Для этого, воспользуйтесь продвинутыми техниками и нахождением подходящих гиперпараметров: таких как изменение размера последовательности, количества слоев сети.
b. Реализуйте «Уменьшенную / ускоренную нейронную сеть», достигающую 80% точности с подробным анализом результатов, таких как карты значимости