Mencoba Kinerja Model VGG16

By | May 20, 2024
Print Friendly, PDF & Email
343 Views

VGG16 adalah salah satu arsitektur jaringan saraf tiruan yang sangat terkenal dalam bidang pengolahan citra. Dikembangkan oleh tim peneliti dari Visual Geometry Group (VGG) di Universitas Oxford pada tahun 2014, VGG16 terkenal karena kegunaannya dalam klasifikasi gambar.

Arsitektur VGG16 terdiri dari total 16 lapisan (dari situlah namanya berasal). Ini terdiri dari 13 lapisan konvolusi (convolutional layers) yang diikuti oleh 3 lapisan fully connected (FC) yang menghubungkan setiap fitur yang diekstraksi dari gambar ke lapisan output yang memberikan prediksi kelas. Setiap lapisan konvolusi biasanya diikuti oleh lapisan aktivasi ReLU, yang membantu dalam mempercepat pelatihan dan meningkatkan keakuratan model.

VGG16 cukup sederhana dan mudah dipahami dibandingkan dengan beberapa arsitektur jaringan saraf yang lebih canggih. Namun, keunggulannya terletak pada keberhasilannya dalam menghasilkan fitur-fitur gambar yang berguna untuk tugas-tugas seperti klasifikasi gambar, deteksi objek, dan segmentasi semantik.

Meskipun VGG16 telah digantikan oleh arsitektur yang lebih canggih seperti ResNet, Inception, dan EfficientNet, namun kontribusinya yang signifikan terhadap bidang penglihatan komputer membuatnya tetap relevan dan sering digunakan sebagai dasar dalam pengembangan model yang lebih lanjut.

Model VGG16 dengan PyTorch

Sebenarnya mudah kok membuat model VGG16, mari kita buat menggunakan library pytorch saja.

Kode dibawah ini akan tampil jika kalian sudah login

New User Registration
Really Simple CAPTCHA is not enabled




Enter Captcha Here :

*Required field

Pada model diatas, kalian bisa melihat bahwa out terakhir hanya menggunakan function Linear saja sehingga nanti fungsi loss yang digunakan yaitu nn.CrossEntropyLoss()

See also  StarDist a deep learning based 2D and 3D object detection

Kita bisa hitung berapa jumlah parameternya, mari kita pakai summary

from torchsummary import summary
num_classes   = 10
batch_size     = 4
model  = VGG16(num_classes = num_classes)
summary(model,(3,227,227))

menghasilkan informasi sebagai berikut yaitu sekitar 134 juta parameter

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 227, 227]           1,792
       BatchNorm2d-2         [-1, 64, 227, 227]             128
              ReLU-3         [-1, 64, 227, 227]               0
            Conv2d-4         [-1, 64, 227, 227]          36,928
       BatchNorm2d-5         [-1, 64, 227, 227]             128
              ReLU-6         [-1, 64, 227, 227]               0
         MaxPool2d-7         [-1, 64, 113, 113]               0
            Conv2d-8        [-1, 128, 113, 113]          73,856
       BatchNorm2d-9        [-1, 128, 113, 113]             256
             ReLU-10        [-1, 128, 113, 113]               0
           Conv2d-11        [-1, 128, 113, 113]         147,584
      BatchNorm2d-12        [-1, 128, 113, 113]             256
             ReLU-13        [-1, 128, 113, 113]               0
        MaxPool2d-14          [-1, 128, 56, 56]               0
           Conv2d-15          [-1, 256, 56, 56]         295,168
      BatchNorm2d-16          [-1, 256, 56, 56]             512
             ReLU-17          [-1, 256, 56, 56]               0
           Conv2d-18          [-1, 256, 56, 56]         590,080
      BatchNorm2d-19          [-1, 256, 56, 56]             512
             ReLU-20          [-1, 256, 56, 56]               0
           Conv2d-21          [-1, 256, 56, 56]         590,080
      BatchNorm2d-22          [-1, 256, 56, 56]             512
             ReLU-23          [-1, 256, 56, 56]               0
        MaxPool2d-24          [-1, 256, 28, 28]               0
           Conv2d-25          [-1, 512, 28, 28]       1,180,160
      BatchNorm2d-26          [-1, 512, 28, 28]           1,024
             ReLU-27          [-1, 512, 28, 28]               0
           Conv2d-28          [-1, 512, 28, 28]       2,359,808
      BatchNorm2d-29          [-1, 512, 28, 28]           1,024
             ReLU-30          [-1, 512, 28, 28]               0
           Conv2d-31          [-1, 512, 28, 28]       2,359,808
      BatchNorm2d-32          [-1, 512, 28, 28]           1,024
             ReLU-33          [-1, 512, 28, 28]               0
        MaxPool2d-34          [-1, 512, 14, 14]               0
           Conv2d-35          [-1, 512, 14, 14]       2,359,808
      BatchNorm2d-36          [-1, 512, 14, 14]           1,024
             ReLU-37          [-1, 512, 14, 14]               0
           Conv2d-38          [-1, 512, 14, 14]       2,359,808
      BatchNorm2d-39          [-1, 512, 14, 14]           1,024
             ReLU-40          [-1, 512, 14, 14]               0
           Conv2d-41          [-1, 512, 14, 14]       2,359,808
      BatchNorm2d-42          [-1, 512, 14, 14]           1,024
             ReLU-43          [-1, 512, 14, 14]               0
        MaxPool2d-44            [-1, 512, 7, 7]               0
          Dropout-45                [-1, 25088]               0
           Linear-46                 [-1, 4096]     102,764,544
             ReLU-47                 [-1, 4096]               0
          Dropout-48                 [-1, 4096]               0
           Linear-49                 [-1, 4096]      16,781,312
             ReLU-50                 [-1, 4096]               0
           Linear-51                   [-1, 10]          40,970
