Pytorch Algoritma Convolutional Neural Networks – CNN
Convolutional Neural Networks, juga dikenal sebagai CNN atau ConvNet, termasuk dalam kategori jaringan saraf tiruan yang digunakan untuk pemrosesan gambar dan visualisasi. Kecerdasan buatan menggunakan pembelajaran mendalam untuk melakukan tugas. Jaringan saraf adalah perangkat keras atau perangkat lunak yang diprogram sebagai neuron di otak manusia. Jaringan saraf tradisional hanya mengambil gambar dengan resolusi yang dikurangi sebagai input. CNN memecahkan masalah itu dengan mengatur neuron mereka sebagai lobus frontal otak manusia. Pre-processing pada CNN sangat sedikit jika dibandingkan dengan algoritma lainnya. Konvolusi, operasi matematika linier, digunakan di CNN. Ini menggunakan konvolusi alih-alih perkalian matriks umum di salah satu lapisannya.
Arsitektur Convolutional Neural Network
Secara umum algoritma CNN sebagai berikut
- Image input layer
- Convolutional layer
- Non-Linearity Layer
- Rectification Layer
- Rectified Linear Units (ReLU)
- Pooling Layer
- Dropout Layer
- Fully Connected Layer
- Output Layer
- Regression Layer
Tulisan ini bersifat serial, kalian bisa pelajari bab-bab berikut
- Pytorch Apa itu Operasi Linear, Bobot, dan Bias pada Algoritma CNN
- Pytorch – Membuat Function Loss
- Pytorch – loss function Cross-entropy loss
- Pytorch – loss function Negative log likelihood loss nn.NLLLoss
- PyTorch – Backward dan Step Optimizer serta membuat MLP
Algoritma Convolutional Neural Network sangat mudah dipahami karena kunci utamanya ada di Conv2d – Secara umum untuk CNN yang simple, saya ambil contoh dari PyTorch https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html
import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = torch.flatten(x, 1) # flatten all dimensions except batch x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x net = Net()
Sebelum membahas mengenai arsitektur, maka hal yang pertama kali yaitu lapisan masukan gambar/layer input berupa gambar yang telah dinormalisasi dan sudah dikonvert ke Tensor.
import torch import torchvision import torchvision.transforms as transforms import os from PIL import Image from matplotlib import pyplot as plt import numpy as np #membaca gambar img = Image.open(os.path.join('D:/matang.png')).convert("RGB") #normalisasi transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) #penerapan transform img2 = transform(img) npimg = img2.numpy() plt.figure() plt.subplot(1,2,1), plt.imshow(img),plt.title('gambar mentah') plt.subplot(1,2,2), plt.imshow(np.transpose(npimg, (1, 2, 0))), plt.title('normalisasi') plt.show()
Hasilnya sebagai berikut untuk normalisasi gambar
Pada gambar diatas mempunyai dimensi sebagai berikut
img2.shape
Out[589]: torch.Size([3, 421, 446])
tentu ukuran tersebut tidak cocok dengan model Net() diatas, karena pada model Net() diatas itu menggunakan ukuran 32×32. Kita resize saja agar pas (kalian bisa koq menggunakan beragam ukuran tapi harus ngerti cara menggunakan function Conv2d agar output dihasilkan nantinya pas)
transform2 = transforms.Compose( [ transforms.ToTensor(), transforms.Resize((32, 32)), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), ] ) img3 = transform2(img)
Ukuran tensor im3 yaitu sebagai berikut
img3.shape Out[596]: torch.Size([3, 32, 32])
Kita harus tahu bahwa untuk memasukan arsitektur jaringan CNN, membutuhkan urutan sebagai berikut
- ukuran batch/jumlah record
- ukuran channel
- ukuran width
- ukuran height
sesuai informasi diatas didapatkan bahwa ukuran channel = 3 serta dimensi width x height = 32×32, untuk itu kita butuh ukuran batch, mengingat gambar diatas hanya 1 maka ukuran batch nya yaitu 1.
img4=img3.unsqueeze(0)
sehingga ukuran img4 menjadi berikut
img4.shape Out[599]: torch.Size([1, 3, 32, 32])
Sekarang kita panggil CNN dengan perintah
net = Net() hasil = net(img4) print(hasil) print(hasil.shape)
hasil nya yaitu
tensor([[ 0.0649, -0.0778, -0.0776, -0.0888, -0.0484, -0.0473, -0.0386, 0.0595, 0.0527, -0.0103]], grad_fn=<AddmmBackward>)
ada 10 array sesuai dengan output dari
self.fc3 = nn.Linear(84, 10)
yang memang model https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html untuk klasifikasi 10 kelas objek yaitu
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
Kalian bisa melihat dari ukuran gambar 3 channel x 32 width x 32 height akan menghasilkan output 1 baris x 10 kolom dalam bentuk tensor. Untuk mengetahui prediksi, ya diambil dari nilai maksimalnya
_, predicted = torch.max(hasil, 1)
untuk hasil predicted=6 atau kelas no 5
Arsitektur Convolutional Neural Network yang lain
Di bawah ini adalah arsitektur jaringan saraf convolutional:
- LeNet: LeNet diperkenalkan untuk Optical dan Character Recognition in Documents pada tahun 1998. LeNet kecil dan sempurna untuk dijalankan pada CPU.
- AlexNet: AlexNet dikembangkan pada tahun 2012. Arsitektur ini mempopulerkan CNN dalam Computer vision.
- ZF Net: ZF Net dikembangkan pada tahun 2013, yang merupakan versi modifikasi dari AlexNet.
- GoogLeNet: Arsitektur ini dikembangkan pada tahun 2014.
- VGG Net: Ini merupakan peningkatan dari ZFNet dan selanjutnya dari AlexNet.
- ResNet: Arsitektur Jaringan Residual dikembangkan pada tahun 2015.