Feature Map Pada Convolutional Neural Network (CNN)

Alfi Salim
BISA.AI
Published in
6 min readMay 19, 2020
Photo by BeyondTimelines on Pixbay

Setelah membahas filter pada Convolutional Neural Network (CNN), pada tulisan ini, saya akan membahas materi mengenai Feature Map. Sederhananya, Feature Map atau Activation Map merupakan output dari proses konvolusi. Proses konvolusi merupakan proses perkalian antara nilai input dengan filter.

Untuk lebih memahami bagaimana CNN bekerja, Visualisasi adalah salah satu pendekatan yang tepat. Melalui visualisasi kita bisa memahami, membandingkan hingga melakukan tindakan yang lebih lanjut agar model dapat bekerja lebih baik lagi. Salah satu hal yang dapat divisualisasikan adalah Feature Map.

Melalui feature map, kita bisa menganalisis klasifikasi berdasarkan wilayah dari berbagai aspek, yang ortogonal terhadap investigasi fitur [1].

Tujuan dari memvisualisasikan feature map adalah agar dapat memahami apa saja fitur dari input yang terdeteksi atau yang dipertahankan oleh model. Umumnya, semakin dalam layer maka semakin umum fitur yang akan diambil. Jadi, pada layer pertama setelah input, fitur yang diambil akan sangat detail.

Berikut merupakan contoh dari visualisasi yang dilakukan [2] melalui beberapa model arsitektur:

Dari gambar di atas, dapat kita lihat bahwa tingkat kesalahan yang lebih kecil berbanding lurus dengan fitur-fitur yang lebih tajam yang berkontribusi pada hasil klasifikasi akhir. Hal tersebut dapat dilihat dari hasil terbaik dalam visualisasi dari piksel hitam dan putih untuk gambar pesawat luar angkasa.

Gambar di atas merupakan contoh yang sangat baik tentang bagaimana metode visualisasi dapat memfasilitasi pemahaman tentang kinerja arsitektur jaringan yang berbeda. Selain itu, perlu dicatat bahwa sebagian besar teknik visualisasi tidak terbatas pada tugas klasifikasi [2].

Pada tulisan ini, kita akan mencoba untuk memvisualisasikan feature map secara sederhana menggunakan CNN dengan arsitektur model dari VGG16.

Implementasi Code

Langkah awalnya adalah kita bangun sebuah model. Pada tulisan ini, kita menggunakan model yang telah disediakan oleh library Keras, yaitu model VGG16. Untuk membangun model VGG16, ikuti kode berikut:

from keras.applications.vgg16 import VGG16model = VGG16()
model.summary()

Import model VGG16 dari library keras, kemudian inisialisasi variabel model sebagai model VGG16. Untuk mengetahui rangkuman dari model yang telah dibangun, gunakan perintah model.summary(). Adapun hasil dari rangkuman model dapat dilihat sebagai berikut:

Model: "vgg16" _________________________________________________________________ Layer (type)                 Output Shape              Param #    ================================================================= input_2 (InputLayer)         (None, 224, 224, 3)       0          _________________________________________________________________ block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792       _________________________________________________________________ block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928      _________________________________________________________________ block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0          _________________________________________________________________ block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856      _________________________________________________________________ block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584     _________________________________________________________________ block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0          _________________________________________________________________ block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168     _________________________________________________________________ block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080     _________________________________________________________________ block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080     _________________________________________________________________ block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0          _________________________________________________________________ block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160    _________________________________________________________________ block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808    _________________________________________________________________ block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808    _________________________________________________________________ block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0          _________________________________________________________________ block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808    _________________________________________________________________ block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808    _________________________________________________________________ block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808    _________________________________________________________________ block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0          _________________________________________________________________ flatten (Flatten)            (None, 25088)             0          _________________________________________________________________ fc1 (Dense)                  (None, 4096)              102764544  _________________________________________________________________ fc2 (Dense)                  (None, 4096)              16781312   _________________________________________________________________ predictions (Dense)          (None, 1000)              4097000    ================================================================= Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0 _________________________________________________________________

Kita bisa memanfaatkan informasi yang diberikan dari rangkuman model di atas. Informasi yang perlu kita ketahui diantaranya adalah index dari tiap-tiap layer konvolusi dan masing-masing output shape-nya, sehingga kita bisa membuat model baru dengan input yang sama dengan model awal namun dengan output yang telah kita sesuaikan untuk menampilkan feature map.

Selanjutnya untuk dapat memvisualisasikan feature map dari model, kita memerlukan sebuah input berupa gambar. Pada tulisan ini, saya akan memberi input berupa gambar kucing.

Adapun kode nya sebagai berikut:

