На этом шаге мы рассмотрим пример такой визуализации.
Визуализация промежуточных активаций заключается в отображении карт признаков, которые выводятся разными сверточными и объединяющими слоями в сети в ответ на определенные входные данные (вывод слоя, результат функции активации, часто его называют активацией). Этот прием позволяет увидеть, как входные данные разлагаются на разные фильтры, полученные сетью в процессе обучения. Обычно для визуализации используются карты признаков с тремя измерениями: шириной, высотой и глубиной (каналы цвета). Каналы кодируют относительно независимые признаки, поэтому для визуализации этих карт признаков предпочтительнее строить двумерные изображения для каждого канала в отдельности. Начнем с загрузки модели, сохраненной в шагах, начиная с 209 шага:
from tensorflow import keras model = keras.models.load_model( "convnet_from_scratch_with_augmentation.keras") model.summary() Model: "functional_1" Layer (type) Output Shape Param # input_layer_1 (InputLayer) (None, 180, 180, 3) 0 sequential (Sequential) (None, 180, 180, 3) 0 rescaling (Rescaling) (None, 180, 180, 3) 0 conv2d (Conv2D) (None, 178, 178, 32) 896 max_pooling2d (MaxPooling2D) (None, 89, 89, 32) 0 conv2d_1 (Conv2D) (None, 87, 87, 64) 18,496 max_pooling2d_1 (MaxPooling2D) (None, 43, 43, 64) 0 conv2d_2 (Conv2D) (None, 41, 41, 128) 73,856 max_pooling2d_2 (MaxPooling2D) (None, 20, 20, 128) 0 conv2d_3 (Conv2D) (None, 18, 18, 256) 295,168 max_pooling2d_3 (MaxPooling2D) (None, 9, 9, 256) 0 conv2d_4 (Conv2D) (None, 7, 7, 256) 590,080 flatten (Flatten) (None, 12544) 0 dropout (Dropout) (None, 12544) 0 dense (Dense) (None, 1) 12,545 Total params: 1,982,084 (7.56 MB) Trainable params: 991,041 (3.78 MB) Non-trainable params: 0 (0.00 B) Optimizer params: 991,043 (3.78 MB)
Далее выберем входное изображение кошки, не являющееся частью обучающего набора.
from tensorflow import keras import numpy as np def get_img_array(img_path, target_size): # Открыть файл с изображением и изменить его размер img = keras.utils.load_img( "8000.jpg", target_size=target_size) # Преобразовать изображение в массив NumPy типа # float32 с формой (180, 180, 3) array = keras.utils.img_to_array(img) # Добавить измерение для преобразования массива в "пакет" с # единственным образцом. Теперь он имеет форму (1, 180, 180, 3) array = np.expand_dims(array, axis=0) return array img_tensor = get_img_array("", target_size=(180, 180))
Отобразим исходное изображение (рисунок 1).
import matplotlib.pyplot as plt plt.axis("off") plt.imshow(img_tensor[0].astype("uint8")) plt.show()
Рис.1. Контрольное изображение кошки
На следующем шаге мы закончим изучение этого вопроса.