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
Contents
Sebenarnya mudah kok membuat model VGG16, mari kita buat menggunakan library pytorch saja.
Kode dibawah ini akan tampil jika kalian sudah login
Pada model diatas, kalian bisa melihat bahwa out terakhir hanya menggunakan function Linear saja sehingga nanti fungsi loss yang digunakan yaitu nn.CrossEntropyLoss()
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
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
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