from keras.applications.vgg16 import preprocess_input
import numpy as np
import cv2
img = cv2.imread('Kucing.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (224,224))
img = np.array(img)
img = np.expand_dims(img, axis=0)
img = preprocess_input(img)
feature_map = model.predict(img)

Kita akan menghasilkan feature map pada layer konvolusi pertama dari model dengan gambar inputnya adalah kucing.

  1. Import semua library yang dibutuhkan, yaitu library preprocess_input dari Keras, library opencv (cv2) dan library numpy
  2. Buka gambar menggunakan library opencv dengan fungsi cv2.imread()
  3. Karena default dari membuka gambar melalui opencv adalah gambar dengan format BGR, maka konversi terlebih dahulu menjadi format RGB dengan fungsi cv2.cvtColor()
  4. Resize gambar agar sesuai dengan shape layer input pada model menggunakan fungsi cv2.resize().
  5. Konversi gambar menjadi nilai array menggunakan library numpy dengan fungsi numpy.array()
  6. Ubah bentuk array agar menjadi sesuai dengan cara memperluas bentuknya dengan menggunakan fungsi numpy.expand_dims()
  7. Sesuaikan formatnya kedalam format yang dibutuhkan oleh model yang kita gunakan dengan cara mengimport terlebih dahulu dari model library preprocess_input. Kemudian dengan perintah yang sama, masukkan image yang telah diproses samapai point ke 6 sebagai parameter.
  8. Terakhir, dengan menggunakan fungsi model.predict(), hasilkan featrue map dan simpan pada variabel feature_map

Langkah selanjutnya adalah buat model baru dengan input yang sama dengan model VGG16, namun outputnya disesuaikan. Pada tulisan ini, kita hanya mencoba untuk memvisualisasikan feature map dari layer pertama pada model. Maka outputnya kita setting menjadi hanya output pada layer pertama saja. Adapun kodenya sebagai berikut:

model = Model(inputs=model.inputs, outputs=model.layers[1].output)
model.summary()

Setelah kode dijalankan, maka rangkuman model akan menjadi seperti berikut:

Model: "model_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_4 (InputLayer) (None, 224, 224, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
=================================================================
Total params: 1,792
Trainable params: 1,792
Non-trainable params: 0
_________________________________________________________________

Langkah terakhir adalah menampilkan semua feature map yang telah didapat pada plot-plot menggunakan library matplotlib.

size = 8
index = 1
for _ in range(size):
for _ in range(size):
axs = plt.subplot(size,size,index)
axs.set_xticks([])
axs.set_yticks([])

plt.imshow(feature_map[0,:,:,index-1], cmap='gray')
index = index + 1
plt.show()
  1. Isi variabel size dengan value 8, variabel ini akan menjadi ukuran dari plot yang akan ditampilkan. Alasan value dari variabel size adalah 8 karena pada layer pertama, channel dari output feature map berjumlah 64, jadi 8x8=64. Inisialisasi juga variabel index dengan value 1 yang nantinya akan berfungsi sebagai index dari plot.
  2. Looping dengan jumlah sesuai size untuk kolomnya, dan looping kembali sejumlah size untuk barisnya
  3. Tentukan subplot sebagai wadah untuk memvisualisasikan masing-masing feature map dengan menggunakan library matplotlib, atur jumlah baris dan kolomnya serta index dari plotnya. Kemudian simpan pada variabel axs
  4. Hapus list lokasi koordinat sumbu x dan y pada plot ax dengan menggunakan fungsi set_xticks([]) dan set_yticks([]).
  5. Tampilkan filter dengan menggunakan fungsi imshow() dan atur cmap sebagai gray.
  6. Buat variabel index menjadi increment 1 dengan menambahkannya pada setiap perulangan.
  7. Terakhir, tampilkan seluruh plot-plot yang telah diatur dengan menggunakan fungsi show(). Adapun tampilan dari visualisasi feature map akan menjadi seperti berikut:

Dengan memvisualisasikan feature map diharapkan kita dapat lebih memahami bagaimana cara kerja model yang umumnya dikenal sebagai model abstrak hingga model tersebut dapat membuat klasifikasi dari suatu gambar.

Semoga bermanfaat!

Referensi:

[1] Ren, Shaoqing et al. 2017. “Object Detection Networks on Convolutional Feature Maps.” IEEE Transactions on Pattern Analysis and Machine Intelligence 39(7): 1476–81.

[2] Grün, Felix, Christian Rupprecht, Nassir Navab, and Federico Tombari. 2016. “A Taxonomy and Library for Visualizing Learned Features in Convolutional Neural Networks.” 48. http://arxiv.org/abs/1606.07757.

--

--