================================================================
Total params: 134,309,962
Trainable params: 134,309,962
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.59
Forward/backward pass size (MB): 327.49
Params size (MB): 512.35
Estimated Total Size (MB): 840.44
----------------------------------------------------------------

Visualisasi VGG16 menggunakan tensorboard

Kita bisa menggunakan tensorboard untuk visualisasi modelnya

from torch.utils.tensorboard import SummaryWriter

model  = VGG16(num_classes = num_classes)
inputs  = torch.rand(1,3,227,227)
outs = model(inputs)
writer = SummaryWriter('runs/Vgg16')
writer.add_graph(model, (inputs), verbose=False)
writer.close()

setelah itu via terminal kita panggil tensorboard

tensorboard --logdir=runs

akan tampil pesan sebagai berikut

(base) user@MacBook-Air Kinerja Model VGG16 % tensorboard --logdir=runs
TensorFlow installation not found - running with reduced feature set.

NOTE: Using experimental fast data loading logic. To disable, pass
    "--load_fast=false" and report issues on GitHub. More details:
    https://github.com/tensorflow/tensorboard/issues/4784

Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.16.2 at http://localhost:6006/ (Press CTRL+C to quit)

kita buka saja http://localhost:6006

See also  Tuning Model pada Machine Learning: Meningkatkan Performa dan Akurasi

 

Persiapan dataset

Untuk dataset yang akan kita gunakan, bisa menggunakan MNIST saja serta mengubah ukuran dan channel nya

transform = T.Compose([
    T.transforms.Resize((227,227)),
    T.Grayscale(num_output_channels=3),
    T.ToTensor(),
    T.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
        ])


dataset = datasets.MNIST('data/',
                               train=True,
                               download=True,
                               transform=transform)

kita hanya akan menggunakan 100 record saja karena akan banyak memakan waktu jika ditraining semua serta hanya 4 batch agar RAM nya kuat buat loading dataset nya

batch_size = 4
num_classes = 10

evens = list(range(0,100,1))
trainset_1 = torch.utils.data.Subset(dataset, evens)
dataloader = DataLoader(trainset_1,
                        batch_size = batch_size,
                        shuffle= False)

Setting training

Berikut jenis loss dan fungsi optimasinya yang digunakan

torch.manual_seed(0) #biar nggak random lagi 
device = getdevice()
model = VGG16(num_classes).to(device)
criterion = nn.CrossEntropyLoss() # karena hanya pakai Linear saja
learning_rate = 0.005
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay = 0.005, momentum = 0.9)  

setelah siap, kita akan lakukan training

kode dibawah ini akan tampil jika kalian sudah login

Existing Users Log In




Enter Captcha Here :

   

hasil training sudah mencapai 46 iterasi

loss: 1.803: 100%|██████████████████████████████| 25/25 [03:31<00:00,  8.45s/it]
loss: 1.446: 100%|██████████████████████████████| 25/25 [03:04<00:00,  7.36s/it]
loss: 1.163: 100%|██████████████████████████████| 25/25 [03:03<00:00,  7.35s/it]
loss: 0.973: 100%|██████████████████████████████| 25/25 [03:05<00:00,  7.42s/it]
loss: 1.089: 100%|██████████████████████████████| 25/25 [03:04<00:00,  7.39s/it]
loss: 1.154: 100%|██████████████████████████████| 25/25 [03:03<00:00,  7.34s/it]
loss: 0.961: 100%|██████████████████████████████| 25/25 [03:05<00:00,  7.42s/it]
loss: 1.866: 100%|██████████████████████████████| 25/25 [03:04<00:00,  7.37s/it]
loss: 0.956: 100%|██████████████████████████████| 25/25 [03:15<00:00,  7.81s/it]
loss: 0.664: 100%|██████████████████████████████| 25/25 [03:42<00:00,  8.88s/it]
loss: 1.19:  88%|███████████████████████████▎   | 22/25 [03:23<00:27,  9.25s/it]

 

 

Mari kita coba akurasinya

#lakukan evaluasi
model.eval()
jumlah_benar = 0
jumlah_data = 0
with torch.no_grad():
    for i,batch in enumerate(tqdm(dataloader)):
        images,labels = batch
        images = images.to(device)
        labels = labels.to(device)
        out = model(images)
        prediksi = torch.argmax(out,dim=1)
        n = len(labels)
        benar = (prediksi==labels).sum()
        jumlah_data = jumlah_data + n
        jumlah_benar = jumlah_benar+benar
        #buat nampilkan gambar per batch
acc = (jumlah_benar/jumlah_data)*100
print("\n akurasi acc : ",np.round(acc.item(),decimals=2)," %")

hasil

akurasi acc :  96.0  %

sebagai tambahan, berikut ada beberapa function yang belum dibuat diatas yaitu

import torch
from sys import platform

def getdevice():
    print('Torch', torch.__version__, 'CUDA', torch.version.cuda)
    if platform=='darwin':
        device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
    else:
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    print("running dengan ",device)
    return device

 

See also  Mencoba Menggunakan VPS untuk Deep Learning