Search what you want

Sunday, November 25, 2018

Convolutional Neural Network [pytorch Challenge] #Part3

Pada part ke 3 saya mencoba untuk menuliskan catatan saya saat belajar tentang CNN. Sebelum masuk ke Convolutional Neural Network kita akan coba membandingkan dengan sedikit materi pelajaran sebelumnya, yaitu Multi Layer Perceptron (MLP) yang telah kita bahas di Part 1 dan Part 2  dengan CNN ini.

A. Perbedaan MLP dan CNN
Pada MLP, part sebelumnya:
1. data yang digunakan cukup bagus, clean, dan terpusat
2. gambar angka dari tulisan tangan
3. database MINST
4. hanya menerima vektor sebagai input data
5. hanya menggunakan Fully connected layer

Pada CNN, part ini kita akan belajar:
1. data cukup bervariasi, noise, dan tidak tersusun terpusat
2. gambar objek benda dengan background
3. database ImageNet, CIFAR dll
4. input kernel dapat berupa matriks maupun vektor
5. menggunakan Sparsely connected layer dan Fully connected layer

B. Tahapan Pembuatan Model 

sepertinya hal yang biasa ketika kita ingin membuat sebuah model untuk sebuah kasus, mau ga mau kita harus mengikuti proses-proses ini.

C. Filter untuk deteksi garis
pada part kali ini data yang kita olah merupakan data gambar, dan akan banyak berhubungan dengan karakteristik dari sebuah gambar. Terdapat beberapa definisi-definisi yang ada pengolahan suatu gambar yang harus kita pelajari.

High frequency image: intensitas pencahayaan dari sebuah gambar yang berubah cukup signifikan
Low frequency image: intensitas pencahayaan dari sebuah gambar yang berubah tidak signifikan

frekuensi pencahayaan dari sebuah gambar kita dapat gunakan untuk mengetahui garis yang ada dalam gambar tersebut. Dari salah satu karakteristik ini kita dapat mendeteksi garis dalam sebuah gambar dengan menggunakan sebuah filter. High pass filter digunakan pada gambar yang memiliki High frequency brightness. Untuk itu kita membutuhkan sebuah ata beberapa kernel untuk itu.

Convolution kernels merupakan matiks dari angka-angka yang dapat memodifikasi sebuah gambar.


D. Arsitektur CNN

Arsitektur sederhana dari sebuah CNN dapat kita liat pada gambar diatas.
1. gambar akan diubah menjadi Convolutional Layer.
2. Convolutional layer yang terdiri dari beberapa matriks, banyaknya sebanyak kernel yang digunakan, banyaknya kernel akan disebut depth.
3. Dari Convolutional layer akan menjadi Pooling layer yang size width x height nya di ubah menjadi lebih kecil, agar meringankan komputasi. disisi lain depth dari poolong layer akan menjadi lebih besar.
4. Setelah sepasang proses diatas (Convolutional Layer dan Pooling Layer) kemudian akan diproses ke fully-connected layer yang kemudian akan digunakan untuk prediksi kelas sebuah gambar.


Gambar dibawah ini merupakan 4 kernel yang digunakan untuk membuat Convolutional Layer yang memiliki depth 4.

E. Stride and padding

Stride merupakan jauhnya kernel perpindah pada satu stepnya. Stride ini dapat digunakan untuk meeduksi besarnya width dan height daru sebuah matriks gambar.semakin besar stride maka akan semakin kedih hasil dari proses ini.


Sedangkan padding itu merupakan banyaknya colom atau row yang ditambahkan agar semua area gambar dapat diproses oleh besaran kernel yang telah diberikan.

Lalu bagaimana cara menentukan nilai stride dan padding? mudah saja, pada fungsi nn.MaxPool2d(kernel_size, stride).
1. Jadi untuk down-sample matriks dengan faktor 4 yaitu:
    - nn.MaxPool2d(2, 4)
    - nn.MaxPool2d(4, 4)
    - nn.MaxPool2d(n, 4)
2. Untuk menentukan padding dengan jumlah kernel:
    - kernel 7 = padding-nya adalah 2
    - kernel 3 = padding-nya adalah 1
    - kernel n = padding-nya adalah (n-1)/2  -> Ganjil


F. Pooling
Pooling pada CNN digunakan untuk melakukan reduksi dimensi pada sebuah convolutional layer. reduksi dimensi ini digunakan pada sebuah layer convolutional yang banya untuk menghindari overfitting. Secara umum satu Convolutional Layer memiliki satu pooling layer didepannya.


G. CNN in Pytorch
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
Arguments harus mengikuti argumen dibawah ini:
1. in_channels - Jumlah input (in depth), 3 untuk gambar RGB, untuk contoh.
2. out_channels - Jumlah output channel
3. kernel_size - Jumlah spesifik dari tinggi dan lebar (square) convolutional kernel.

Argumen tambahan yang dapat diatur:
4. stride - The stride of the convolution. If you don't specify anything, stride is set to 1.
5. padding - The border of 0's around an input array. If you don't specify anything, padding is set to 0.
self.pool = nn.MaxPool2d(kernel_size,stride)
Arguments harus mengikuti argumen dibawah ini:
1. kernel_size = Jumlah spesifik dari tinggi dan lebar (square) convolutional kernel.
2. stride = lebar step yang harus diambil

Contoh:
import torch.nn as nn
import torch.nn.functional as F

# define the CNN architecture
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # convolutional layer (sees 32x32x3 image tensor)
        self.conv1 = nn.Conv2d(3, 16, 3, padding=1)
        # convolutional layer (sees 16x16x16 tensor)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        # convolutional layer (sees 8x8x32 tensor)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        # max pooling layer
        self.pool = nn.MaxPool2d(2, 2)
        # linear layer (64 * 4 * 4 -> 500)
        self.fc1 = nn.Linear(64 * 4 * 4, 500)
        # linear layer (500 -> 10)
        self.fc2 = nn.Linear(500, 10)
        # dropout layer (p=0.25)
        self.dropout = nn.Dropout(0.25)

    def forward(self, x):
        # add sequence of convolutional and max pooling layers
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        # flatten image input
        x = x.view(-1, 64 * 4 * 4)
        # add dropout layer
        x = self.dropout(x)
        # add 1st hidden layer, with relu activation function
        x = F.relu(self.fc1(x))
        # add dropout layer
        x = self.dropout(x)
        # add 2nd hidden layer, with relu activation function
        x = self.fc2(x)
        return x

# create a complete CNN
model = Net()
print(model)

G. Data Augmentation
Jika kita hanya memiliki data yang tidak banyak dan hasil akurasi model dari data yang kita miliki tidak memuaskan kita. maka salah satu cara yang dapat kita lakukan yaitu menambah jumlah data train yang kita miliki. Tetapi untuk menambah data yang terlabeli membutuhkan effort yang tidak sedikit, maka dari itu Data Augmentation kita butuhkan.

Dalam kasus disini kita mengolah data gambar, maka dari itu kita dapat mengolah data-data yang ada, misalnya:
1. rotasi
2. translasi
3. scale size

H. Jenis-jenis CNN Arsitektur

(2012) AlexNet

(2014) VGG

(2015) ResNet










No comments:

Post a Comment